Bug 91427

Summary: Implement P1825R0, Merged wording for P0527R1 and P1155R3
Product: gcc Reporter: Marek Polacek <mpolacek>
Component: c++Assignee: Jason Merrill <jason>
Status: RESOLVED FIXED    
Severity: normal CC: antoshkka, jason, webrown.cpp
Priority: P3    
Version: 10.0   
Target Milestone: 11.0   
See Also: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87150
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93106
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65869
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91212
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57533
Host: Target:
Build: Known to work:
Known to fail: Last reconfirmed: 2019-08-12 00:00:00
Bug Depends on:    
Bug Blocks: 88323    

Description Marek Polacek 2019-08-12 18:50:09 UTC
Tracker PR to implement C++20 P1825R0.

Also see
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87150#c19
Comment 1 Marek Polacek 2019-08-12 18:51:09 UTC
I'll probably work on it since it reverts my fix for bug 87150, but not assigning quite yet.
Comment 2 GCC Commits 2020-07-29 18:25:28 UTC
The master branch has been updated by Jason Merrill <jason@gcc.gnu.org>:

https://gcc.gnu.org/g:1722e2013f05f1f1f99379dbaa0c0df356da731f

commit r11-2412-g1722e2013f05f1f1f99379dbaa0c0df356da731f
Author: Jason Merrill <jason@redhat.com>
Date:   Tue Jul 21 00:19:49 2020 -0400

    c++: Implement C++20 implicit move changes. [PR91427]
    
    P1825R0 extends the C++11 implicit move on return by removing the
    constraints on the called constructor: previously, it needed to take an
    rvalue reference to the type of the returned variable.  The paper also
    allows move on throw of parameters and implicit move of rvalue references.
    
    Discussion on the CWG reflector about how to avoid breaking the PR91212 test
    in the new model settled on the model of doing only a single overload
    resolution, with the variable treated as an xvalue that can bind to
    non-const lvalue references.  So this patch implements that approach.  The
    implementation does not use the existing LOOKUP_PREFER_RVALUE flag, but
    instead sets a flag on the representation of the static_cast turning the
    variable into an xvalue.
    
    For the time being I'm limiting the new semantics to C++20 mode; since it
    was moved as a DR, we will probably want to apply the change to other
    standard modes as well once we have a better sense of the impact on existing
    code, probably in GCC 12.
    
    gcc/cp/ChangeLog:
    
            PR c++/91427
            * cp-tree.h (IMPLICIT_RVALUE_P): New.
            (enum cp_lvalue_kind_flags): Add clk_implicit_rval.
            (implicit_rvalue_p, set_implicit_rvalue_p): New.
            * call.c (reference_binding): Check clk_implicit_rval.
            (build_over_call): Adjust C++20 implicit move.
            * coroutines.cc (finish_co_return_stmt): Simplify implicit move.
            * except.c (build_throw): Adjust C++20 implicit move.
            * pt.c (tsubst_copy_and_build) [STATIC_CAST_EXPR]: Propagate
            IMPLICIT_RVALUE_P.
            * tree.c (lvalue_kind): Set clk_implicit_rval.
            * typeck.c (treat_lvalue_as_rvalue_p): Overhaul.
            (maybe_warn_pessimizing_move): Adjust.
            (check_return_expr): Adjust C++20 implicit move.
    
    gcc/testsuite/ChangeLog:
    
            PR c++/91427
            * g++.dg/coroutines/co-return-syntax-10-movable.C: Extend.
            * g++.dg/cpp0x/Wredundant-move1.C: Adjust for C++20.
            * g++.dg/cpp0x/Wredundant-move7.C: Adjust for C++20.
            * g++.dg/cpp0x/Wredundant-move9.C: Adjust for C++20.
            * g++.dg/cpp0x/elision_neg.C: Adjust for C++20.
            * g++.dg/cpp0x/move-return2.C: Adjust for C++20.
            * g++.dg/cpp0x/ref-qual20.C: Adjust for C++20.
            * g++.dg/cpp2a/implicit-move1.C: New test.
            * g++.dg/cpp2a/implicit-move2.C: New test.
            * g++.dg/cpp2a/implicit-move3.C: New test.
Comment 3 Jason Merrill 2020-09-09 22:06:48 UTC
Implemented for GCC 11.