| /* { dg-do run } */ |
| |
| __attribute__((__noipa__)) |
| void f1(int x, void (*p1 []) (int, int)) |
| { |
| int i; |
| for (i = 0; i < x; i++) |
| p1[i](42, 666); |
| } |
| |
| int z1_called = 0; |
| int w1_called = 0; |
| |
| __attribute__((__noipa__)) |
| void z1(int a, int b) |
| { |
| if (w1_called || z1_called) |
| __builtin_abort(); |
| z1_called++; |
| } |
| |
| __attribute__((__noipa__)) |
| void w1(int a, int b) |
| { |
| if (w1_called || !z1_called) |
| __builtin_abort(); |
| w1_called++; |
| } |
| |
| int z2_called = 0; |
| int w2_called = 0; |
| |
| __attribute__((__noipa__)) |
| void z2(void) |
| { |
| if (w2_called || z2_called) |
| __builtin_abort(); |
| z2_called++; |
| } |
| |
| __attribute__((__noipa__)) |
| void w2(void) |
| { |
| if (w2_called || !z2_called) |
| __builtin_abort(); |
| w2_called++; |
| } |
| |
| void (*p2 []) () = { w2, z2 }; |
| |
| __attribute__((__noipa__)) |
| void f2(int x) |
| { |
| void (**q) (void) = p2 + x; |
| int i; |
| for (i = 0; i < x; i++) |
| (*(--q))(); |
| } |
| |
| __attribute__((__noipa__)) |
| void f3(int x, int (*p3 []) (int)) |
| { |
| int i; |
| int next = x; |
| for (i = 0; i < x; i++) |
| next = p3[i](next); |
| } |
| |
| int z3_called = 0; |
| int w3_called = 0; |
| |
| __attribute__((__noipa__)) |
| int z3(int a) |
| { |
| if (w3_called || z3_called || a != 2) |
| __builtin_abort(); |
| z3_called++; |
| return 42; |
| } |
| |
| __attribute__((__noipa__)) |
| int w3(int a) |
| { |
| if (w3_called || !z3_called || a != 42) |
| __builtin_abort(); |
| w3_called++; |
| return 4096; |
| } |
| |
| int (*p4 []) (int) = { z3, w3 }; |
| |
| __attribute__((__noipa__)) |
| void f4(int x) |
| { |
| int (**q) (int) = p4; |
| int (**r) (int) = p4 + x; |
| |
| int next = x; |
| for (; q < r; q++) |
| next = (*q)(next); |
| } |
| |
| int main(void) |
| { |
| static int (*p3 []) (int) = { z3, w3 }; |
| |
| static void (*p1 []) (int, int) = { z1, w1 }; |
| |
| f1(2, p1); |
| if (z1_called != 1 || w1_called != 1) |
| __builtin_abort(); |
| |
| f2(2); |
| if (z2_called != 1 || w2_called != 1) |
| __builtin_abort(); |
| |
| f3(2, p3); |
| if (z3_called != 1 || w3_called != 1) |
| __builtin_abort(); |
| |
| z3_called = 0; |
| w3_called = 0; |
| f4(2); |
| if (z3_called != 1 || w3_called != 1) |
| __builtin_abort(); |
| |
| __builtin_exit(0); |
| } |