-
Notifications
You must be signed in to change notification settings - Fork 13.5k
Missing returned object destructor call after exception throw #50865
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
Duplicate of #12658 |
@llvm/issue-subscribers-c-1
| | |
| --- | --- |
| Bugzilla Link | [51523](https://llvm.org/bz51523) |
| Version | trunk |
| OS | Linux |
| Reporter | LLVM Bugzilla Contributor |
Extended Description14.3.2 Exception handling:Constructors and destructors:2 (https://eel.is/c++draft/except.ctor#2) And it contains example (https://eel.is/c++draft/except.ctor#example-1) with description Trying to recreate this example with following code #include <iostream> struct S{ struct T { S foo() { int main() { Output doesn't have S{3}'s (returned object) destruction line: while should be Link to godbolt: |
@llvm/issue-subscribers-clang-codegen
| | |
| --- | --- |
| Bugzilla Link | [51523](https://llvm.org/bz51523) |
| Version | trunk |
| OS | Linux |
| Reporter | LLVM Bugzilla Contributor |
Extended Description14.3.2 Exception handling:Constructors and destructors:2 (https://eel.is/c++draft/except.ctor#2) And it contains example (https://eel.is/c++draft/except.ctor#example-1) with description Trying to recreate this example with following code #include <iostream> struct S{ struct T { S foo() { int main() { Output doesn't have S{3}'s (returned object) destruction line: while should be Link to godbolt: |
Extended Description
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
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/YrasqsvMe
The text was updated successfully, but these errors were encountered: