Commit bf9b09fb by Jason Merrill Committed by Jason Merrill

Implement P0135R1, Guaranteed copy elision.

	* cvt.c (ocp_convert): Don't re-copy a TARGET_EXPR in C++17.

From-SVN: r240820
parent 5794b9f6
2016-10-05 Jason Merrill <jason@redhat.com> 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 PR c++/54293
* call.c (reference_binding): Fix binding to member of temporary. * call.c (reference_binding): Fix binding to member of temporary.
......
...@@ -693,8 +693,11 @@ ocp_convert (tree type, tree expr, int convtype, int flags, ...@@ -693,8 +693,11 @@ ocp_convert (tree type, tree expr, int convtype, int flags,
if (error_operand_p (e)) if (error_operand_p (e))
return error_mark_node; return error_mark_node;
if (MAYBE_CLASS_TYPE_P (type) && (convtype & CONV_FORCE_TEMP)) if (MAYBE_CLASS_TYPE_P (type) && (convtype & CONV_FORCE_TEMP)
/* We need a new temporary; don't take this shortcut. */; && !(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))) else if (same_type_ignoring_top_level_qualifiers_p (type, TREE_TYPE (e)))
{ {
if (same_type_p (type, TREE_TYPE (e))) if (same_type_p (type, TREE_TYPE (e)))
......
// { 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();
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment