]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/49996 (Internal error in verify_gimple_stmt: initializing struct in new...
authorJason Merrill <jason@redhat.com>
Tue, 25 Oct 2011 18:24:19 +0000 (14:24 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 25 Oct 2011 18:24:19 +0000 (14:24 -0400)
PR c++/49996
* tree.c (stabilize_init): Stabilize scalar elements of a
CONSTRUCTOR, too.

From-SVN: r180441

gcc/cp/ChangeLog
gcc/cp/tree.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/initlist59.C [new file with mode: 0644]

index 58c00de43d410325eab272542dd21e5306358449..0586fe13ab5738166129c779dc0d18bc6173d705 100644 (file)
@@ -1,3 +1,9 @@
+2011-10-25  Jason Merrill  <jason@redhat.com>
+
+       PR c++/49996
+       * tree.c (stabilize_init): Stabilize scalar elements of a
+       CONSTRUCTOR, too.
+
 2011-10-25  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/50858
index d023eb86cb8d648f1542589642323c40363aa51e..707f2c8aeba9923658246c4013feb06ef02502b6 100644 (file)
@@ -3345,11 +3345,20 @@ stabilize_init (tree init, tree *initp)
       /* Aggregate initialization: stabilize each of the field
         initializers.  */
       unsigned i;
-      tree value;
+      constructor_elt *ce;
       bool good = true;
-      FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (t), i, value)
-       if (!stabilize_init (value, initp))
-         good = false;
+      VEC(constructor_elt,gc) *v = CONSTRUCTOR_ELTS (t);
+      for (i = 0; VEC_iterate (constructor_elt, v, i, ce); ++i)
+       {
+         tree type = TREE_TYPE (ce->value);
+         tree subinit;
+         if (TREE_CODE (type) == REFERENCE_TYPE
+             || SCALAR_TYPE_P (type))
+           ce->value = stabilize_expr (ce->value, &subinit);
+         else if (!stabilize_init (ce->value, &subinit))
+           good = false;
+         *initp = add_stmt_to_compound (*initp, subinit);
+       }
       return good;
     }
 
index 40e1de1b6722ade06356b9e82d720f15f9f70da5..7a82af0d15125a6e80d01f4b180ea060086684ca 100644 (file)
@@ -1,3 +1,8 @@
+2011-10-25  Jason Merrill  <jason@redhat.com>
+
+       PR c++/49996
+       * g++.dg/cpp0x/initlist59.C: New.
+
 2011-10-25  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/50858
diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist59.C b/gcc/testsuite/g++.dg/cpp0x/initlist59.C
new file mode 100644 (file)
index 0000000..2cc015d
--- /dev/null
@@ -0,0 +1,18 @@
+// PR c++/49996
+// { dg-options -std=c++0x }
+
+struct A
+{
+  ~A()
+  { }
+};
+
+struct B
+{
+  const A& ref;
+};
+
+int main()
+{
+  B* p = new B{A()};
+}