https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103984

--- Comment #14 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Wonder about:
--- gcc/gimplify.cc.jj  2022-03-04 15:14:53.197812540 +0100
+++ gcc/gimplify.cc     2022-03-15 17:44:45.110734179 +0100
@@ -6997,8 +6997,6 @@ gimplify_target_expr (tree *expr_p, gimp

   if (init)
     {
-      tree cleanup = NULL_TREE;
-
       /* TARGET_EXPR temps aren't part of the enclosing block, so add it
         to the temps list.  Handle also variable length TARGET_EXPRs.  */
       if (!poly_int_tree_p (DECL_SIZE (temp)))
@@ -7019,37 +7017,6 @@ gimplify_target_expr (tree *expr_p, gimp
          gimple_add_tmp_var (temp);
        }

-      /* If TARGET_EXPR_INITIAL is void, then the mere evaluation of the
-        expression is supposed to initialize the slot.  */
-      if (VOID_TYPE_P (TREE_TYPE (init)))
-       ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt, fb_none);
-      else
-       {
-         tree init_expr = build2 (INIT_EXPR, void_type_node, temp, init);
-         init = init_expr;
-         ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt, fb_none);
-         init = NULL;
-         ggc_free (init_expr);
-       }
-      if (ret == GS_ERROR)
-       {
-         /* PR c++/28266 Make sure this is expanded only once. */
-         TARGET_EXPR_INITIAL (targ) = NULL_TREE;
-         return GS_ERROR;
-       }
-      if (init)
-       gimplify_and_add (init, pre_p);
-
-      /* If needed, push the cleanup for the temp.  */
-      if (TARGET_EXPR_CLEANUP (targ))
-       {
-         if (CLEANUP_EH_ONLY (targ))
-           gimple_push_cleanup (temp, TARGET_EXPR_CLEANUP (targ),
-                                CLEANUP_EH_ONLY (targ), pre_p);
-         else
-           cleanup = TARGET_EXPR_CLEANUP (targ);
-       }
-
       /* Add a clobber for the temporary going out of scope, like
         gimplify_bind_expr.  */
       if (gimplify_ctxp->in_cleanup_point_expr
@@ -7079,8 +7046,32 @@ gimplify_target_expr (tree *expr_p, gimp
                }
            }
        }
-      if (cleanup)
-       gimple_push_cleanup (temp, cleanup, false, pre_p);
+
+      /* If TARGET_EXPR_INITIAL is void, then the mere evaluation of the
+        expression is supposed to initialize the slot.  */
+      if (VOID_TYPE_P (TREE_TYPE (init)))
+       ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt, fb_none);
+      else
+       {
+         tree init_expr = build2 (INIT_EXPR, void_type_node, temp, init);
+         init = init_expr;
+         ret = gimplify_expr (&init, pre_p, post_p, is_gimple_stmt, fb_none);
+         init = NULL;
+         ggc_free (init_expr);
+       }
+      if (ret == GS_ERROR)
+       {
+         /* PR c++/28266 Make sure this is expanded only once. */
+         TARGET_EXPR_INITIAL (targ) = NULL_TREE;
+         return GS_ERROR;
+       }
+      if (init)
+       gimplify_and_add (init, pre_p);
+
+      /* If needed, push the cleanup for the temp.  */
+      if (TARGET_EXPR_CLEANUP (targ))
+       gimple_push_cleanup (temp, TARGET_EXPR_CLEANUP (targ),
+                            CLEANUP_EH_ONLY (targ), pre_p);

       /* Only expand this once.  */
       TREE_OPERAND (targ, 3) = init;
i.e. emitting the clobber gimple_push_cleanup for the TARGET_EXPRs before the
gimplification of the TARGET_EXPR_INITIAL instead of after it (and emitting the
WCE earlier means the cleanup is later (as in, outer try/finally).

Reply via email to