]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: catch parm initialization tweak
authorJason Merrill <jason@redhat.com>
Fri, 7 Oct 2022 01:10:52 +0000 (21:10 -0400)
committerJason Merrill <jason@redhat.com>
Fri, 7 Oct 2022 13:52:52 +0000 (09:52 -0400)
We want to push the INIT_EXPR inside the CLEANUP_POINT_EXPR for the same
reason we want to push it into the MUST_NOT_THROW_EXPR: any cleanups follow
the initialization.

gcc/cp/ChangeLog:

* init.cc (expand_default_init): Also push the INIT_EXPR inside a
CLEANUP_POINT_EXPR.

gcc/cp/init.cc

index bf46578c08b1a4c4a5f990c1f3e016da708d8d89..0ab0aaabb16b2d6189e6c3179314f35506ae508e 100644 (file)
@@ -2124,19 +2124,20 @@ expand_default_init (tree binfo, tree true_exp, tree exp, tree init, int flags,
            return false;
        }
 
-      if (TREE_CODE (init) == MUST_NOT_THROW_EXPR)
-       /* We need to protect the initialization of a catch parm with a
-          call to terminate(), which shows up as a MUST_NOT_THROW_EXPR
-          around the TARGET_EXPR for the copy constructor.  See
-          initialize_handler_parm.  */
+      /* We need to protect the initialization of a catch parm with a
+        call to terminate(), which shows up as a MUST_NOT_THROW_EXPR
+        around the TARGET_EXPR for the copy constructor.  See
+        initialize_handler_parm.  */
+      tree *p = &init;
+      while (TREE_CODE (*p) == MUST_NOT_THROW_EXPR
+            || TREE_CODE (*p) == CLEANUP_POINT_EXPR)
        {
-         TREE_OPERAND (init, 0) = build2 (INIT_EXPR, TREE_TYPE (exp), exp,
-                                          TREE_OPERAND (init, 0));
-         TREE_TYPE (init) = void_type_node;
+         /* Avoid voidify_wrapper_expr making a temporary.  */
+         TREE_TYPE (*p) = void_type_node;
+         p = &TREE_OPERAND (*p, 0);
        }
-      else
-       init = build2 (INIT_EXPR, TREE_TYPE (exp), exp, init);
-      TREE_SIDE_EFFECTS (init) = 1;
+      *p = build2 (INIT_EXPR, TREE_TYPE (exp), exp, *p);
+      TREE_SIDE_EFFECTS (*p) = 1;
       finish_expr_stmt (init);
       return true;
     }