]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c-decl.c (pushdecl): Only put decls which finish_struct will do something about onto...
authorJakub Jelinek <jakub@redhat.com>
Sat, 23 Aug 2003 22:18:54 +0000 (00:18 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sat, 23 Aug 2003 22:18:54 +0000 (00:18 +0200)
* 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

gcc/ChangeLog
gcc/c-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/20030815-1.c [new file with mode: 0644]

index f329133f142aa198f3d64f069081f1c271d920b4..b793413b428d4e0900d7eda0a118f0b3ac0953b7 100644 (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
index de4b4433ba97f6e1dd58e4b015de0636b42fb845..721946ec6c8ac889c7934744600ac18aaee580f3 100644 (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;
        }
     }
 
index 0432dafa6b538362398c03bf3109027b6a8496b2..bfcab555256c4e1eb69fdb2a1b8fbe41f9f1e7ab 100644 (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
diff --git a/gcc/testsuite/gcc.dg/20030815-1.c b/gcc/testsuite/gcc.dg/20030815-1.c
new file mode 100644 (file)
index 0000000..fe1e7b4
--- /dev/null
@@ -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);