re PR c/11527 (If an array "designated intializer" in a struct causes a segv.)
authorRichard Henderson <rth@redhat.com>
Fri, 26 Mar 2004 00:46:53 +0000 (16:46 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Fri, 26 Mar 2004 00:46:53 +0000 (16:46 -0800)
        PR 11527
        * c-typeck.c (pop_init_level): Emit pending init elements earlier
        rather than later.
* gcc.dg/gnu89-init-3.c: New.

From-SVN: r79978

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

index c83ca7cf0e2e897c366c48da72879582b2e6c5f6..c06551f69f9e5d0cf8174fd8e3efd559154f0845 100644 (file)
@@ -1,3 +1,9 @@
+2004-03-25  Richard Henderson  <rth@redhat.com>
+
+       PR 11527
+        * c-typeck.c (pop_init_level): Emit pending init elements earlier
+        rather than later.
+
 2004-03-25  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * builtins.c (fold_builtin): Fix error in last change.
index 2e57ba7ccebbba2f64438e44504bdd0cbadee651..2a40258f57bb1c1ce5185fbce62ccae277513382 100644 (file)
@@ -4655,6 +4655,10 @@ pop_init_level (int implicit)
        abort ();
     }
 
+  /* Now output all pending elements.  */
+  constructor_incremental = 1;
+  output_pending_init_elements (1);
+
   p = constructor_stack;
 
   /* Error for initializing a flexible array member, or a zero-length
@@ -4709,10 +4713,6 @@ pop_init_level (int implicit)
          }
     }
 
-  /* Now output all pending elements.  */
-  constructor_incremental = 1;
-  output_pending_init_elements (1);
-
   /* Pad out the end of the structure.  */
   if (p->replacement_value)
     /* If this closes a superfluous brace pair,
diff --git a/gcc/testsuite/gcc.dg/gnu89-init-3.c b/gcc/testsuite/gcc.dg/gnu89-init-3.c
new file mode 100644 (file)
index 0000000..bd4283e
--- /dev/null
@@ -0,0 +1,18 @@
+/* PR 11527 */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu89" } */
+
+typedef struct smrdd_memory_blocks_s
+{
+  int blocks;
+  int block[];
+} smrdd_memory_blocks_t;
+
+const smrdd_memory_blocks_t smrdd_memory_blocks =
+{
+  3,
+  {
+    [5] = 5,
+    [1] = 2,
+  }
+};