coroutines: Ensure the ramp return object is checked (PR93443).
authorIain Sandoe <iain@sandoe.co.uk>
Mon, 27 Jan 2020 10:13:09 +0000 (10:13 +0000)
committerIain Sandoe <iain@sandoe.co.uk>
Mon, 27 Jan 2020 19:46:40 +0000 (19:46 +0000)
As the PR shows, there is a pathway through the code where the
no_warning value is not set, which corresponds to a missing check
of the ramp return when it was constructed from the 'get return
object'  Fixed by ensuring that the check of the return value is
carried out for both return cases.

gcc/cp/ChangeLog:

2020-01-27  Iain Sandoe  <iain@sandoe.co.uk>

PR c++/93443
* coroutines.cc (morph_fn_to_coro): Check the ramp return
value when it is constructed from the 'get return object'.

gcc/cp/ChangeLog
gcc/cp/coroutines.cc

index 5324a6e574e4a6d6137ead4d196c6e4849c5549a..b1bf4a0adffe44c1c2fe004318eead252848f3f8 100644 (file)
@@ -1,3 +1,9 @@
+2020-01-27  Iain Sandoe  <iain@sandoe.co.uk>
+
+       PR c++/93443
+       * coroutines.cc (morph_fn_to_coro): Check the ramp return
+       value when it is constructed from the 'get return object'.
+
 2020-01-27  Nathan Sidwell  <nathan@acm.org>
 
        PR c++/91826
index b222c1f7a8edc8fbbb07f155026a7f6129236589..e8a6a4033f6f20694c0ce344d0fe1019d7f99d2c 100644 (file)
@@ -3526,14 +3526,9 @@ morph_fn_to_coro (tree orig, tree *resumer, tree *destroyer)
 
   /* Switch to using 'input_location' as the loc, since we're now more
      logically doing things related to the end of the function.  */
-  /* done, we just need the return value.  */
-  bool no_warning;
-  if (same_type_p (TREE_TYPE (gro), fn_return_type))
-    {
-      /* Already got the result.  */
-      r = check_return_expr (DECL_RESULT (orig), &no_warning);
-    }
-  else
+
+  /* The ramp is done, we just need the return value.  */
+  if (!same_type_p (TREE_TYPE (gro), fn_return_type))
     {
       /* construct the return value with a single GRO param.  */
       vec<tree, va_gc> *args = make_tree_vector_single (gro);
@@ -3545,6 +3540,13 @@ morph_fn_to_coro (tree orig, tree *resumer, tree *destroyer)
       add_stmt (r);
       release_tree_vector (args);
     }
+  /* Else the GRO is the return and we already built it in place.  */
+
+  bool no_warning;
+  r = check_return_expr (DECL_RESULT (orig), &no_warning);
+  if (error_operand_p (r) && warn_return_type)
+    /* Suppress -Wreturn-type for the ramp.  */
+    TREE_NO_WARNING (orig) = true;
 
   r = build_stmt (input_location, RETURN_EXPR, DECL_RESULT (orig));
   TREE_NO_WARNING (r) |= no_warning;