From 69e3fb7d125d1a88d7a6f405f171021404833fc7 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Thu, 18 Oct 2012 22:48:35 +0000 Subject: [PATCH] re PR c++/54501 (infinite recursion on illegal code) /cp 2012-10-18 Paolo Carlini PR c++/54501 * decl.c (reshape_init_array_1): Avoid infinite loops. /testsuite 2012-10-18 Paolo Carlini PR c++/54501 * g++.dg/init/array30.C: New. * g++.dg/init/array31.C: Likewise. From-SVN: r192592 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/decl.c | 5 +++++ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/init/array30.C | 7 +++++++ gcc/testsuite/g++.dg/init/array31.C | 10 ++++++++++ 5 files changed, 33 insertions(+) create mode 100644 gcc/testsuite/g++.dg/init/array30.C create mode 100644 gcc/testsuite/g++.dg/init/array31.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5b390a50d9b..73ab5a9b0ae 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2012-10-18 Paolo Carlini + + PR c++/54501 + * decl.c (reshape_init_array_1): Avoid infinite loops. + 2012-10-15 Alexandre Oliva Paolo Carlini diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 468343f40a3..d25aa804971 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 b3e39701e42..31f487ed130 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2012-10-18 Paolo Carlini + + PR c++/54501 + * g++.dg/init/array30.C: New. + * g++.dg/init/array31.C: Likewise. + 2012-10-18 Tobias Burnus 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 00000000000..696d9bf992d --- /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 00000000000..9bb66a5950f --- /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 }; -- 2.30.2