Skip to content

Commit

Permalink
Fix ICE with -g and -std=c23 related to incomplete types [PR114361]
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
uecker committed Apr 2, 2024
1 parent e945d32 commit 871bb5a
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 0 deletions.
1 change: 1 addition & 0 deletions gcc/c/c-decl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
14 changes: 14 additions & 0 deletions gcc/testsuite/gcc.dg/c23-tag-incomplete-1.c
Original file line number Diff line number Diff line change
@@ -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; };



13 changes: 13 additions & 0 deletions gcc/testsuite/gcc.dg/c23-tag-incomplete-2.c
Original file line number Diff line number Diff line change
@@ -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;


11 changes: 11 additions & 0 deletions gcc/testsuite/gcc.dg/pr114361.c
Original file line number Diff line number Diff line change
@@ -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; };
}

0 comments on commit 871bb5a

Please sign in to comment.