[gcc/devel/omp/gcc-10] coroutines: Ensure distinct DTOR trees [PR95137].

Tobias Burnus burnus@gcc.gnu.org
Mon Jun 15 15:51:31 GMT 2020


https://gcc.gnu.org/g:800dac8fca3cf75512913e380df339fa2253ba76

commit 800dac8fca3cf75512913e380df339fa2253ba76
Author: Iain Sandoe <iain@sandoe.co.uk>
Date:   Thu Jun 11 14:11:14 2020 +0100

    coroutines: Ensure distinct DTOR trees [PR95137].
    
    Part of the PR notes that there are UBSAN fails for the coroutines
    test suite.  These are primarily related to the use of the same DTOR
    tree in the two edges from the await block.  Fixed by building a new
    tree for each.
    
    gcc/cp/ChangeLog:
    
            PR c++/95137
            * coroutines.cc (expand_one_await_expression): Build separate
            DTOR trees for the awaitable object on the destroy and resume
            paths.
    
    (cherry picked from commit 006f28aefeb3be575239beddc7febe56dff463a2)

Diff:
---
 gcc/cp/coroutines.cc | 22 +++++++++++++---------
 1 file changed, 13 insertions(+), 9 deletions(-)

diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc
index a1eb6ddb234..a9cee714601 100644
--- a/gcc/cp/coroutines.cc
+++ b/gcc/cp/coroutines.cc
@@ -1490,19 +1490,13 @@ expand_one_await_expression (tree *stmt, tree *await_expr, void *d)
   tree resume_label = create_named_label_with_ctx (loc, buf, actor);
   tree empty_list = build_empty_stmt (loc);
 
-  tree dtor = NULL_TREE;
   tree await_type = TREE_TYPE (var);
-  if (needs_dtor)
-    dtor = build_special_member_call (var, complete_dtor_identifier, NULL,
-				      await_type, LOOKUP_NORMAL,
-				      tf_warning_or_error);
-
   tree stmt_list = NULL;
   tree t_expr = STRIP_NOPS (expr);
   tree r;
   tree *await_init = NULL;
   if (t_expr == var)
-    dtor = NULL_TREE;
+    needs_dtor = false;
   else
     {
       /* Initialize the var from the provided 'o' expression.  */
@@ -1617,7 +1611,12 @@ expand_one_await_expression (tree *stmt, tree *await_expr, void *d)
   destroy_label = build_stmt (loc, LABEL_EXPR, destroy_label);
   append_to_statement_list (destroy_label, &body_list);
   if (needs_dtor)
-    append_to_statement_list (dtor, &body_list);
+    {
+      tree dtor = build_special_member_call (var, complete_dtor_identifier,
+					     NULL, await_type, LOOKUP_NORMAL,
+					     tf_warning_or_error);
+      append_to_statement_list (dtor, &body_list);
+    }
   r = build1_loc (loc, GOTO_EXPR, void_type_node, data->cleanup);
   append_to_statement_list (r, &body_list);
 
@@ -1652,7 +1651,12 @@ expand_one_await_expression (tree *stmt, tree *await_expr, void *d)
   /* Get a pointer to the revised statment.  */
   tree *revised = tsi_stmt_ptr (tsi_last (stmt_list));
   if (needs_dtor)
-    append_to_statement_list (dtor, &stmt_list);
+    {
+      tree dtor = build_special_member_call (var, complete_dtor_identifier,
+					     NULL, await_type, LOOKUP_NORMAL,
+					     tf_warning_or_error);
+      append_to_statement_list (dtor, &stmt_list);
+    }
   data->index += 2;
 
   /* Replace the original statement with the expansion.  */


More information about the Gcc-cvs mailing list