#include <exception>
#include <iostream>
#include <stdexcept>
template<typename E>
void rethrow_unwrapped(const E& e)
{
try {
std::rethrow_if_nested(e);
} catch(const std::nested_exception& e) {
rethrow_unwrapped(e);
} catch(...) {
throw;
}
}
void foo();
int main()
{
try {
foo();
} catch(const std::exception& e) {
try {
rethrow_unwrapped(e);
} catch (const std::logic_error& e) {
std::cout << "success! unwrapped to logic_error" << std::endl;
}
}
return 0;
}
void never_called()
{
throw std::logic_error("never_called() was called");
}
void throws_with_nested()
{
try {
never_called();
} catch (...) {
std::throw_with_nested( std::runtime_error("something broke") );
}
}
void foo()
{
try {
throws_with_nested();
} catch (...) {
std::throw_with_nested( std::runtime_error("oops") );
}
}
I2luY2x1ZGUgPGV4Y2VwdGlvbj4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RkZXhjZXB0PgoKdGVtcGxhdGU8dHlwZW5hbWUgRT4Kdm9pZCByZXRocm93X3Vud3JhcHBlZChjb25zdCBFJiBlKQp7CiAgICB0cnkgewogICAgICAgIHN0ZDo6cmV0aHJvd19pZl9uZXN0ZWQoZSk7CiAgICB9IGNhdGNoKGNvbnN0IHN0ZDo6bmVzdGVkX2V4Y2VwdGlvbiYgZSkgewogICAgICAgIHJldGhyb3dfdW53cmFwcGVkKGUpOwogICAgfSBjYXRjaCguLi4pIHsKICAgICAgICB0aHJvdzsKICAgIH0KfQoKdm9pZCBmb28oKTsKCmludCBtYWluKCkKewogICAgdHJ5IHsKICAgICAgICBmb28oKTsKICAgIH0gY2F0Y2goY29uc3Qgc3RkOjpleGNlcHRpb24mIGUpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICByZXRocm93X3Vud3JhcHBlZChlKTsKICAgICAgICB9IGNhdGNoIChjb25zdCBzdGQ6OmxvZ2ljX2Vycm9yJiBlKSB7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAic3VjY2VzcyEgdW53cmFwcGVkIHRvIGxvZ2ljX2Vycm9yIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAwOwp9Cgp2b2lkIG5ldmVyX2NhbGxlZCgpCnsKICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoIm5ldmVyX2NhbGxlZCgpIHdhcyBjYWxsZWQiKTsKfQoKdm9pZCB0aHJvd3Nfd2l0aF9uZXN0ZWQoKQp7CiAgICB0cnkgewogICAgICAgIG5ldmVyX2NhbGxlZCgpOwogICAgfSBjYXRjaCAoLi4uKSB7CiAgICAgICAgc3RkOjp0aHJvd193aXRoX25lc3RlZCggc3RkOjpydW50aW1lX2Vycm9yKCJzb21ldGhpbmcgYnJva2UiKSApOwogICAgfQp9Cgp2b2lkIGZvbygpCnsKICAgIHRyeSB7CiAgICAgICAgdGhyb3dzX3dpdGhfbmVzdGVkKCk7CiAgICB9IGNhdGNoICguLi4pIHsKICAgICAgICBzdGQ6OnRocm93X3dpdGhfbmVzdGVkKCBzdGQ6OnJ1bnRpbWVfZXJyb3IoIm9vcHMiKSApOwogICAgfQp9