Implement P0135R1, Guaranteed copy elision.
* cvt.c (ocp_convert): Don't re-copy a TARGET_EXPR in C++17. From-SVN: r240820
This commit is contained in:
parent
5794b9f622
commit
bf9b09fbe2
@ -1,5 +1,8 @@
|
||||
2016-10-05 Jason Merrill <jason@redhat.com>
|
||||
|
||||
Implement P0135R1, Guaranteed copy elision.
|
||||
* cvt.c (ocp_convert): Don't re-copy a TARGET_EXPR in C++17.
|
||||
|
||||
PR c++/54293
|
||||
* call.c (reference_binding): Fix binding to member of temporary.
|
||||
|
||||
|
@ -693,8 +693,11 @@ ocp_convert (tree type, tree expr, int convtype, int flags,
|
||||
if (error_operand_p (e))
|
||||
return error_mark_node;
|
||||
|
||||
if (MAYBE_CLASS_TYPE_P (type) && (convtype & CONV_FORCE_TEMP))
|
||||
/* We need a new temporary; don't take this shortcut. */;
|
||||
if (MAYBE_CLASS_TYPE_P (type) && (convtype & CONV_FORCE_TEMP)
|
||||
&& !(cxx_dialect >= cxx1z
|
||||
&& TREE_CODE (e) == TARGET_EXPR))
|
||||
/* We need a new temporary; don't take this shortcut. But in C++17, don't
|
||||
force a temporary if we already have one. */;
|
||||
else if (same_type_ignoring_top_level_qualifiers_p (type, TREE_TYPE (e)))
|
||||
{
|
||||
if (same_type_p (type, TREE_TYPE (e)))
|
||||
|
16
gcc/testsuite/g++.dg/cpp1z/elide1.C
Normal file
16
gcc/testsuite/g++.dg/cpp1z/elide1.C
Normal file
@ -0,0 +1,16 @@
|
||||
// { dg-options -std=c++1z }
|
||||
|
||||
struct A
|
||||
{
|
||||
A();
|
||||
A(const A&) = delete;
|
||||
};
|
||||
|
||||
bool b;
|
||||
A a = A();
|
||||
A a1 = b ? A() : A();
|
||||
A a2 = (42, A());
|
||||
|
||||
A f();
|
||||
A a3 = f();
|
||||
A a4 = b ? A() : f();
|
Loading…
x
Reference in New Issue
Block a user