| /* { dg-do run } */ |
| /* { dg-options "" } */ |
| /* Verify cleanup execution on non-trivial exit from a block. */ |
| |
| extern "C" void exit(int); |
| extern "C" void abort(void); |
| |
| static int counter; |
| |
| static void |
| handler(int *p) |
| { |
| counter += *p; |
| } |
| |
| static void __attribute__((noinline)) |
| bar(void) |
| { |
| } |
| |
| static void doit(int n, int n2) |
| { |
| int i; |
| for (i = 0; i < n; ++i) |
| { |
| int dummy __attribute__((cleanup (handler))) = i; |
| if (i == n2) |
| break; |
| bar(); |
| } |
| } |
| |
| int main() |
| { |
| doit (10, 6); |
| if (counter != 0 + 1 + 2 + 3 + 4 + 5 + 6) |
| abort (); |
| return 0; |
| } |