| /* PR tree-optimization/60003 */ |
| /* { dg-require-effective-target indirect_jumps } */ |
| |
| extern void abort (void); |
| |
| unsigned long long jmp_buf[5]; |
| |
| __attribute__((noinline, noclone)) void |
| baz (void) |
| { |
| __builtin_longjmp (&jmp_buf, 1); |
| } |
| |
| void |
| bar (void) |
| { |
| baz (); |
| } |
| |
| __attribute__((noinline, noclone)) int |
| foo (int x) |
| { |
| int a = 0; |
| |
| if (__builtin_setjmp (&jmp_buf) == 0) |
| { |
| while (1) |
| { |
| a = 1; |
| bar (); /* OK if baz () instead */ |
| } |
| } |
| else |
| { |
| if (a == 0) |
| return 0; |
| else |
| return x; |
| } |
| } |
| |
| int |
| main () |
| { |
| if (foo (1) == 0) |
| abort (); |
| |
| return 0; |
| } |