diff mbox series

c++, v2: Fix coroutines on targetm.cxx.cdtor_return_this targets [PR99459]

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

Commit Message

Jakub Jelinek March 9, 2021, 3:23 p.m. UTC
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  <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.



	Jakub

Comments

Nathan Sidwell March 9, 2021, 3:35 p.m. UTC | #1
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
>
diff mbox series

Patch

--- 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