]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c: Fix ICE in error recovery when checking struct compatibility [PR118061]
authorMartin Uecker <uecker@tugraz.at>
Sat, 1 Mar 2025 16:21:25 +0000 (17:21 +0100)
committerMartin Uecker <uecker@gcc.gnu.org>
Wed, 19 Mar 2025 07:50:44 +0000 (08:50 +0100)
Return early when comparing two structures for compatibility
and the type of a member is erroneous.

PR c/118061

gcc/c/ChangeLog:
* c-typeck.cc (tagged_types_tu_compatible_p): Handle
errors in types of struct members.

gcc/testsuite/ChangeLog:
* gcc.dg/pr118061.c: New test.

gcc/c/c-typeck.cc
gcc/testsuite/gcc.dg/pr118061.c [new file with mode: 0644]

index 11fa98d86ee8d6fd9d16390f056f31f94abbad4d..1a39cbb20090d922f6f71de2c914694aa2fb0473 100644 (file)
@@ -1933,6 +1933,9 @@ tagged_types_tu_compatible_p (const_tree t1, const_tree t2,
                ft2 = DECL_BIT_FIELD_TYPE (s2);
              }
 
+           if (TREE_CODE (ft1) == ERROR_MARK || TREE_CODE (ft2) == ERROR_MARK)
+             return false;
+
            data->anon_field = !DECL_NAME (s1);
            data->pointedto = false;
 
diff --git a/gcc/testsuite/gcc.dg/pr118061.c b/gcc/testsuite/gcc.dg/pr118061.c
new file mode 100644 (file)
index 0000000..6efc94d
--- /dev/null
@@ -0,0 +1,8 @@
+/* { dg-do "compile" } */
+/* { dg-options "-std=gnu23" } */
+
+int main()
+{
+    struct { int x[1++]; } x;  /* { dg-error "lvalue required as increment operand" } */
+    struct { int x[1++]; } y;  /* { dg-error "lvalue required as increment operand" } */
+}