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