1 struct S { int s, t; };
2 
3 int a = 1, b = 1;
4 double c[27];
5 struct S d = { 8888, 8888 };
6 #pragma omp declare target link (a) to (b) link (c, d)
7 
8 int
foo(void)9 foo (void)
10 {
11   return a++ + b++;
12 }
13 
14 int
bar(int n)15 bar (int n)
16 {
17   int *p1 = &a;
18   int *p2 = &b;
19   c[n] += 2.0;
20   d.s -= 2;
21   d.t -= 2;
22   return *p1 + *p2 + d.s + d.t;
23 }
24 
25 #pragma omp declare target (foo, bar)
26 
27 int
main()28 main ()
29 {
30   a = b = 2;
31   d.s = 17;
32   d.t = 18;
33 
34   int res, n = 10;
35   #pragma omp target map (to: a, b, c, d) map (from: res)
36   {
37     res = foo () + foo ();
38     c[n] = 3.0;
39     res += bar (n);
40   }
41 
42   int shared_mem = 0;
43   #pragma omp target map (alloc: shared_mem)
44     shared_mem = 1;
45 
46   if ((shared_mem && res != (2 + 2) + (3 + 3) + (4 + 4 + 15 + 16))
47       || (!shared_mem && res != (2 + 1) + (3 + 2) + (4 + 3 + 15 + 16)))
48     __builtin_abort ();
49 
50   #pragma omp target enter data map (to: c)
51   #pragma omp target update from (c)
52   res = (int) (c[n] + 0.5);
53   if ((shared_mem && res != 5) || (!shared_mem && res != 0))
54     __builtin_abort ();
55 
56   #pragma omp target map (to: a, b) map (from: res)
57     res = foo ();
58 
59   if ((shared_mem && res != 4 + 4) || (!shared_mem && res != 2 + 3))
60     __builtin_abort ();
61 
62   return 0;
63 }
64