Commit 800dac8f by Iain Sandoe

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)
parent 605e9b1a
...@@ -1490,19 +1490,13 @@ expand_one_await_expression (tree *stmt, tree *await_expr, void *d) ...@@ -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 resume_label = create_named_label_with_ctx (loc, buf, actor);
tree empty_list = build_empty_stmt (loc); tree empty_list = build_empty_stmt (loc);
tree dtor = NULL_TREE;
tree await_type = TREE_TYPE (var); 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 stmt_list = NULL;
tree t_expr = STRIP_NOPS (expr); tree t_expr = STRIP_NOPS (expr);
tree r; tree r;
tree *await_init = NULL; tree *await_init = NULL;
if (t_expr == var) if (t_expr == var)
dtor = NULL_TREE; needs_dtor = false;
else else
{ {
/* Initialize the var from the provided 'o' expression. */ /* Initialize the var from the provided 'o' expression. */
...@@ -1617,7 +1611,12 @@ expand_one_await_expression (tree *stmt, tree *await_expr, void *d) ...@@ -1617,7 +1611,12 @@ expand_one_await_expression (tree *stmt, tree *await_expr, void *d)
destroy_label = build_stmt (loc, LABEL_EXPR, destroy_label); destroy_label = build_stmt (loc, LABEL_EXPR, destroy_label);
append_to_statement_list (destroy_label, &body_list); append_to_statement_list (destroy_label, &body_list);
if (needs_dtor) 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); r = build1_loc (loc, GOTO_EXPR, void_type_node, data->cleanup);
append_to_statement_list (r, &body_list); append_to_statement_list (r, &body_list);
...@@ -1652,7 +1651,12 @@ expand_one_await_expression (tree *stmt, tree *await_expr, void *d) ...@@ -1652,7 +1651,12 @@ expand_one_await_expression (tree *stmt, tree *await_expr, void *d)
/* Get a pointer to the revised statment. */ /* Get a pointer to the revised statment. */
tree *revised = tsi_stmt_ptr (tsi_last (stmt_list)); tree *revised = tsi_stmt_ptr (tsi_last (stmt_list));
if (needs_dtor) 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; data->index += 2;
/* Replace the original statement with the expansion. */ /* Replace the original statement with the expansion. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment