From: Jason Merrill Date: Tue, 25 Oct 2011 18:24:19 +0000 (-0400) Subject: re PR c++/49996 (Internal error in verify_gimple_stmt: initializing struct in new... X-Git-Tag: releases/gcc-4.7.0~2825 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0c59fd2fd22fa78fa357d6f509ac5e9be17316c1;p=thirdparty%2Fgcc.git re PR c++/49996 (Internal error in verify_gimple_stmt: initializing struct in new-initializer) PR c++/49996 * tree.c (stabilize_init): Stabilize scalar elements of a CONSTRUCTOR, too. From-SVN: r180441 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 58c00de43d41..0586fe13ab57 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2011-10-25 Jason Merrill + + PR c++/49996 + * tree.c (stabilize_init): Stabilize scalar elements of a + CONSTRUCTOR, too. + 2011-10-25 Paolo Carlini PR c++/50858 diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index d023eb86cb8d..707f2c8aeba9 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 40e1de1b6722..7a82af0d1512 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-10-25 Jason Merrill + + PR c++/49996 + * g++.dg/cpp0x/initlist59.C: New. + 2011-10-25 Paolo Carlini 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 index 000000000000..2cc015d1fee3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist59.C @@ -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()}; +}