diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/c-typeck.c | 19 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/20030109-1.c | 20 |
4 files changed, 43 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index efdc0b4..cc6771b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2003-01-09 Eric Botcazou <ebotcazou@libertysurf.fr> + + 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 <ccorn@cs.tu-berlin.de> * Makefile.in (ORDINARY_FLAGS_TO_PASS): Also pass DESTDIR. diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 308d050..c5b4ecb 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 527d2af..2582c71 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2003-01-09 Eric Botcazou <ebotcazou@libertysurf.fr> + + * gcc.c-torture/execute/20030109-1.c: New test. + 2003-01-08 Larin Hennessey <larin@science.oregonstate.edu> * 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 0000000..1bea931 --- /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; +} |