Commit 1f2e8423 by Iain Sandoe

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

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'.
parent 73380abd
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> 2020-01-27 Nathan Sidwell <nathan@acm.org>
PR c++/91826 PR c++/91826
......
...@@ -3526,14 +3526,9 @@ morph_fn_to_coro (tree orig, tree *resumer, tree *destroyer) ...@@ -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 /* Switch to using 'input_location' as the loc, since we're now more
logically doing things related to the end of the function. */ logically doing things related to the end of the function. */
/* done, we just need the return value. */
bool no_warning; /* The ramp is done, we just need the return value. */
if (same_type_p (TREE_TYPE (gro), fn_return_type)) if (!same_type_p (TREE_TYPE (gro), fn_return_type))
{
/* Already got the result. */
r = check_return_expr (DECL_RESULT (orig), &no_warning);
}
else
{ {
/* construct the return value with a single GRO param. */ /* construct the return value with a single GRO param. */
vec<tree, va_gc> *args = make_tree_vector_single (gro); vec<tree, va_gc> *args = make_tree_vector_single (gro);
...@@ -3545,6 +3540,13 @@ morph_fn_to_coro (tree orig, tree *resumer, tree *destroyer) ...@@ -3545,6 +3540,13 @@ morph_fn_to_coro (tree orig, tree *resumer, tree *destroyer)
add_stmt (r); add_stmt (r);
release_tree_vector (args); 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)); r = build_stmt (input_location, RETURN_EXPR, DECL_RESULT (orig));
TREE_NO_WARNING (r) |= no_warning; TREE_NO_WARNING (r) |= no_warning;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment