aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2012-10-18 22:48:35 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2012-10-18 22:48:35 +0000
commit69e3fb7d125d1a88d7a6f405f171021404833fc7 (patch)
tree414609a0b747ef722644072e07f7ff2b66fc7fa9 /gcc
parentabe6d88d4a5c3bbbcc3b7d95cd82c8188933081e (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/cp/decl.c5
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/init/array30.C7
-rw-r--r--gcc/testsuite/g++.dg/init/array31.C10
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 };