diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/coroutines.cc | 20 |
2 files changed, 20 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 50f1857..e63f30b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2020-04-08 Iain Sandoe <iain@sandoe.co.uk> + Jun Ma <JunMa@linux.alibaba.com> + + * coroutines.cc (maybe_promote_captured_temps): Add a cleanup + expression, if needed, to any call from which we promoted + temporaries captured by reference. + 2020-04-08 Marek Polacek <polacek@redhat.com> PR c++/94507 - ICE-on-invalid with lambda template. diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc index 983fa65..936be06 100644 --- a/gcc/cp/coroutines.cc +++ b/gcc/cp/coroutines.cc @@ -2798,11 +2798,13 @@ maybe_promote_captured_temps (tree *stmt, void *d) location_t sloc = EXPR_LOCATION (*stmt); tree aw_bind = build3_loc (sloc, BIND_EXPR, void_type_node, NULL, NULL, NULL); - tree aw_statement_current; - if (TREE_CODE (*stmt) == CLEANUP_POINT_EXPR) - aw_statement_current = TREE_OPERAND (*stmt, 0); - else - aw_statement_current = *stmt; + + /* Any cleanup point expression might no longer be necessary, since we + are removing one or more temporaries. */ + tree aw_statement_current = *stmt; + if (TREE_CODE (aw_statement_current) == CLEANUP_POINT_EXPR) + aw_statement_current = TREE_OPERAND (aw_statement_current, 0); + /* Collected the scope vars we need move the temps to regular. */ tree aw_bind_body = push_stmt_list (); tree varlist = NULL_TREE; @@ -2843,8 +2845,12 @@ maybe_promote_captured_temps (tree *stmt, void *d) /* Replace all instances of that temp in the original expr. */ cp_walk_tree (&aw_statement_current, replace_proxy, &pr, NULL); } - /* What's left should be the original statement with any temporaries - broken out. */ + + /* What's left should be the original statement with any co_await + captured temporaries broken out. Other temporaries might remain + so see if we need to wrap the revised statement in a cleanup. */ + aw_statement_current = + maybe_cleanup_point_expr_void (aw_statement_current); add_stmt (aw_statement_current); BIND_EXPR_BODY (aw_bind) = pop_stmt_list (aw_bind_body); awpts->captured_temps.empty (); |