/* { dg-require-effective-target indirect_jumps } */ | |
#include <setjmp.h> | |
extern void abort (void); | |
extern void exit (int); | |
static jmp_buf env; | |
void baz (void) | |
{ | |
__asm__ volatile ("" : : : "memory"); | |
} | |
static inline int g(int x) | |
{ | |
if (x) | |
{ | |
baz(); | |
return 0; | |
} | |
else | |
{ | |
baz(); | |
return 1; | |
} | |
} | |
int f(int *e) | |
{ | |
if (*e) | |
return 1; | |
int x = setjmp(env); | |
int n = g(x); | |
if (n == 0) | |
exit(0); | |
if (x) | |
abort(); | |
longjmp(env, 42); | |
} | |
int main(int argc, char** argv) | |
{ | |
int v = 0; | |
return f(&v); | |
} |