Revert "PR c++/33799 - destroy return value if local cleanup throws."
authorJason Merrill <jason@redhat.com>
Wed, 15 Jan 2020 19:13:13 +0000 (14:13 -0500)
committerJason Merrill <jason@redhat.com>
Wed, 15 Jan 2020 20:12:45 +0000 (15:12 -0500)
This change was blocking the coroutines merge, so I'm backing it out for now
to adjust my approach.

This reverts commit 7c82dd6c02d44d9d2cd84dda137c00b1a3cd6c90.

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/typeck.c
gcc/testsuite/g++.dg/eh/return1.C

index 95eb2a7d765d3fc5c1aca33843f5970ae6a7a617..4a155795493ca94c9e31b8eddfa7ac676338e8c7 100644 (file)
@@ -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.
 
index 4e26acc22a5d899266bd978bbd3617b8e6778ee7..2b08d1b50cd822d38adf49d85e63f3ad5373675d 100644 (file)
@@ -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.  */
 
index 52da0deef40b1915acbc66d5f9b62071239dd3c9..094e32edf5868b04ede566ddaa3a8eb7b82bf3a2 100644 (file)
@@ -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;
 }
 
index 2be4e2462c09a3de54186b36dc07de454b08ee2c..8955442349f903632fc06f7f586a1f05c97b0cff 100644 (file)
@@ -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;
 }
 
index 7469d3128dca7ae77748f95af8dd1441a09da2c1..ca0b8046e1b3967aed29a291e5ad90620e7cb4ef 100644 (file)
@@ -1,5 +1,5 @@
 // PR c++/33799
-// { dg-do run }
+// { dg-do run { xfail *-*-* } }
 
 extern "C" void abort();