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. To meet the requirements of copy-elision, we need to ensure NVRO for these objects, even when they are non-copyable or non-movable. 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> --- gcc/cp/typeck.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gcc/cp/typeck.cc b/gcc/cp/typeck.cc index 1b9fdf5b21d..d8bc3409984 100644 --- a/gcc/cp/typeck.cc +++ b/gcc/cp/typeck.cc @@ -11463,6 +11463,9 @@ check_return_expr (tree retval, bool *no_warning, bool *dangling) && call_from_lambda_thunk_p (retval)) converted = true; + 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. */ -- 2.39.2 (Apple Git-143)