Fix ICE with -g and -std=c23 related to incomplete types [PR114361]

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.
This commit is contained in:
Martin Uecker 2024-03-28 19:15:40 +01:00
parent e945d322fc
commit 871bb5ad2d
4 changed files with 39 additions and 0 deletions

View 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.

View File

@ -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; };

View File

@ -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;

View File

@ -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; };
}