c++: fix broken conversion in coroutines

You can't use CONVERT_EXPR to convert between two class types.

VIEW_CONVERT_EXPR takes liberties with the C++ type system, but is probably
safe in this context.  Let's also only use it when the type isn't already
what we want.

gcc/cp/ChangeLog:

	* coroutines.cc (expand_one_await_expression): Change conversion
	to VIEW_CONVERT_EXPR.
	* cp-gimplify.cc (cp_genericize_r) [CONVERT_EXPR]: Add assert.
This commit is contained in:
Jason Merrill 2022-09-30 10:04:22 -04:00
parent 49b9a8c8cc
commit 0143b277c9
2 changed files with 5 additions and 1 deletions

View file

@ -1728,7 +1728,10 @@ expand_one_await_expression (tree *stmt, tree *await_expr, void *d)
}
else
{
r = build1_loc (loc, CONVERT_EXPR, void_coro_handle_type, suspend);
r = suspend;
if (!same_type_ignoring_top_level_qualifiers_p (susp_type,
void_coro_handle_type))
r = build1_loc (loc, VIEW_CONVERT_EXPR, void_coro_handle_type, r);
r = build2_loc (loc, INIT_EXPR, void_coro_handle_type, data->conthand, r);
r = build1 (CONVERT_EXPR, void_type_node, r);
append_to_statement_list (r, &body_list);

View file

@ -1589,6 +1589,7 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data)
break;
case CONVERT_EXPR:
gcc_checking_assert (!AGGREGATE_TYPE_P (TREE_TYPE (stmt)));
gcc_assert (!CONVERT_EXPR_VBASE_PATH (stmt));
break;