From ca1dcc7740a2532bae1d898dd326b43da54a2c54 Mon Sep 17 00:00:00 2001 From: jason Date: Fri, 20 May 2011 19:01:53 +0000 Subject: [PATCH] PR c++/48873 * tree.c (stabilize_expr): Don't make gratuitous copies of classes. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@173970 138bc75d-0d04-0410-961f-82ee72b054a4 index f04fd23..16b9ca1 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -3124,7 +3124,8 @@ stabilize_expr (tree exp, tree* initp) if (!TREE_SIDE_EFFECTS (exp)) init_expr = NULL_TREE; - else if (!TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (exp)) + else if ((!TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (exp)) + && !TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (exp))) || !lvalue_or_rvalue_with_address_p (exp)) { init_expr = get_target_expr (exp); new file mode 100644 index 0000000..f827857 --- /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()); // # +} -- 1.7.0.4