1 extern "C" void abort ();
2 int x;
3
4 __attribute__((noinline, noclone)) void
foo(int & a,int (& b)[10],short & c,long (& d)[5],int n)5 foo (int &a, int (&b)[10], short &c, long (&d)[5], int n)
6 {
7 int err;
8 int &t = x;
9 int y[n + 1];
10 int (&z)[n + 1] = y;
11 for (int i = 0; i < n + 1; i++)
12 z[i] = i + 27;
13 #pragma omp target enter data map (to: z, c) map (alloc: b, t)
14 #pragma omp target update to (b, t)
15 #pragma omp target map (tofrom: a, d) map (from: b, c) map (alloc: t, z) map (from: err)
16 {
17 err = a++ != 7;
18 for (int i = 0; i < 10; i++)
19 {
20 err |= b[i] != 10 - i;
21 b[i] = i - 16;
22 if (i >= 6) continue;
23 err |= z[i] != i + 27;
24 z[i] = 2 * i + 9;
25 if (i == 5) continue;
26 err |= d[i] != 12L + i;
27 d[i] = i + 7;
28 }
29 err |= c != 25;
30 c = 142;
31 err |= t != 8;
32 t = 19;
33 }
34 if (err) abort ();
35 #pragma omp target update from (z, c)
36 #pragma omp target exit data map (from: b, t) map (release: z, c)
37 if (a != 8 || c != 142 || t != 19)
38 abort ();
39 a = 29;
40 c = 149;
41 t = 15;
42 for (int i = 0; i < 10; i++)
43 {
44 if (b[i] != i - 16) abort ();
45 b[i] = i ^ 1;
46 if (i >= 6) continue;
47 if (z[i] != 2 * i + 9) abort ();
48 z[i]++;
49 if (i == 5) continue;
50 if (d[i] != i + 7) abort ();
51 d[i] = 7 - i;
52 }
53 #pragma omp target defaultmap(tofrom: scalar)
54 {
55 err = a++ != 29;
56 for (int i = 0; i < 10; i++)
57 {
58 err |= b[i] != i ^ 1;
59 b[i] = i + 5;
60 if (i >= 6) continue;
61 err |= z[i] != 2 * i + 10;
62 z[i] = 9 - 3 * i;
63 if (i == 5) continue;
64 err |= d[i] != 7L - i;
65 d[i] = i;
66 }
67 err |= c != 149;
68 c = -2;
69 err |= t != 15;
70 t = 155;
71 }
72 if (err || a != 30 || c != -2 || t != 155)
73 abort ();
74 for (int i = 0; i < 10; i++)
75 {
76 if (b[i] != i + 5) abort ();
77 if (i >= 6) continue;
78 if (z[i] != 9 - 3 * i) abort ();
79 z[i]++;
80 if (i == 5) continue;
81 if (d[i] != i) abort ();
82 }
83 #pragma omp target data map (alloc: z)
84 {
85 #pragma omp target update to (z)
86 #pragma omp target map(from: err)
87 {
88 err = 0;
89 for (int i = 0; i < 6; i++)
90 if (z[i] != 10 - 3 * i) err = 1;
91 else z[i] = i;
92 }
93 if (err) abort ();
94 #pragma omp target update from (z)
95 }
96 for (int i = 0; i < 6; i++)
97 if (z[i] != i)
98 abort ();
99 }
100
101 int
main()102 main ()
103 {
104 int a = 7;
105 int b[10] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
106 short c = 25;
107 long d[5] = { 12, 13, 14, 15, 16 };
108 x = 8;
109 foo (a, b, c, d, 5);
110 }
111