| /* { dg-do run } */ |
| |
| #define N 256 |
| |
| #pragma omp begin declare target indirect |
| int foo(void) { return 5; } |
| int bar(void) { return 8; } |
| int baz(void) { return 11; } |
| #pragma omp end declare target |
| |
| int main (void) |
| { |
| int i, x = 0, expected = 0; |
| int (*fn_ptr[N])(void); |
| |
| for (i = 0; i < N; i++) |
| { |
| switch (i % 3) |
| { |
| case 0: fn_ptr[i] = &foo; break; |
| case 1: fn_ptr[i] = &bar; break; |
| case 2: fn_ptr[i] = &baz; break; |
| } |
| expected += (*fn_ptr[i]) (); |
| } |
| |
| #pragma omp target teams distribute parallel for \ |
| reduction (+: x) map (to: fn_ptr) map (tofrom: x) |
| for (int i = 0; i < N; i++) |
| x += (*fn_ptr[i]) (); |
| |
| return x - expected; |
| } |