]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++, coroutines: Allow NVRO in more cases for ramp functions.
authorIain Sandoe <iain@sandoe.co.uk>
Sat, 10 May 2025 16:22:55 +0000 (17:22 +0100)
committerIain Sandoe <iain@sandoe.co.uk>
Fri, 16 May 2025 13:47:52 +0000 (14:47 +0100)
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>
gcc/cp/typeck.cc

index 1b9fdf5b21d4113735e11c39ccc2d26ded0daacc..af2cbaff8fdc703cb5b7e898cc17e5ad8be76816 100644 (file)
@@ -11463,6 +11463,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.  */