https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101961
Bug ID: 101961 Summary: Missing returned object destructor call after exception throw Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: mbtrash at yandex dot ru Target Milestone: --- 14.3.2 Exception handling:Constructors and destructors:2 (https://eel.is/c++draft/except.ctor#2) says "If an exception is thrown during the destruction of temporaries or local variables for a return statement ([stmt.return]), the destructor for the returned object (if any) is also invoked" And it contains example (https://eel.is/c++draft/except.ctor#example-1) with description "...the local variable y is destroyed, causing stack unwinding, resulting in the destruction of the returned object, ..." Trying to recreate this example with following code #include <iostream> using namespace std; struct S{ int i = 123; S(int i) :i(i) {cout<<"S("<<i<<")"<<endl;} ~S() {cout<<"~S("<<i<<")"<<endl;} }; struct T { T() {cout<<"T()"<<endl;} ~T() noexcept(false) { cout<<"~T()"<<endl; throw 0; } }; S foo() { try { T t; return {3}; } catch (...){} return {4}; } int main() { foo(); } Output doesn't have S{3}'s (returned object) destruction line: T() S(3) ~T() S(4) ~S(4) while should be T() S(3) ~T() ~S(3) <-----! S(4) ~S(4) Link to godbolt: https://godbolt.org/z/hP9z5rYKG