c++: fix throwing cleanup with label
commit08cea4e56a094ff9cc7c65fdc9ce8c4d7aff64be
authorJason Merrill <jason@redhat.com>
Tue, 6 Jun 2023 19:31:23 +0000 (6 15:31 -0400)
committerJason Merrill <jason@redhat.com>
Wed, 7 Jun 2023 01:30:31 +0000 (6 21:30 -0400)
tree02ed204b5c66f3d0d84d29756d18cdc95990c47b
parent0fa9495553e0e0f4ceb764880b5bdd8ade197382
c++: fix throwing cleanup with label

While looking at PR92407 I noticed that the expectations of
maybe_splice_retval_cleanup weren't being met; an sk_cleanup level was
confusing its attempt to recognize the outer block of the function.  And
even if I fixed the detection, it failed to actually wrap the body of the
function because the STATEMENT_LIST it got only had the label, not anything
after it.  So I moved the call after poplevel does pop_stmt_list on all the
sk_cleanup levels.

PR c++/33799

gcc/cp/ChangeLog:

* except.cc (maybe_splice_retval_cleanup): Change
recognition of function body and try scopes.
* semantics.cc (do_poplevel): Call it after poplevel.
(at_try_scope): New.
* cp-tree.h (maybe_splice_retval_cleanup): Adjust.

gcc/testsuite/ChangeLog:

* g++.dg/eh/return1.C: Add label cases.
gcc/cp/cp-tree.h
gcc/cp/except.cc
gcc/cp/semantics.cc
gcc/testsuite/g++.dg/eh/return1.C