aboutsummaryrefslogtreecommitdiff
path: root/libgomp/testsuite/libgomp.c-c++-common/declare-target-indirect-2.c
blob: 545f1a9fcbffa3c45bcaa5ed0da47b39114a94ef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/* { 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;
}