#include <iostream>
#include <ostream>
#include <functional>
#include <exception>
using namespace std;
// Wrong scope(failure)
class FailBlockT
{
typedef function<void()> T;
public:
T t;
FailBlockT(T t)
{
this->t=t;
}
~FailBlockT()
{
if (std::uncaught_exception())
{
t();
}
}
};
struct Test
{
~Test()
{
try
{
FailBlockT f([]()
{
cout << "failure" << endl;
});
// there is no any exception here, but "failure" is printed.
// See output below
}
catch(...)
{
cout << "some exception" << endl;
}
}
};
int main()
{
try
{
Test t;
throw 1;
}
catch(int){}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8b3N0cmVhbT4KI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxleGNlcHRpb24+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBXcm9uZyBzY29wZShmYWlsdXJlKQpjbGFzcyBGYWlsQmxvY2tUCnsKICAgIHR5cGVkZWYgZnVuY3Rpb248dm9pZCgpPiBUOwogICAgcHVibGljOgogICAgVCB0OwogICAgRmFpbEJsb2NrVChUIHQpCiAgICB7CiAgICAgICAgdGhpcy0+dD10OwogICAgfQogICAgfkZhaWxCbG9ja1QoKQogICAgewogICAgICAgIGlmIChzdGQ6OnVuY2F1Z2h0X2V4Y2VwdGlvbigpKQogICAgICAgIHsKICAgICAgICAgICAgdCgpOwogICAgICAgIH0KICAgIH0KfTsKCnN0cnVjdCBUZXN0CnsKICAgIH5UZXN0KCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIEZhaWxCbG9ja1QgZihbXSgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvdXQgPDwgImZhaWx1cmUiIDw8IGVuZGw7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBhbnkgZXhjZXB0aW9uIGhlcmUsIGJ1dCAiZmFpbHVyZSIgaXMgcHJpbnRlZC4KICAgICAgICAgICAgLy8gU2VlIG91dHB1dCBiZWxvdwogICAgICAgIH0KICAgICAgICBjYXRjaCguLi4pCiAgICAgICAgewogICAgICAgICAgICBjb3V0IDw8ICJzb21lIGV4Y2VwdGlvbiIgPDwgZW5kbDsKICAgICAgICB9CiAgICB9Cn07CgppbnQgbWFpbigpCnsKICAgIHRyeQogICAgewogICAgICAgIFRlc3QgdDsKICAgICAgICB0aHJvdyAxOwogICAgfQogICAgY2F0Y2goaW50KXt9CiAgICByZXR1cm4gMDsKfQ==