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

Reply via email to