For redeclarations of struct in C23, if one has an alignment attribute
that makes the alignment different, we later get an ICE in verify_types.
This patches disallows such redeclarations by declaring such types to
be different.
PR c/114727
gcc/c/
* c-typeck.cc (tagged_types_tu_compatible): Add test.
gcc/testsuite/
* gcc.dg/pr114727.c: New test.
!= TYPE_REVERSE_STORAGE_ORDER (t2)))
return false;
+ if (TYPE_USER_ALIGN (t1) != TYPE_USER_ALIGN (t2))
+ data->different_types_p = true;
+
/* For types already being looked at in some active
invocation of this function, assume compatibility.
The cache is built as a linked list on the stack
--- /dev/null
+/* { dg-do compile }
+ * { dg-options "-std=c23 -g" } */
+
+#define Y [[gnu::aligned(128)]]
+extern struct Y foo { int x; } x;
+struct foo { int x; }; /* { dg-error "redefinition" } */