c-decl.c (build_compound_literal): Defer compound literal decls until until file...
authorJakub Jelinek <jakub@redhat.com>
Mon, 22 Jul 2002 10:11:16 +0000 (12:11 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 22 Jul 2002 10:11:16 +0000 (12:11 +0200)
* c-decl.c (build_compound_literal): Defer compound literal decls
until until file end to emit them only if they are actually used.

* gcc.dg/gnu89-init-2.c: New test.

From-SVN: r55645

gcc/ChangeLog
gcc/c-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/gnu89-init-2.c [new file with mode: 0644]

index cfd9e50fabe01069f68f6f0a22aa55b80030d5dc..44bf4e18e02f0803da9cf9a1c39ee62ca1d1b860 100644 (file)
@@ -1,3 +1,8 @@
+2002-07-22  Jakub Jelinek  <jakub@redhat.com>
+
+       * c-decl.c (build_compound_literal): Defer compound literal decls
+       until until file end to emit them only if they are actually used.
+
 2002-07-21  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * ra-build.c (check_conflict_numbers): Hide unused function.
index c6e592ac5ffa1e65eb40b12ac7fc7885da7585a6..57af611011f9ab642d6178329dadbaac079f9994 100644 (file)
@@ -3669,12 +3669,18 @@ build_compound_literal (type, init)
   if (TREE_STATIC (decl))
     {
       /* This decl needs a name for the assembler output.  We also need
-        a unique suffix to be added to the name, for which DECL_CONTEXT
-        must be set.  */
-      DECL_NAME (decl) = get_identifier ("__compound_literal");
-      DECL_CONTEXT (decl) = complit;
+        a unique suffix to be added to the name.  */
+      char *name;
+      extern int var_labelno;
+
+      ASM_FORMAT_PRIVATE_NAME (name, "__compound_literal", var_labelno);
+      var_labelno++;
+      DECL_NAME (decl) = get_identifier (name);
+      DECL_DEFER_OUTPUT (decl) = 1;
+      DECL_COMDAT (decl) = 1;
+      DECL_ARTIFICIAL (decl) = 1;
+      pushdecl (decl);
       rest_of_decl_compilation (decl, NULL, 1, 0);
-      DECL_CONTEXT (decl) = NULL_TREE;
     }
 
   return complit;
index bf8976fdaf97f896a1d51df0f44763d73ff0acea..37d9e47c2b20113c58b665bbe6e2840feaaea084 100644 (file)
@@ -1,3 +1,7 @@
+2002-07-22  Jakub Jelinek  <jakub@redhat.com>
+
+       * gcc.dg/gnu89-init-2.c: New test.
+
 2002-07-21  Gabriel Dos Reis  <gdr@nerim.net>
 
        * gcc.dg/c90-arraydecl-1.c: Change C89 too C90.
diff --git a/gcc/testsuite/gcc.dg/gnu89-init-2.c b/gcc/testsuite/gcc.dg/gnu89-init-2.c
new file mode 100644 (file)
index 0000000..ce966ec
--- /dev/null
@@ -0,0 +1,25 @@
+/* Test whether __compound_literal.* objects are not emitted unless
+   they are actually needed.  */
+/* Origin: Jakub Jelinek <jakub@redhat.com> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu89 -O2" } */
+/* { dg-final { scan-assembler-not "__compound_literal" } } */
+
+struct A { int i; int j; int k[4]; };
+struct B { };
+struct C { int i; };
+struct D { int i; struct C j; };
+
+struct A a = (struct A) { .j = 6, .k[2] = 12 };
+struct B b = (struct B) { };
+int c[] = (int []) { [2] = 6, 7, 8 };
+int d[] = (int [3]) { 1 };
+int e[2] = (int []) { 1, 2 };
+int f[2] = (int [2]) { 1 };
+struct C g[3] = { [2] = (struct C) { 13 }, [1] = (const struct C) { 12 } };
+struct D h = { .j = (struct C) { 15 }, .i = 14 };
+struct D i[2] = { [1].j = (const struct C) { 17 },
+                 [0] = { 0, (struct C) { 16 } } };
+static const int *j = 1 ? (const int *) 0 : & (const int) { 26 };
+int k = (int) sizeof ((int [6]) { 1, 2, 3, 4, 5, 6 }) + 4;
+int l = (int) sizeof ((struct C) { 16 });