#include <string>
#include <iostream>
struct Exception
{
std::string what;
Exception(const std::string & what_) : what(what_) {}
};
std::string f()
{
throw Exception("Hello, world!");
}
void g()
{
try
{
f();
}
catch (...)
{
throw Exception(f());
}
}
int main(int argc, char ** argv)
{
try
{
g();
}
catch (const Exception & e)
{
std::cerr << e.what << std::endl;
}
/// returns 1 in gcc 4.6.3, 4.8.1 - bug
std::cerr << std::uncaught_exception() << std::endl;
return 0;
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKCnN0cnVjdCBFeGNlcHRpb24KewogICAgICAgIHN0ZDo6c3RyaW5nIHdoYXQ7CiAgICAgICAgRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nICYgd2hhdF8pIDogd2hhdCh3aGF0Xykge30KfTsKCgpzdGQ6OnN0cmluZyBmKCkKewogICAgICAgIHRocm93IEV4Y2VwdGlvbigiSGVsbG8sIHdvcmxkISIpOwp9Cgp2b2lkIGcoKQp7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICAgICAgZigpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoLi4uKQogICAgICAgIHsKICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbihmKCkpOwogICAgICAgIH0KfQoKCmludCBtYWluKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpCnsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgICAgICBnKCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChjb25zdCBFeGNlcHRpb24gJiBlKQogICAgICAgIHsKICAgICAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCBlLndoYXQgPDwgc3RkOjplbmRsOwogICAgICAgIH0KCiAgICAgICAgLy8vIHJldHVybnMgMSBpbiBnY2MgNC42LjMsIDQuOC4xIC0gYnVnCiAgICAgICAgc3RkOjpjZXJyIDw8IHN0ZDo6dW5jYXVnaHRfZXhjZXB0aW9uKCkgPDwgc3RkOjplbmRsOwoKICAgICAgICByZXR1cm4gMDsKfQ==