-
- Downloads
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.
Showing
- gcc/cp/call.c 5 additions, 1 deletiongcc/cp/call.c
- gcc/cp/coroutines.cc 9 additions, 23 deletionsgcc/cp/coroutines.cc
- gcc/cp/cp-tree.h 32 additions, 3 deletionsgcc/cp/cp-tree.h
- gcc/cp/except.c 16 additions, 12 deletionsgcc/cp/except.c
- gcc/cp/pt.c 2 additions, 0 deletionsgcc/cp/pt.c
- gcc/cp/tree.c 6 additions, 1 deletiongcc/cp/tree.c
- gcc/cp/typeck.c 74 additions, 23 deletionsgcc/cp/typeck.c
- gcc/testsuite/g++.dg/coroutines/co-return-syntax-10-movable.C 10 additions, 2 deletions...testsuite/g++.dg/coroutines/co-return-syntax-10-movable.C
- gcc/testsuite/g++.dg/cpp0x/Wredundant-move1.C 1 addition, 1 deletiongcc/testsuite/g++.dg/cpp0x/Wredundant-move1.C
- gcc/testsuite/g++.dg/cpp0x/Wredundant-move7.C 3 additions, 3 deletionsgcc/testsuite/g++.dg/cpp0x/Wredundant-move7.C
- gcc/testsuite/g++.dg/cpp0x/Wredundant-move9.C 1 addition, 1 deletiongcc/testsuite/g++.dg/cpp0x/Wredundant-move9.C
- gcc/testsuite/g++.dg/cpp0x/elision_neg.C 1 addition, 1 deletiongcc/testsuite/g++.dg/cpp0x/elision_neg.C
- gcc/testsuite/g++.dg/cpp0x/move-return2.C 1 addition, 1 deletiongcc/testsuite/g++.dg/cpp0x/move-return2.C
- gcc/testsuite/g++.dg/cpp0x/ref-qual20.C 3 additions, 2 deletionsgcc/testsuite/g++.dg/cpp0x/ref-qual20.C
- gcc/testsuite/g++.dg/cpp2a/implicit-move1.C 17 additions, 0 deletionsgcc/testsuite/g++.dg/cpp2a/implicit-move1.C
- gcc/testsuite/g++.dg/cpp2a/implicit-move2.C 49 additions, 0 deletionsgcc/testsuite/g++.dg/cpp2a/implicit-move2.C
- gcc/testsuite/g++.dg/cpp2a/implicit-move3.C 49 additions, 0 deletionsgcc/testsuite/g++.dg/cpp2a/implicit-move3.C
Loading
Please register or sign in to comment