1 extern "C" void abort (void);
2 union U { int x; long long y; };
3 struct T { int a; union U b; int c; };
4 struct S { int s; int u; T v; int x[10]; union U w; int y[10]; int z[10]; };
5 volatile int z;
6 
7 template <typename R>
8 void
foo()9 foo ()
10 {
11   R s;
12   s.template s = 0;
13   s.u = 1;
14   s.v.a = 2;
15   s.v.b.y = 3LL;
16   s.v.c = 19;
17   s.w.x = 4;
18   s.template x[0] = 7;
19   s.x[1] = 8;
20   s.y[3] = 9;
21   s.y[4] = 10;
22   s.y[5] = 11;
23   int err = 0;
24   #pragma omp target map (to:s.template v.template b, s.u, s.x[0:z + 2]) \
25 		     map (tofrom:s.y[3:3]) \
26 		     map (from: s.w, s.template z[z + 1:z + 3], err)
27   {
28     err = 0;
29     if (s.u != 1 || s.v.b.y != 3LL || s.x[0] != 7 || s.x[1] != 8
30 	|| s.y[3] != 9 || s.y[4] != 10 || s.y[5] != 11)
31       err = 1;
32     s.w.x = 6;
33     s.y[3] = 12;
34     s.y[4] = 13;
35     s.y[5] = 14;
36     s.z[1] = 15;
37     s.z[2] = 16;
38     s.z[3] = 17;
39   }
40   if (err || s.w.x != 6 || s.y[3] != 12 || s.y[4] != 13 || s.y[5] != 14
41       || s.z[1] != 15 || s.z[2] != 16 || s.z[3] != 17)
42     abort ();
43   s.u++;
44   s.v.a++;
45   s.v.b.y++;
46   s.w.x++;
47   s.x[1] = 18;
48   s.z[0] = 19;
49   #pragma omp target data map (tofrom: s)
50   #pragma omp target map (always to: s.template w, s.x[1], err) map (alloc:s.u, s. template v.template b, s.z[z:z + 1])
51   {
52     err = 0;
53     if (s.u != 2 || s.v.b.y != 4LL || s.w.x != 7 || s.x[1] != 18 || s.z[0] != 19)
54       err = 1;
55     s.w.x = 8;
56     s.x[1] = 20;
57     s.z[0] = 21;
58   }
59   if (err || s.w.x != 8 || s.x[1] != 20 || s.z[0] != 21)
60     abort ();
61   s.u++;
62   s.v.a++;
63   s.v.b.y++;
64   s.w.x++;
65   s.x[0] = 22;
66   s.x[1] = 23;
67   #pragma omp target data map (from: s.w, s.x[0:2]) map (to: s.v.b, s.u)
68   #pragma omp target map (always to: s.w, s.x[0:2], err) map (alloc:s.u, s.v.b)
69   {
70     err = 0;
71     if (s.u != 3 || s.v.b.y != 5LL || s.w.x != 9 || s.x[0] != 22 || s.x[1] != 23)
72       err = 1;
73     s.w.x = 11;
74     s.x[0] = 24;
75     s.x[1] = 25;
76   }
77   if (err || s.w.x != 11 || s.x[0] != 24 || s.x[1] != 25)
78     abort ();
79 }
80 
81 int
main()82 main ()
83 {
84   S s;
85   s.s = 0;
86   s.u = 1;
87   s.v.a = 2;
88   s.v.b.y = 3LL;
89   s.v.c = 19;
90   s.w.x = 4;
91   s.x[0] = 7;
92   s.x[1] = 8;
93   s.y[3] = 9;
94   s.y[4] = 10;
95   s.y[5] = 11;
96   int err = 0;
97   #pragma omp target map (to:s.v.b, s.u, s.x[0:z + 2]) \
98 		     map (tofrom:s.y[3:3]) \
99 		     map (from: s.w, s.z[z + 1:z + 3], err)
100   {
101     err = 0;
102     if (s.u != 1 || s.v.b.y != 3LL || s.x[0] != 7 || s.x[1] != 8
103 	|| s.y[3] != 9 || s.y[4] != 10 || s.y[5] != 11)
104       err = 1;
105     s.w.x = 6;
106     s.y[3] = 12;
107     s.y[4] = 13;
108     s.y[5] = 14;
109     s.z[1] = 15;
110     s.z[2] = 16;
111     s.z[3] = 17;
112   }
113   if (err || s.w.x != 6 || s.y[3] != 12 || s.y[4] != 13 || s.y[5] != 14
114       || s.z[1] != 15 || s.z[2] != 16 || s.z[3] != 17)
115     abort ();
116   s.u++;
117   s.v.a++;
118   s.v.b.y++;
119   s.w.x++;
120   s.x[1] = 18;
121   s.z[0] = 19;
122   #pragma omp target data map (tofrom: s)
123   #pragma omp target map (always to: s.w, s.x[1], err) map (alloc:s.u, s.v.b, s.z[z:z + 1])
124   {
125     err = 0;
126     if (s.u != 2 || s.v.b.y != 4LL || s.w.x != 7 || s.x[1] != 18 || s.z[0] != 19)
127       err = 1;
128     s.w.x = 8;
129     s.x[1] = 20;
130     s.z[0] = 21;
131   }
132   if (err || s.w.x != 8 || s.x[1] != 20 || s.z[0] != 21)
133     abort ();
134   s.u++;
135   s.v.a++;
136   s.v.b.y++;
137   s.w.x++;
138   s.x[0] = 22;
139   s.x[1] = 23;
140   #pragma omp target data map (from: s.w, s.x[0:2]) map (to: s.v.b, s.u)
141   #pragma omp target map (always to: s.w, s.x[0:2], err) map (alloc:s.u, s.v.b)
142   {
143     err = 0;
144     if (s.u != 3 || s.v.b.y != 5LL || s.w.x != 9 || s.x[0] != 22 || s.x[1] != 23)
145       err = 1;
146     s.w.x = 11;
147     s.x[0] = 24;
148     s.x[1] = 25;
149   }
150   if (err || s.w.x != 11 || s.x[0] != 24 || s.x[1] != 25)
151     abort ();
152   foo <S> ();
153   return 0;
154 }
155