Message ID | 20210309152315.GP745611@tucnak |
---|---|
State | New |
Headers | show |
Series | c++, v2: Fix coroutines on targetm.cxx.cdtor_return_this targets [PR99459] | expand |
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 >
--- 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