aboutsummaryrefslogtreecommitdiff
blob: 100d2bb23b102e7b980b9ae0cadcbb453abe1f4c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
From 1035866a75b27bb2cac49bac1070877d95f7d3c0 Mon Sep 17 00:00:00 2001
From: Iain Sandoe <iain@sandoe.co.uk>
Date: Sun, 29 Sep 2024 10:04:39 +0100
Subject: [PATCH] c++, coroutines: stmt expressions some progress

---
 gcc/cp/coroutines.cc | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc
index af8798b04ba..94bfa6ac450 100644
--- a/gcc/cp/coroutines.cc
+++ b/gcc/cp/coroutines.cc
@@ -2131,6 +2131,14 @@ await_statement_expander (tree *stmt, int *do_subtree, void *d)
     }
   else if (EXPR_P (*stmt))
     {
+      /* Look for ({}) at the top level - just recurse into these.  */
+      if (TREE_CODE (*stmt) == EXPR_STMT)
+	{
+	  tree inner = EXPR_STMT_EXPR (*stmt);
+	  if (TREE_CODE (inner) == STATEMENT_LIST
+	      || TREE_CODE (inner) == BIND_EXPR)
+	    return NULL_TREE; // process contents
+	}
       process_one_statement (stmt, d);
       *do_subtree = 0; /* Done subtrees.  */
     }
@@ -3860,6 +3868,20 @@ await_statement_walker (tree *stmt, int *do_subtree, void *d)
       if (!(cp_walk_tree (stmt, find_any_await, &await_ptr, &visited)))
 	return NULL_TREE; /* Nothing special to do here.  */
 
+      /* Handle statement expressions.  */
+      if (TREE_CODE (expr) == EXPR_STMT)
+	{
+	  tree inner = EXPR_STMT_EXPR (expr);
+	  if (TREE_CODE (inner) == STATEMENT_LIST
+	      || TREE_CODE (inner) == BIND_EXPR)
+	    {
+	      res = cp_walk_tree (&EXPR_STMT_EXPR (expr),
+				  await_statement_walker, d, NULL);
+	      *do_subtree = 0;
+	      return res;
+	    }
+	}
+
       visited.empty ();
       awpts->saw_awaits = 0;
       hash_set<tree> truth_aoif_to_expand;
-- 
2.39.2 (Apple Git-143)