re PR c++/54501 (infinite recursion on illegal code)
authorPaolo Carlini <paolo.carlini@oracle.com>
Thu, 18 Oct 2012 22:48:35 +0000 (22:48 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Thu, 18 Oct 2012 22:48:35 +0000 (22:48 +0000)
/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

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/init/array30.C [new file with mode: 0644]
gcc/testsuite/g++.dg/init/array31.C [new file with mode: 0644]

index 5b390a50d9bce32055d270c2a561e155147947e2..73ab5a9b0ae1d2c70f61c17aac40e940062aefae 100644 (file)
@@ -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>
 
index 468343f40a3b033188f22ead82fd701585e85fb9..d25aa804971e697c9793502cce10ed3e8d31dfa4 100644 (file)
@@ -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;
index b3e39701e428dd850e0a57e9e8673aec509e2f66..31f487ed130623eee9f2c48485689cd6df5916c6 100644 (file)
@@ -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 (file)
index 0000000..696d9bf
--- /dev/null
@@ -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 (file)
index 0000000..9bb66a5
--- /dev/null
@@ -0,0 +1,10 @@
+// PR c++/54501
+// { dg-options "" }
+
+struct A
+{
+  int i[0];
+  int j;
+};
+
+struct A a = { 1 };