For strict-alignment targets we can end up with BLKmode single-element array types when the element type is unaligned. This confuses type checking since the canonical type would have an aligned element type and a non-BLKmode mode. The following simply ignores the mode we assign to array types for this purpose, like we already do for record and union types.
Bootstrap and regtest running on x86_64-unknown-linux-gnu. PR middle-end/97323 * tree.cc (gimple_canonical_types_compatible_p): Ignore TYPE_MODE also for ARRAY_TYPE. (verify_type): Likewise. * gcc.dg/pr97323.c: New testcase. --- gcc/testsuite/gcc.dg/pr97323.c | 5 +++++ gcc/tree.cc | 2 ++ 2 files changed, 7 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/pr97323.c diff --git a/gcc/testsuite/gcc.dg/pr97323.c b/gcc/testsuite/gcc.dg/pr97323.c new file mode 100644 index 00000000000..8845a34fa15 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr97323.c @@ -0,0 +1,5 @@ +/* { dg-do compile } */ +/* { dg-options "-g" } */ + +typedef int a __attribute__((aligned(2))); +a b[1]; diff --git a/gcc/tree.cc b/gcc/tree.cc index 0743ed71c78..4e855b4b2d3 100644 --- a/gcc/tree.cc +++ b/gcc/tree.cc @@ -13982,6 +13982,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; @@ -14313,6 +14314,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"); -- 2.43.0