| /* { dg-do run } */ |
| /* { dg-options "-O2" } */ |
| /* { dg-require-effective-target nonlocal_goto } */ |
| |
| extern void abort (void); |
| |
| int global; |
| |
| static int foo(void) __attribute__((noinline)); |
| |
| static int foo(void) |
| { |
| global = 1; |
| } |
| |
| static int bar(void) |
| { |
| foo (); |
| global = 0; |
| } |
| |
| int execute(int cmd) |
| { |
| __label__ start; |
| |
| void raise(void) |
| { |
| goto start; |
| } |
| |
| int last; |
| |
| bar (); |
| |
| last = 0; |
| |
| start: |
| |
| if (last == 0) |
| while (1) |
| { |
| last = 1; |
| raise (); |
| } |
| |
| if (last == 0) |
| return 0; |
| else |
| return cmd; |
| } |
| |
| int main(void) |
| { |
| if (execute (1) == 0) |
| abort (); |
| |
| return 0; |
| } |