https://gcc.gnu.org/g:d87caa9d3595ca845c9282cef8b0c9a656d8def0

commit r16-690-gd87caa9d3595ca845c9282cef8b0c9a656d8def0
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>

Diff:
---
 gcc/cp/typeck.cc | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/gcc/cp/typeck.cc b/gcc/cp/typeck.cc
index 1b9fdf5b21d4..af2cbaff8fdc 100644
--- a/gcc/cp/typeck.cc
+++ b/gcc/cp/typeck.cc
@@ -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.  */

Reply via email to