]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix ICE with -g and -std=c23 related to incomplete types [PR114361]
authorMartin Uecker <uecker@tugraz.at>
Thu, 28 Mar 2024 18:15:40 +0000 (19:15 +0100)
committerMartin Uecker <uecker@tugraz.at>
Tue, 2 Apr 2024 22:09:36 +0000 (00:09 +0200)
We did not copy TYPE_CANONICAL to the incomplete variants when
completing a structure.

PR c/114361

gcc/c/
* c-decl.cc (finish_struct): Set TYPE_CANONICAL when completing
strucute types.

gcc/testsuite/
* gcc.dg/pr114361.c: New test.
* gcc.dg/c23-tag-incomplete-1.c: New test.
* gcc.dg/c23-tag-incomplete-2.c: New test.

gcc/c/c-decl.cc
gcc/testsuite/gcc.dg/c23-tag-incomplete-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/c23-tag-incomplete-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr114361.c [new file with mode: 0644]

index c747abe9f4effdf12402f6c730b208714e0434bb..f2083b9d96fb1b5393c3d0e3b7c6e4a6b88ba1f1 100644 (file)
@@ -9722,6 +9722,7 @@ finish_struct (location_t loc, tree t, tree fieldlist, tree attributes,
       C_TYPE_VARIABLE_SIZE (x) = C_TYPE_VARIABLE_SIZE (t);
       C_TYPE_VARIABLY_MODIFIED (x) = C_TYPE_VARIABLY_MODIFIED (t);
       C_TYPE_INCOMPLETE_VARS (x) = NULL_TREE;
+      TYPE_CANONICAL (x) = TYPE_CANONICAL (t);
     }
 
   /* Update type location to the one of the definition, instead of e.g.
diff --git a/gcc/testsuite/gcc.dg/c23-tag-incomplete-1.c b/gcc/testsuite/gcc.dg/c23-tag-incomplete-1.c
new file mode 100644 (file)
index 0000000..82d6525
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile }
+ * { dg-options "-std=c23 -g" } */
+
+struct a;
+typedef struct a b;
+
+void g() {
+    struct a { b* x; };
+}
+
+struct a { b* x; };
+
+
+
diff --git a/gcc/testsuite/gcc.dg/c23-tag-incomplete-2.c b/gcc/testsuite/gcc.dg/c23-tag-incomplete-2.c
new file mode 100644 (file)
index 0000000..bc47a04
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile }
+ * { dg-options "-std=c23 -g" } */
+
+struct a;
+typedef struct a b;
+
+void f() {
+       extern struct a { b* x; } t;
+}
+
+extern struct a { b* x; } t;
+
+
diff --git a/gcc/testsuite/gcc.dg/pr114361.c b/gcc/testsuite/gcc.dg/pr114361.c
new file mode 100644 (file)
index 0000000..0f3feb5
--- /dev/null
@@ -0,0 +1,11 @@
+/* PR c/114361 */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu23 -g" } */
+
+void f()
+{
+    typedef struct foo bar;
+    typedef __typeof( ({ (struct foo { bar *x; }){ }; }) ) wuz;
+    struct foo { wuz *x; };
+}
+