From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2122) id 630B8385C421; Fri, 7 Oct 2022 13:52:59 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 630B8385C421 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1665150779; bh=0LmaowhgICCSOVJAGVF7+yAtyvHgmL1ISNIiyqU530s=; h=From:To:Subject:Date:From; b=sPVXiuXKLrCY3HJeLp2vMiSbE42Y+6XrvSleslJYNs0aU+Bx/JljG+K2XkYpvhDj0 qGfQxtDRYc8wgniv04C5TeVpbHMaENUZnGVrWkXi8XTAn0zTfcwQnZHfo7hy3DrxGf QfqDb2/9OMABvAkdfMkqSzlG4Za7x4Mk9gVPofwk= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jason Merrill To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-3165] c++: catch parm initialization tweak X-Act-Checkin: gcc X-Git-Author: Jason Merrill X-Git-Refname: refs/heads/master X-Git-Oldrev: 1a308905c1baf64d0ea4d09d7d92b55e79a2a339 X-Git-Newrev: f8ba88b6a811ca9bb4b8411d3f65c329fb480ee1 Message-Id: <20221007135259.630B8385C421@sourceware.org> Date: Fri, 7 Oct 2022 13:52:59 +0000 (GMT) List-Id: https://gcc.gnu.org/g:f8ba88b6a811ca9bb4b8411d3f65c329fb480ee1 commit r13-3165-gf8ba88b6a811ca9bb4b8411d3f65c329fb480ee1 Author: Jason Merrill Date: Thu Oct 6 21:10:52 2022 -0400 c++: catch parm initialization tweak 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. Diff: --- gcc/cp/init.cc | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/gcc/cp/init.cc b/gcc/cp/init.cc index bf46578c08b..0ab0aaabb16 100644 --- a/gcc/cp/init.cc +++ b/gcc/cp/init.cc @@ -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; }