diff options
author | Jason Merrill <jason@redhat.com> | 2022-09-30 10:04:22 -0400 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2022-10-06 17:43:14 -0400 |
commit | 0143b277c9b17215ab3d4b361e1aef431799e813 (patch) | |
tree | b8b1af7a80fd3c9ee61805b089de2bf6b118ae65 | |
parent | 49b9a8c8cc498b1ed2f566bee858e651e14ba37b (diff) | |
download | gcc-0143b277c9b17215ab3d4b361e1aef431799e813.zip gcc-0143b277c9b17215ab3d4b361e1aef431799e813.tar.gz gcc-0143b277c9b17215ab3d4b361e1aef431799e813.tar.bz2 |
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.
-rw-r--r-- | gcc/cp/coroutines.cc | 5 | ||||
-rw-r--r-- | gcc/cp/cp-gimplify.cc | 1 |
2 files changed, 5 insertions, 1 deletions
diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc index eca01ab..60b8466 100644 --- a/gcc/cp/coroutines.cc +++ b/gcc/cp/coroutines.cc @@ -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); diff --git a/gcc/cp/cp-gimplify.cc b/gcc/cp/cp-gimplify.cc index b4599fc3..5d26e59 100644 --- a/gcc/cp/cp-gimplify.cc +++ b/gcc/cp/cp-gimplify.cc @@ -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; |