]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
middle-end/97323 - TYPE_CANONICAL vs. ARRAY_TYPE modes
authorRichard Biener <rguenther@suse.de>
Tue, 4 Mar 2025 15:13:09 +0000 (16:13 +0100)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 5 Mar 2025 10:05:38 +0000 (11:05 +0100)
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.

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 [new file with mode: 0644]
gcc/tree.cc

diff --git a/gcc/testsuite/gcc.dg/pr97323.c b/gcc/testsuite/gcc.dg/pr97323.c
new file mode 100644 (file)
index 0000000..8845a34
--- /dev/null
@@ -0,0 +1,5 @@
+/* { dg-do compile } */
+/* { dg-options "-g" } */
+
+typedef int a __attribute__((aligned(2)));
+a b[1];
index 0743ed71c789abcc85c1f381e0584d2b7402126b..4e855b4b2d3347e2a54c526368950634df4e097c 100644 (file)
@@ -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");