From: Eric Botcazou Date: Thu, 9 Jan 2003 09:18:52 +0000 (+0100) Subject: re PR c/8032 (GCC >= 3.0 incorrectly initializes static structs in the presence of... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=bbb818c65a054d8b6f376877946df369556a14a7;p=gcc.git re PR c/8032 (GCC >= 3.0 incorrectly initializes static structs in the presence of flexible arrays) PR c/8032 * c-typeck.c (process_init_element) [RECORD_TYPE]: For an empty element, do not advance the pointer to unfilled fields if there are pending initializers. From-SVN: r61092 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index efdc0b46a47..cc6771beeee 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2003-01-09 Eric Botcazou + + PR c/8032 + * c-typeck.c (process_init_element) [RECORD_TYPE]: For + an empty element, do not advance the pointer to unfilled + fields if there are pending initializers. + 2003-01-09 Christian Cornelssen * Makefile.in (ORDINARY_FLAGS_TO_PASS): Also pass DESTDIR. diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 308d0502006..c5b4ecbf9d3 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -6609,13 +6609,18 @@ process_init_element (value) bit_position (constructor_fields), DECL_SIZE (constructor_fields)); - constructor_unfilled_fields = TREE_CHAIN (constructor_fields); - /* Skip any nameless bit fields. */ - while (constructor_unfilled_fields != 0 - && DECL_C_BIT_FIELD (constructor_unfilled_fields) - && DECL_NAME (constructor_unfilled_fields) == 0) - constructor_unfilled_fields = - TREE_CHAIN (constructor_unfilled_fields); + /* If the current field was the first one not yet written out, + it isn't now, so update. */ + if (constructor_unfilled_fields == constructor_fields) + { + constructor_unfilled_fields = TREE_CHAIN (constructor_fields); + /* Skip any nameless bit fields. */ + while (constructor_unfilled_fields != 0 + && DECL_C_BIT_FIELD (constructor_unfilled_fields) + && DECL_NAME (constructor_unfilled_fields) == 0) + constructor_unfilled_fields = + TREE_CHAIN (constructor_unfilled_fields); + } } constructor_fields = TREE_CHAIN (constructor_fields); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 527d2afbada..2582c719266 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2003-01-09 Eric Botcazou + + * gcc.c-torture/execute/20030109-1.c: New test. + 2003-01-08 Larin Hennessey * g++.old-deja/g++.mike/dyncast1.C: Remove reference to AMD A29K diff --git a/gcc/testsuite/gcc.c-torture/execute/20030109-1.c b/gcc/testsuite/gcc.c-torture/execute/20030109-1.c new file mode 100644 index 00000000000..1bea931f64c --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20030109-1.c @@ -0,0 +1,20 @@ +/* PR c/8032 */ +/* Verify that an empty initializer inside a partial + parent initializer doesn't confuse GCC. */ + +struct X +{ + int a; + int b; + int z[]; +}; + +struct X x = { .b = 40, .z = {} }; + +int main () +{ + if (x.b != 40) + abort (); + + return 0; +}