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 <iain@sandoe.co.uk>
(cherry picked from commit
d87caa9d3595ca845c9282cef8b0c9a656d8def0)
&& 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. */