The odd thing is we have <array_type 0x7ffff6665888 type <integer_type 0x7ffff66655e8 a SI size <integer_cst 0x7ffff68120a8 constant 32> unit-size <integer_cst 0x7ffff68120c0 constant 4> user align:16 warn_if_not_align:0 symtab:-161040432 alias-set -1 canonical-type 0x7ffff68165e8 precision:32 min <integer_cst 0x7ffff68122e8 -2147483648> max <integer_cst 0x7ffff6812300 2147483647>> no-force-blk BLK size <integer_cst 0x7ffff68120a8 32> unit-size <integer_cst 0x7ffff68120c0 4> user align:16 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7ffff6665930 domain <integer_type 0x7ffff66657e0
so the array type has alignment 2 and BLKmode but the component type has SImode and alignment 2. This is done by SET_TYPE_MODE (type, mode_for_array (TREE_TYPE (type), TYPE_SIZE (type))); <- sets SImode if (TYPE_MODE (type) != BLKmode && STRICT_ALIGNMENT && TYPE_ALIGN (type) < BIGGEST_ALIGNMENT && TYPE_ALIGN (type) < GET_MODE_ALIGNMENT (TYPE_MODE (type))) { TYPE_NO_FORCE_BLK (type) = 1; SET_TYPE_MODE (type, BLKmode); now, you could argue having both types have the same TYPE_CANONICAL isn't needed. You don't need it for alias compatibility since that's keyed off the element type of arrays only. Likewise for value assignments between array types. That said, a possibility would be to simply declare having this type combination with a mode mismatch OK, at least for aggregate types where modes historically behave a bit "odd". So something like the following (we now exempt record-or-union types for mode processing already) diff --git a/gcc/tree.cc b/gcc/tree.cc index eab40008e8b..d30ccf7cb7f 100644 --- a/gcc/tree.cc +++ b/gcc/tree.cc @@ -13924,6 +13924,7 @@ gimple_canonical_types_compatible_p (const_tree t1, const_tree t2, flexible array members, we allow mismatching modes for structures or unions. */ if (!RECORD_OR_UNION_TYPE_P (t1) + && TREE_CODE (t1) != ARRAY_TYPE && TYPE_MODE (t1) != TYPE_MODE (t2)) return false; @@ -14255,6 +14256,7 @@ verify_type (const_tree t) flexible array members. */ && !RECORD_OR_UNION_TYPE_P (t) && !RECORD_OR_UNION_TYPE_P (TYPE_CANONICAL (t)) + && TREE_CODE (t) != ARRAY_TYPE && TYPE_MODE (t) != TYPE_MODE (TYPE_CANONICAL (t))) { error ("%<TYPE_MODE%> of %<TYPE_CANONICAL%> is not compatible"); -- You received this bug notification because you are a member of Ubuntu Bugs, which is subscribed to Ubuntu. https://bugs.launchpad.net/bugs/1890435 Title: gcc-10 breaks on armhf (flaky): internal compiler error: Segmentation fault To manage notifications about this bug go to: https://bugs.launchpad.net/gcc/+bug/1890435/+subscriptions -- ubuntu-bugs mailing list ubuntu-bugs@lists.ubuntu.com https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs