c-decl.c (pushdecl): Only put decls which finish_struct will do something about onto incomplete chain.

* c-decl.c (pushdecl): Only put decls which finish_struct will do
	something about onto incomplete chain.
	(finish_struct): If not removing type from incomplete
	list, update prev.

	* gcc.dg/20030815-1.c: New test.

From-SVN: r70752
This commit is contained in:
Jakub Jelinek 2003-08-24 00:18:54 +02:00 committed by Jakub Jelinek
parent ebe75517d4
commit 61c234ce87
4 changed files with 47 additions and 3 deletions

View File

@ -1,3 +1,10 @@
2003-08-23 Jakub Jelinek <jakub@redhat.com>
* c-decl.c (pushdecl): Only put decls which finish_struct will do
something about onto incomplete chain.
(finish_struct): If not removing type from incomplete
list, update prev.
Wed Aug 20 12:08:55 CEST 2003 Jan Hubicka <jh@suse.cz>
PR target/11369

View File

@ -1760,8 +1760,10 @@ pushdecl (tree x)
while (TREE_CODE (element) == ARRAY_TYPE)
element = TREE_TYPE (element);
if (TREE_CODE (element) == RECORD_TYPE
|| TREE_CODE (element) == UNION_TYPE)
if ((TREE_CODE (element) == RECORD_TYPE
|| TREE_CODE (element) == UNION_TYPE)
&& (TREE_CODE (x) != TYPE_DECL
|| TREE_CODE (TREE_TYPE (x)) == ARRAY_TYPE))
scope->incomplete = tree_cons (NULL_TREE, x, scope->incomplete);
}
}
@ -5154,7 +5156,8 @@ finish_struct (tree t, tree fieldlist, tree attributes)
&& TREE_CODE (decl) != TYPE_DECL)
{
layout_decl (decl, 0);
/* This is a no-op in c-lang.c or something real in objc-act.c. */
/* This is a no-op in c-lang.c or something real in
objc-act.c. */
if (c_dialect_objc ())
objc_check_decl (decl);
rest_of_decl_compilation (decl, NULL, toplevel, 0);
@ -5190,7 +5193,11 @@ finish_struct (tree t, tree fieldlist, tree attributes)
else
current_scope->incomplete = TREE_CHAIN (x);
}
else
prev = x;
}
else
prev = x;
}
}

View File

@ -1,3 +1,7 @@
2003-08-23 Jakub Jelinek <jakub@redhat.com>
* gcc.dg/20030815-1.c: New test.
2003-08-23 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
PR c++/3765

View File

@ -0,0 +1,26 @@
/* Test completion of incomplete types.
There used to be a bug where some types from incomplete
list were accidentally lost. */
/* { dg-do compile } */
/* { dg-options "" } */
typedef struct a A[1];
typedef struct b B[1];
typedef struct c C[1];
typedef struct d D[1];
typedef struct a E;
typedef struct b F;
typedef struct c G;
typedef struct d H;
struct a { int a; };
struct c { int c; };
struct d { int d; };
struct b { int b; };
int sa = sizeof (A);
int sb = sizeof (B);
int sc = sizeof (C);
int sd = sizeof (D);
int se = sizeof (E);
int sf = sizeof (F);
int sg = sizeof (G);
int sh = sizeof (H);