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. 2021-03-09 Jakub Jelinek <ja...@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