diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 58c00de43d4..0586fe13ab5 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 d023eb86cb8..707f2c8aeba 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 40e1de1b672..7a82af0d151 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 00000000000..2cc015d1fee --- /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()}; +}