From c3ccce5b47f85d70127f5bb894bc5e83f8d2510e Mon Sep 17 00:00:00 2001 From: JunMa Date: Mon, 20 Jan 2020 17:46:32 +0800 Subject: [PATCH] coroutines: Bind label_decl of original function to actor function gcc/cp * coroutines.cc (transform_await_wrapper): Set actor funcion as new context of label_decl. (build_actor_fn): Fill new field of await_xform_data. gcc/testsuite * g++.dg/coroutines/co-await-04-control-flow.C: Add label. --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/coroutines.cc | 11 ++++++++--- gcc/testsuite/ChangeLog | 4 ++++ .../g++.dg/coroutines/torture/co-await-04-control-flow.C | 2 ++ 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 + + * 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 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 *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 + + * g++.dg/coroutines/co-await-04-control-flow.C: Add label. + 2020-02-02 Marek Polacek 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; -- 2.7.4