re PR c/5597 ([regression from 2.95.3] Initialization of flexible char array member segfaults)

PR c/5597
        * c-typeck.c (process_init_element): Flag non-static
        initialization of a flexible array member as illegal.

From-SVN: r51155
This commit is contained in:
Eric Botcazou 2002-03-22 01:53:41 +00:00 committed by Richard Henderson
parent 8b02caa12d
commit 9020c59a43
3 changed files with 34 additions and 0 deletions

View 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.

View File

@ -6599,6 +6599,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

View File

@ -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)" } */
}