diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c-typeck.c | 32 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/init-excess-1.c | 48 |
4 files changed, 79 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 82db934..d32b69e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-06-04 Joseph S. Myers <joseph@codesourcery.com> + + PR c/21873 + * c-typeck.c (push_init_level): Don't pop levels without braces if + implicit == 1. + 2005-06-03 Sebastian Pop <pop@cri.ensmp.fr> * tree-data-ref.c (compute_self_dependence): New function. diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 694eb69..9d41433 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -4844,19 +4844,27 @@ push_init_level (int implicit) tree value = NULL_TREE; /* If we've exhausted any levels that didn't have braces, - pop them now. */ - while (constructor_stack->implicit) + pop them now. If implicit == 1, this will have been done in + process_init_element; do not repeat it here because in the case + of excess initializers for an empty aggregate this leads to an + infinite cycle of popping a level and immediately recreating + it. */ + if (implicit != 1) { - if ((TREE_CODE (constructor_type) == RECORD_TYPE - || TREE_CODE (constructor_type) == UNION_TYPE) - && constructor_fields == 0) - process_init_element (pop_init_level (1)); - else if (TREE_CODE (constructor_type) == ARRAY_TYPE - && constructor_max_index - && tree_int_cst_lt (constructor_max_index, constructor_index)) - process_init_element (pop_init_level (1)); - else - break; + while (constructor_stack->implicit) + { + if ((TREE_CODE (constructor_type) == RECORD_TYPE + || TREE_CODE (constructor_type) == UNION_TYPE) + && constructor_fields == 0) + process_init_element (pop_init_level (1)); + else if (TREE_CODE (constructor_type) == ARRAY_TYPE + && constructor_max_index + && tree_int_cst_lt (constructor_max_index, + constructor_index)) + process_init_element (pop_init_level (1)); + else + break; + } } /* Unless this is an explicit brace, we need to preserve previous diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fb02e49..fd5b607 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-06-04 Joseph S. Myers <joseph@codesourcery.com> + + PR c/21873 + * gcc.dg/init-excess-1.c: New test. + 2005-06-03 Mark Mitchell <mark@codesourcery.com> PR c++/21853 diff --git a/gcc/testsuite/gcc.dg/init-excess-1.c b/gcc/testsuite/gcc.dg/init-excess-1.c new file mode 100644 index 0000000..ade6fd0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/init-excess-1.c @@ -0,0 +1,48 @@ +/* Test for various cases of excess initializers for empty objects: + bug 21873. Various versions of GCC ICE, hang or loop repeating + diagnostics on various of these tests. */ +/* Origin: Joseph Myers <joseph@codesourcery.com> */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +struct s0 { }; +struct s1 { int a; }; +struct s2 { int a; int b; }; + +int a0[0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +int a1[0][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +int a2[0][1] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +int a3[1][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +int a4[][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +int a5[][0][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +int a6[][0][1] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +int a7[][1][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ + +struct s0 b0[0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +struct s0 b1[0][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +struct s0 b2[0][1] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +struct s0 b3[1][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +struct s0 b4[][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +struct s0 b5[][0][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +struct s0 b6[][0][1] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +struct s0 b7[][1][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +struct s0 b8[1] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +struct s0 b9[] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ + +struct s1 c0[0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +struct s1 c1[0][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +struct s1 c2[0][1] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +struct s1 c3[1][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +struct s1 c4[][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +struct s1 c5[][0][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +struct s1 c6[][0][1] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +struct s1 c7[][1][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ + +struct s2 d0[0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +struct s2 d1[0][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +struct s2 d2[0][1] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +struct s2 d3[1][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +struct s2 d4[][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +struct s2 d5[][0][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +struct s2 d6[][0][1] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ +struct s2 d7[][1][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */ |