[PATCH] c++, v2: Fix coroutines on targetm.cxx.cdtor_return_this targets [PR99459]
Nathan Sidwell
nathan@acm.org
Tue Mar 9 15:35:51 GMT 2021
On 3/9/21 10:23 AM, Jakub Jelinek wrote:
> On Tue, Mar 09, 2021 at 08:01:26AM -0500, Nathan Sidwell wrote:
>> thanks for digging into this. Looks good, but could you take the
>> opportunity to rewrite the conditionals to a single
>>
>> if (dummy) { ... do the non-null things ... }
>>
>> ?
>
> So like this? Bootstrapped/regtested on x86_64-linux and i686-linux.
yeah, great! thank you.
>
> 2021-03-09 Jakub Jelinek <jakub@redhat.com>
>
> PR c++/99459
> * coroutines.cc (build_co_await): Look through NOP_EXPRs in
> build_special_member_call return value to find the CALL_EXPR.
> Simplify.
>
> --- gcc/cp/coroutines.cc.jj 2021-03-08 14:46:26.845072273 +0100
> +++ gcc/cp/coroutines.cc 2021-03-09 14:26:19.867411700 +0100
> @@ -863,16 +863,17 @@ build_co_await (location_t loc, tree a,
> final awaiter, so check for a non-throwing DTOR where needed. */
> tree a_type = TREE_TYPE (a);
> if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (a_type))
> - {
> - tree dummy
> + if (tree dummy
> = build_special_member_call (a, complete_dtor_identifier,
> NULL, a_type, LOOKUP_NORMAL,
> - tf_none);
> - dummy = dummy ? TREE_OPERAND (CALL_EXPR_FN (dummy), 0)
> - : NULL_TREE;
> - if (dummy && coro_diagnose_throwing_fn (dummy))
> - return error_mark_node;
> - }
> + tf_none))
> + {
> + if (CONVERT_EXPR_P (dummy))
> + dummy = TREE_OPERAND (dummy, 0);
> + dummy = TREE_OPERAND (CALL_EXPR_FN (dummy), 0);
> + if (coro_diagnose_throwing_fn (dummy))
> + return error_mark_node;
> + }
> }
> }
> else
> @@ -1026,16 +1027,17 @@ build_co_await (location_t loc, tree a,
> if (coro_diagnose_throwing_fn (awrs_func))
> return error_mark_node;
> if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (o_type))
> - {
> - tree dummy
> + if (tree dummy
> = build_special_member_call (e_proxy, complete_dtor_identifier,
> NULL, o_type, LOOKUP_NORMAL,
> - tf_none);
> - dummy = dummy ? TREE_OPERAND (CALL_EXPR_FN (dummy), 0)
> - : NULL_TREE;
> - if (dummy && coro_diagnose_throwing_fn (dummy))
> - return error_mark_node;
> - }
> + tf_none))
> + {
> + if (CONVERT_EXPR_P (dummy))
> + dummy = TREE_OPERAND (dummy, 0);
> + dummy = TREE_OPERAND (CALL_EXPR_FN (dummy), 0);
> + if (coro_diagnose_throwing_fn (dummy))
> + return error_mark_node;
> + }
> }
>
> /* We now have three call expressions, in terms of the promise, handle and
>
>
> Jakub
>
--
Nathan Sidwell
More information about the Gcc-patches
mailing list