From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2122) id 3A3BF396E025; Thu, 6 Oct 2022 21:44:36 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 3A3BF396E025 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1665092676; bh=eQXyLYzItF245ukz40YtDl+yofmQjRYhgLp4uuqAIEw=; h=From:To:Subject:Date:From; b=khi3ZsXdT6ZShEijj8QkmaO1Vqry+SfXv3D2n3wuBv7aoKPUiITuqsfUI/V+YTdFr 5vUQ8DaS+cICL9iAuWO5YSr4VIWilXWtBY8yoqG2QsA1Wa/liXGxzJs6kQlB2QaBNN QEsayRS+fDgL7wIY0i6KCiSjkFK+Xq7TdbhdhkD8= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jason Merrill To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-3140] c++: fix broken conversion in coroutines X-Act-Checkin: gcc X-Git-Author: Jason Merrill X-Git-Refname: refs/heads/master X-Git-Oldrev: 49b9a8c8cc498b1ed2f566bee858e651e14ba37b X-Git-Newrev: 0143b277c9b17215ab3d4b361e1aef431799e813 Message-Id: <20221006214436.3A3BF396E025@sourceware.org> Date: Thu, 6 Oct 2022 21:44:36 +0000 (GMT) List-Id: https://gcc.gnu.org/g:0143b277c9b17215ab3d4b361e1aef431799e813 commit r13-3140-g0143b277c9b17215ab3d4b361e1aef431799e813 Author: Jason Merrill Date: Fri Sep 30 10:04:22 2022 -0400 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. Diff: --- gcc/cp/coroutines.cc | 5 ++++- gcc/cp/cp-gimplify.cc | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc index eca01abcb7a..60b846600b9 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 b4599fc34d8..5d26e59d098 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;