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:
parent
49b9a8c8cc
commit
0143b277c9
2 changed files with 5 additions and 1 deletions
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue