From: Jason Merrill Date: Wed, 15 Jan 2020 19:13:13 +0000 (-0500) Subject: Revert "PR c++/33799 - destroy return value if local cleanup throws." X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=299ddc612136421f1d9865ea4f2f84f7e3791824;p=gcc.git 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 7c82dd6c02d44d9d2cd84dda137c00b1a3cd6c90. --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 95eb2a7d765..4a155795493 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2020-01-15 Jason Merrill + 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 4e26acc22a5..2b08d1b50cd 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 52da0deef40..094e32edf58 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 2be4e2462c0..8955442349f 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 7469d3128dc..ca0b8046e1b 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();