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