Revert "PR c++/33799 - destroy return value if local cleanup throws."
This change was blocking the coroutines merge, so I'm backing it out for now
to adjust my approach.
This reverts commit 7c82dd6c02
.
This commit is contained in:
parent
596334fa04
commit
299ddc6121
5 changed files with 7 additions and 31 deletions
|
@ -1,5 +1,11 @@
|
|||
2020-01-15 Jason Merrill <jason@redhat.com>
|
||||
|
||||
Revert
|
||||
PR c++/33799 - destroy return value if local cleanup throws.
|
||||
* cp-tree.h (current_retval_sentinel): New macro.
|
||||
* decl.c (start_preparsed_function): Set up cleanup for retval.
|
||||
* typeck.c (check_return_expr): Set current_retval_sentinel.
|
||||
|
||||
PR c++/93257 - consteval void function.
|
||||
* constexpr.c (verify_constant): Allow void_node.
|
||||
|
||||
|
|
|
@ -1954,13 +1954,6 @@ struct GTY(()) language_function {
|
|||
|
||||
#define current_vtt_parm cp_function_chain->x_vtt_parm
|
||||
|
||||
/* A boolean flag to control whether we need to clean up the return value if a
|
||||
local destructor throws. Only used in functions that return by value a
|
||||
class with a destructor. Which 'tors don't, so we can use the same
|
||||
field as current_vtt_parm. */
|
||||
|
||||
#define current_retval_sentinel current_vtt_parm
|
||||
|
||||
/* Set to 0 at beginning of a function definition, set to 1 if
|
||||
a return statement that specifies a return value is seen. */
|
||||
|
||||
|
|
|
@ -16418,20 +16418,6 @@ start_preparsed_function (tree decl1, tree attrs, int flags)
|
|||
if (!DECL_OMP_DECLARE_REDUCTION_P (decl1))
|
||||
start_lambda_scope (decl1);
|
||||
|
||||
/* If cleaning up locals on return throws an exception, we need to destroy
|
||||
the return value that we just constructed. */
|
||||
if (!processing_template_decl
|
||||
&& TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (TREE_TYPE (decl1))))
|
||||
{
|
||||
tree retval = DECL_RESULT (decl1);
|
||||
tree dtor = build_cleanup (retval);
|
||||
current_retval_sentinel = get_temp_regvar (boolean_type_node,
|
||||
boolean_false_node);
|
||||
dtor = build3 (COND_EXPR, void_type_node, current_retval_sentinel,
|
||||
dtor, void_node);
|
||||
push_cleanup (retval, dtor, /*eh-only*/true);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -10090,15 +10090,6 @@ check_return_expr (tree retval, bool *no_warning)
|
|||
if (retval && retval != result)
|
||||
retval = build2 (INIT_EXPR, TREE_TYPE (result), result, retval);
|
||||
|
||||
if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (valtype)
|
||||
/* FIXME doesn't work with deduced return type. */
|
||||
&& current_retval_sentinel)
|
||||
{
|
||||
tree set = build2 (MODIFY_EXPR, boolean_type_node,
|
||||
current_retval_sentinel, boolean_true_node);
|
||||
retval = build2 (COMPOUND_EXPR, void_type_node, retval, set);
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// PR c++/33799
|
||||
// { dg-do run }
|
||||
// { dg-do run { xfail *-*-* } }
|
||||
|
||||
extern "C" void abort();
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue