aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2022-09-30 10:04:22 -0400
committerJason Merrill <jason@redhat.com>2022-10-06 17:43:14 -0400
commit0143b277c9b17215ab3d4b361e1aef431799e813 (patch)
treeb8b1af7a80fd3c9ee61805b089de2bf6b118ae65 /gcc
parent49b9a8c8cc498b1ed2f566bee858e651e14ba37b (diff)
downloadgcc-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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/coroutines.cc5
-rw-r--r--gcc/cp/cp-gimplify.cc1
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;