https://gcc.gnu.org/g:491b8b29ff58353fa840b08087a9151c650a2ef8
commit r15-10085-g491b8b29ff58353fa840b08087a9151c650a2ef8 Author: Iain Sandoe <i...@sandoe.co.uk> Date: Sat May 10 17:22:55 2025 +0100 c++, coroutines: Allow NVRO in more cases for ramp functions. The constraints of the c++ coroutines specification require the ramp to construct a return object early in the function. This will be returned at some later time. This is implemented as NVRO but requires that copying be well-formed even though it will be elided. Special-case ramp functions to allow this. gcc/cp/ChangeLog: * typeck.cc (check_return_expr): Suppress conversions for NVRO in coroutine ramp functions. Signed-off-by: Iain Sandoe <i...@sandoe.co.uk> (cherry picked from commit d87caa9d3595ca845c9282cef8b0c9a656d8def0) Diff: --- gcc/cp/typeck.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/gcc/cp/typeck.cc b/gcc/cp/typeck.cc index fb5b04f28e86..f6693d99eb86 100644 --- a/gcc/cp/typeck.cc +++ b/gcc/cp/typeck.cc @@ -11584,6 +11584,12 @@ check_return_expr (tree retval, bool *no_warning, bool *dangling) && call_from_lambda_thunk_p (retval)) converted = true; + /* Don't check copy-initialization for NRV in a coroutine ramp; we + implement this case as NRV, but it's specified as directly + initializing the return value from get_return_object(). */ + if (DECL_RAMP_FN (current_function_decl) && named_return_value_okay_p) + converted = true; + /* First convert the value to the function's return type, then to the type of return value's location to handle the case that functype is smaller than the valtype. */