re PR c/5597 ([regression from 2.95.3] Initialization of flexible char array member...
authorEric Botcazou <ebotcazou@multimania.com>
Fri, 22 Mar 2002 02:03:46 +0000 (18:03 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Fri, 22 Mar 2002 02:03:46 +0000 (18:03 -0800)
        PR c/5597
        * c-typeck.c (process_init_element): Flag non-static
        initialization of a flexible array member as illegal.

From-SVN: r51156

gcc/ChangeLog
gcc/c-typeck.c
gcc/testsuite/gcc.dg/array-6.c [new file with mode: 0644]

index 9939009e608626c63a247414b9a0450dac0c01b0..96c4fcad84350b688a291f6a9d3fbfbd00bc996f 100644 (file)
@@ -1,3 +1,9 @@
+2002-03-21  Eric Botcazou <ebotcazou@multimania.com>
+
+       PR c/5597
+       * c-typeck.c (process_init_element): Flag non-static
+       initialization of a flexible array member as illegal.
+
 2002-03-22  Alan Modra  <amodra@bigpond.net.au>
 
        * config/rs6000/t-linux64: New.
 
 2002-03-21  Aldy Hernandez  <aldyh@redhat.com>
 
-        * langhooks.c (lhd_tree_inlining_cannot_inline_tree_fn): Check
-        flag_really_no_inline instead of optimize == 0.
+       * langhooks.c (lhd_tree_inlining_cannot_inline_tree_fn): Check
+       flag_really_no_inline instead of optimize == 0.
 
-        * c-objc-common.c (c_cannot_inline_tree_fn): Same.
+       * c-objc-common.c (c_cannot_inline_tree_fn): Same.
 
-        * cp/tree.c (cp_cannot_inline_tree_fn): Same.
+       * cp/tree.c (cp_cannot_inline_tree_fn): Same.
 
-        * flags.h (flag_really_no_inline): New.
+       * flags.h (flag_really_no_inline): New.
 
-        * c-common.c (c_common_post_options): Initialzie
-        flag_really_no_inline.
+       * c-common.c (c_common_post_options): Initialzie
+       flag_really_no_inline.
 
-        * toplev.c (flag_really_no_inline): New.
+       * toplev.c (flag_really_no_inline): New.
 
 2002-03-21  Jakub Jelinek  <jakub@redhat.com>
 
index 1772557449c4ffb400faaa3a1bb27ab25b82ebfa..297b0f9e188d4952590fcf823b00219b7b4dc18f 100644 (file)
@@ -6537,6 +6537,16 @@ process_init_element (value)
            fieldtype = TYPE_MAIN_VARIANT (fieldtype);
          fieldcode = TREE_CODE (fieldtype);
 
+         /* Error for non-static initialization of a flexible array member.  */
+         if (fieldcode == ARRAY_TYPE
+             && !require_constant_value
+             && TYPE_SIZE (fieldtype) == NULL_TREE
+             && TREE_CHAIN (constructor_fields) == NULL_TREE)
+           {
+             error_init ("non-static initialization of a flexible array member");
+             break;
+           }
+
          /* Accept a string constant to initialize a subarray.  */
          if (value != 0
              && fieldcode == ARRAY_TYPE
diff --git a/gcc/testsuite/gcc.dg/array-6.c b/gcc/testsuite/gcc.dg/array-6.c
new file mode 100644 (file)
index 0000000..6ef6462
--- /dev/null
@@ -0,0 +1,18 @@
+/* PR c/5597 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+/* Verify that GCC forbids non-static initialization of
+   flexible array members. */
+
+struct str { int len; char s[]; };
+
+struct str a = { 2, "a" };
+
+void foo()
+{
+  static struct str b = { 2, "b" };
+  struct str c = { 2, "c" }; /* { dg-error "(non-static)|(near initialization)" } */
+  struct str d = (struct str) { 2, "d" }; /* { dg-error "(non-static)|(near initialization)" } */
+  struct str e = (struct str) { d.len, "e" }; /* { dg-error "(non-static)|(initialization)" } */
+}