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

Reply via email to