From 0c59fd2fd22fa78fa357d6f509ac5e9be17316c1 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 25 Oct 2011 14:24:19 -0400 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/tree.c | 17 +++++++++++++---- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/cpp0x/initlist59.C | 18 ++++++++++++++++++ 4 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/initlist59.C 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()}; +} -- 2.47.2