From: Jason Merrill Date: Fri, 20 May 2011 18:53:27 +0000 (-0400) Subject: re PR c++/48873 ([C++0x][noexcept] Placement-new problem with deleted destructors) X-Git-Tag: releases/gcc-4.5.4~633 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dddd76c9b30621b62e76a173e35694b97c8c2341;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: r173969 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index cf008b23b290..fddbf6de778f 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 994056d9ca3d..c80fa995634f 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -2954,7 +2954,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 681b53cdb409..5526d710a7a6 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-19 Rainer Orth * gcc.c-torture/execute/960321-1.x: Remove. 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()); // # +}