10 static volatile uint64_t
sink;
14 __asm__ __volatile__(
"" :::
"memory");
sink ^= (uint64_t)i;
16 extern "C" __attribute__((noinline))
void poly_catch_marker(
int i) {
17 __asm__ __volatile__(
"" :::
"memory");
sink ^= (uint64_t)i << 8;
20 struct Base : std::exception {
const char*
what()
const noexcept
override {
return "Base"; } };
21 struct Mid :
Base {
const char*
what()
const noexcept
override {
return "Mid"; } };
22 struct Leaf :
Mid {
const char*
what()
const noexcept
override {
return "Leaf"; } };
33 int main(
int argc,
char** argv) {
34 (void)argc; (void)argv;
36 for (
int i = 0; i <
ITERS; ++i) {
40 }
catch (
const std::exception& e) {
43 caught += (e.what() !=
nullptr);
47 fprintf(stderr,
"exc_polymorphic: caught=%d iters=%d sink=%llx\n",
49 return caught ==
ITERS ? 0 : 1;
int main(int argc, char **argv)
static uint64_t buf[ITERS]
__attribute__((noinline)) void poly_try_marker(int i)
static void thrower(int i)
static volatile uint64_t sink
const char * what() const noexcept override
const char * what() const noexcept override
const char * what() const noexcept override