coroutines: Ensure the ramp return object is checked (PR93443).

Message ID 6E453246-F9C1-4DF9-A3DA-0983ED0489C7@sandoe.co.uk
State New
Headers show
Series
  • coroutines: Ensure the ramp return object is checked (PR93443).
Related show

Commit Message

Iain Sandoe Jan. 27, 2020, 11:43 a.m.
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.

bootstrapped and tested on x86_64-darwin16,
OK for trunk?
thanks
Iain

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/coroutines.cc | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

-- 
2.24.1

Comments

Nathan Sidwell Jan. 27, 2020, 12:46 p.m. | #1
On 1/27/20 6:43 AM, Iain Sandoe wrote:
> 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.

> 

> bootstrapped and tested on x86_64-darwin16,

> OK for trunk?

> thanks

> Iain

> 

> 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'.


ok, thanks


-- 
Nathan Sidwell

Patch

diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc
index b222c1f7a8e..e8a6a4033f6 100644
--- a/gcc/cp/coroutines.cc
+++ b/gcc/cp/coroutines.cc
@@ -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;