From: Jason Merrill Date: Fri, 20 May 2011 20:01:42 +0000 (-0400) Subject: re PR c++/48873 ([C++0x][noexcept] Placement-new problem with deleted destructors) X-Git-Tag: releases/gcc-4.3.6~82 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1e8209170fc6d634653e6ddf90668142056311d1;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: r173979 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3f0c07578062..5184bc050182 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. + 2009-02-18 H.J. Lu PR c++/39219 diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 47daad771444..70cf67d7fe79 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -2579,7 +2579,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 c46107d675f5..a4dffe2b1a7d 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()); // # +}