diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2012-10-18 22:48:35 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2012-10-18 22:48:35 +0000 |
commit | 69e3fb7d125d1a88d7a6f405f171021404833fc7 (patch) | |
tree | 414609a0b747ef722644072e07f7ff2b66fc7fa9 /gcc | |
parent | abe6d88d4a5c3bbbcc3b7d95cd82c8188933081e (diff) | |
download | gcc-69e3fb7d125d1a88d7a6f405f171021404833fc7.zip gcc-69e3fb7d125d1a88d7a6f405f171021404833fc7.tar.gz gcc-69e3fb7d125d1a88d7a6f405f171021404833fc7.tar.bz2 |
re PR c++/54501 (infinite recursion on illegal code)
/cp
2012-10-18 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/54501
* decl.c (reshape_init_array_1): Avoid infinite loops.
/testsuite
2012-10-18 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/54501
* g++.dg/init/array30.C: New.
* g++.dg/init/array31.C: Likewise.
From-SVN: r192592
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/decl.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/init/array30.C | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/init/array31.C | 10 |
5 files changed, 33 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5b390a5..73ab5a9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2012-10-18 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/54501 + * decl.c (reshape_init_array_1): Avoid infinite loops. + 2012-10-15 Alexandre Oliva <aoliva@redhat.com> Paolo Carlini <paolo.carlini@oracle.com> diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 468343f..d25aa80 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -5040,6 +5040,7 @@ reshape_init_array_1 (tree elt_type, tree max_index, reshape_iter *d, ++index) { tree elt_init; + constructor_elt *old_cur = d->cur; check_array_designated_initializer (d->cur, index); elt_init = reshape_init_r (elt_type, d, /*first_initializer_p=*/false, @@ -5050,6 +5051,10 @@ reshape_init_array_1 (tree elt_type, tree max_index, reshape_iter *d, size_int (index), elt_init); if (!TREE_CONSTANT (elt_init)) TREE_CONSTANT (new_init) = false; + + /* This can happen with an invalid initializer (c++/54501). */ + if (d->cur == old_cur && !sized_array_p) + break; } return new_init; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b3e3970..31f487e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2012-10-18 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/54501 + * g++.dg/init/array30.C: New. + * g++.dg/init/array31.C: Likewise. + 2012-10-18 Tobias Burnus <burnus@net-b.de> PR fortran/54884 diff --git a/gcc/testsuite/g++.dg/init/array30.C b/gcc/testsuite/g++.dg/init/array30.C new file mode 100644 index 0000000..696d9bf --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array30.C @@ -0,0 +1,7 @@ +// PR c++/54501 +// { dg-options "" } + +int main() +{ + int a[][0] = {0}; // { dg-error "too many" } +} diff --git a/gcc/testsuite/g++.dg/init/array31.C b/gcc/testsuite/g++.dg/init/array31.C new file mode 100644 index 0000000..9bb66a5 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array31.C @@ -0,0 +1,10 @@ +// PR c++/54501 +// { dg-options "" } + +struct A +{ + int i[0]; + int j; +}; + +struct A a = { 1 }; |