aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/coroutines.cc11
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/coroutines/torture/co-await-04-control-flow.C2
4 files changed, 20 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index ed1c64f..4e2b0c5 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2020-02-03 Jun Ma <JunMa@linux.alibaba.com>
+
+ * coroutines.cc (transform_await_wrapper): Set actor funcion as
+ new context of label_decl.
+ (build_actor_fn): Fill new field of await_xform_data.
+
2020-02-02 Marek Polacek <polacek@redhat.com>
PR c++/93530 - ICE on invalid alignas in a template.
diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc
index f7f85cb..62d92d9 100644
--- a/gcc/cp/coroutines.cc
+++ b/gcc/cp/coroutines.cc
@@ -1580,6 +1580,7 @@ static hash_map<tree, suspend_point_info> *suspend_points;
struct await_xform_data
{
+ tree actor_fn; /* Decl for context. */
tree actor_frame;
tree promise_proxy;
tree real_promise;
@@ -1660,12 +1661,16 @@ transform_await_expr (tree await_expr, await_xform_data *xform)
static tree
transform_await_wrapper (tree *stmt, int *do_subtree, void *d)
{
+ /* Set actor function as new DECL_CONTEXT of label_decl. */
+ struct await_xform_data *xform = (struct await_xform_data *) d;
+ if (TREE_CODE (*stmt) == LABEL_DECL
+ && DECL_CONTEXT (*stmt) != xform->actor_fn)
+ DECL_CONTEXT (*stmt) = xform->actor_fn;
+
if (TREE_CODE (*stmt) != CO_AWAIT_EXPR && TREE_CODE (*stmt) != CO_YIELD_EXPR)
return NULL_TREE;
tree await_expr = *stmt;
- await_xform_data *xform = (await_xform_data *) d;
-
*stmt = transform_await_expr (await_expr, xform);
if (*stmt == error_mark_node)
*do_subtree = 0;
@@ -2018,7 +2023,7 @@ build_actor_fn (location_t loc, tree coro_frame_type, tree actor, tree fnbody,
decide where to put things. */
await_xform_data xform
- = {actor_frame, promise_proxy, ap, self_h_proxy, ash};
+ = {actor, actor_frame, promise_proxy, ap, self_h_proxy, ash};
/* Get a reference to the initial suspend var in the frame. */
transform_await_expr (initial_await, &xform);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 74cbead..5471778 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2020-02-03 Jun Ma <JunMa@linux.alibaba.com>
+
+ * g++.dg/coroutines/co-await-04-control-flow.C: Add label.
+
2020-02-02 Marek Polacek <polacek@redhat.com>
PR c++/93530 - ICE on invalid alignas in a template.
diff --git a/gcc/testsuite/g++.dg/coroutines/torture/co-await-04-control-flow.C b/gcc/testsuite/g++.dg/coroutines/torture/co-await-04-control-flow.C
index 9bc99e8..e8da2d2 100644
--- a/gcc/testsuite/g++.dg/coroutines/torture/co-await-04-control-flow.C
+++ b/gcc/testsuite/g++.dg/coroutines/torture/co-await-04-control-flow.C
@@ -16,9 +16,11 @@ coro1
f ()
{
if (gX < 12) {
+L1:
gX += y;
gX += co_await 11;
} else
+L2:
gX += co_await 12;
co_return gX;