diff options
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 7 | ||||
-rw-r--r-- | gcc/cp/decl.c | 14 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/eh/return1.C | 2 |
5 files changed, 7 insertions, 31 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 95eb2a7..4a15579 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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. diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 4e26acc..2b08d1b 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -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. */ diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 52da0de..094e32e 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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; } diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 2be4e24..8955442 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -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; } diff --git a/gcc/testsuite/g++.dg/eh/return1.C b/gcc/testsuite/g++.dg/eh/return1.C index 7469d31..ca0b804 100644 --- a/gcc/testsuite/g++.dg/eh/return1.C +++ b/gcc/testsuite/g++.dg/eh/return1.C @@ -1,5 +1,5 @@ // PR c++/33799 -// { dg-do run } +// { dg-do run { xfail *-*-* } } extern "C" void abort(); |