From: Jason Merrill Date: Fri, 20 May 2011 20:01:19 +0000 (-0400) Subject: re PR c++/48873 ([C++0x][noexcept] Placement-new problem with deleted destructors) X-Git-Tag: releases/gcc-4.4.7~396 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d841f02bac549ba5f809bdf53629615a1ce8ddb9;p=thirdparty%2Fgcc.git re PR c++/48873 ([C++0x][noexcept] Placement-new problem with deleted destructors) PR c++/48873 * tree.c (stabilize_expr): Don't make gratuitous copies of classes. From-SVN: r173978 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a85d3b1f5cbb..2549c727f2cf 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2011-05-20 Jason Merrill + + PR c++/48873 + * tree.c (stabilize_expr): Don't make gratuitous copies of classes. + 2011-05-09 Jason Merrill PR c++/48936 diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index ec069b0ca216..dcf9872d346a 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -2663,7 +2663,8 @@ stabilize_expr (tree exp, tree* initp) if (!TREE_SIDE_EFFECTS (exp)) init_expr = NULL_TREE; else if (!real_lvalue_p (exp) - || !TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (exp))) + || (!TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (exp)) + && !TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (exp)))) { init_expr = get_target_expr (exp); exp = TARGET_EXPR_SLOT (init_expr); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3c2d721ac0d3..1623a974f2ad 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-05-20 Jason Merrill + + * g++.dg/init/new32.C: New. + 2011-05-14 John David Anglin Backport from mainline: diff --git a/gcc/testsuite/g++.dg/init/new32.C b/gcc/testsuite/g++.dg/init/new32.C new file mode 100644 index 000000000000..f82785749ce4 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new32.C @@ -0,0 +1,16 @@ +// PR c++/48873 + +#include + +struct D { +private: + ~D(); +}; + +template +T& create(); + +void f() +{ + D* dp = new (((void*) 0)) D(create()); // # +}