blob: e42cc722beee90a652981913d9c6e424b54f3c97 [file] [log] [blame]
#include <iostream>
#include <string>
#define DECL_ATTR_FUNC(FUNC) \
void FUNC() __attribute__((noinline)); \
void FUNC()
#define DECLARE_FUNC(FUNC) \
DECL_ATTR_FUNC(throw_ ## FUNC)
#define DECLARE_RETHROW_FUNC(TYPE) \
DECL_ATTR_FUNC(rethrow_ ## TYPE) { \
try { \
throw_ ## TYPE (); \
} catch (TYPE e) { \
std::cout << "Rethrowing: " << e << "\n"; \
throw; \
} \
}
DECLARE_FUNC(char) {
char c = 'a';
std::cout << "Throwing char: " << c << "\n";
throw c;
}
DECLARE_RETHROW_FUNC(char)
DECLARE_FUNC(int) {
int i = 37;
std::cout << "Throwing int: " << i << "\n";
throw i;
}
DECLARE_RETHROW_FUNC(int)
DECLARE_FUNC(float) {
float f = 37.927;
std::cout << "Throwing float: " << f << "\n";
throw f;
}
DECLARE_RETHROW_FUNC(float)
DECLARE_FUNC(double) {
double d = 37.927;
std::cout << "Throwing double: " << d << "\n";
throw d;
}
DECLARE_RETHROW_FUNC(double)
DECLARE_FUNC(string) {
std::string s = "hello world";
std::cout << "Throwing std::string: " << s << "\n";
throw s;
}
DECL_ATTR_FUNC(rethrow_string) {
try {
throw_string();
} catch (const std::string &s) {
std::cout << "Rethrowing: " << s << "\n";
throw;
}
}
struct A {};
DECLARE_FUNC(A) {
std::cout << "Throwing A\n";
throw A();
}
DECL_ATTR_FUNC(rethrow_A) {
try {
throw_A();
} catch (const A &) {
std::cout << "Rethrowing A\n";
throw;
}
}
int main() {
try {
rethrow_char();
} catch (char e) {
std::cout << "Caught char: " << e << "\n";
}
try {
rethrow_int();
} catch (int e) {
std::cout << "Caught int: " << e << "\n";
}
try {
rethrow_float();
} catch (float e) {
std::cout << "Caught float: " << e << "\n";
}
try {
rethrow_double();
} catch (double e) {
std::cout << "Caught double: " << e << "\n";
}
try {
rethrow_string();
} catch (const std::string &e) {
std::cout << "Caught std::string: " << e << "\n";
}
try {
rethrow_A();
} catch (const A &) {
std::cout << "Caught A\n";
}
}