From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2122) id B7CBB385E000; Wed, 24 Jan 2024 19:39:11 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B7CBB385E000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1706125151; bh=WFBQBvRpkKoMXFUvivgiwEL+tB46JKMfJ08BsPY3eZY=; h=From:To:Subject:Date:From; b=QJzykKs3e5+y0rxTAGoN9cESYVL2WThwsAAF4f+2XWLDy7nkFCWOqkr+dLltYeIdh N01xICv+TZSEyRbnDKMvt5FUFuJMcTmp7Ldwzo0Jo0dKUnZgsfITRAjzyslvU8x+M6 Ezhp/LmWRQCvRu8YbnefAX8nAjgMemvIkZxlJip8= 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-8249] c++: throwing cleanup after return [PR113347] X-Act-Checkin: gcc X-Git-Author: Jason Merrill X-Git-Refname: refs/heads/releases/gcc-13 X-Git-Oldrev: fcc06cf83a9571a0745fcde83d955eb7d7f16910 X-Git-Newrev: 713fbaff8b17a01d3b72110f89112851ed43a90a Message-Id: <20240124193911.B7CBB385E000@sourceware.org> Date: Wed, 24 Jan 2024 19:39:11 +0000 (GMT) List-Id: https://gcc.gnu.org/g:713fbaff8b17a01d3b72110f89112851ed43a90a commit r13-8249-g713fbaff8b17a01d3b72110f89112851ed43a90a Author: Jason Merrill Date: Tue Jan 23 15:41:09 2024 -0500 c++: throwing cleanup after return [PR113347] Here we were assuming that current_retval_sentinel would be set if we have seen a throwing cleanup, but that's not the case if the cleanup is after all returns. This change isn't needed on trunk, where current_retval_sentinel is set for all NRV functions. PR c++/113347 gcc/cp/ChangeLog: * semantics.cc (finalize_nrv_r): Handle null current_retval_sentinel. gcc/testsuite/ChangeLog: * g++.dg/eh/return3.C: New test. Diff: --- gcc/cp/semantics.cc | 3 ++- gcc/testsuite/g++.dg/eh/return3.C | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc index 02838775003..ff5252905fe 100644 --- a/gcc/cp/semantics.cc +++ b/gcc/cp/semantics.cc @@ -4953,7 +4953,8 @@ finalize_nrv_r (tree* tp, int* walk_subtrees, void* data) /* If a cleanup might throw, we need to clear current_retval_sentinel on the exception path so an outer cleanup added by maybe_splice_retval_cleanup doesn't run. */ - if (cp_function_chain->throwing_cleanup) + if (current_retval_sentinel + && cp_function_chain->throwing_cleanup) { tree clear = build2 (MODIFY_EXPR, boolean_type_node, current_retval_sentinel, diff --git a/gcc/testsuite/g++.dg/eh/return3.C b/gcc/testsuite/g++.dg/eh/return3.C new file mode 100644 index 00000000000..76aa50d523d --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/return3.C @@ -0,0 +1,17 @@ +// PR c++/113347 + +#if __cplusplus < 201103L +#define THROWS +#else +#define THROWS noexcept(false) +#endif + +struct A { ~A(); }; +struct B { ~B() THROWS; }; + +A f() +{ + A a; + return a; + B(); +}