mirror of git://gcc.gnu.org/git/gcc.git
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>
|
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,
|
||||||
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)))
|
||||||
|
|
|
||||||
|
|
@ -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…
Reference in New Issue