1 // -fopenmp, -fno-openmp-extensions
2 // RUN: %clang_cc1 -verify=expected,ge50,lt51,omp,lt51-omp -fopenmp -fno-openmp-extensions -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized
3 // RUN: %clang_cc1 -verify=expected,lt50,lt51,omp,lt51-omp -fopenmp -fno-openmp-extensions -fopenmp-version=40 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized
4 // RUN: %clang_cc1 -verify=expected,lt50,lt51,omp,lt51-omp -fopenmp -fno-openmp-extensions -fopenmp-version=45 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized
5 // RUN: %clang_cc1 -verify=expected,ge50,lt51,omp,lt51-omp -fopenmp -fno-openmp-extensions -fopenmp-version=50 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized
6 // RUN: %clang_cc1 -verify=expected,ge50,ge51,omp,ge51-omp -fopenmp -fno-openmp-extensions -fopenmp-version=51 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized
7 // RUN: %clang_cc1 -DCCODE -verify -fopenmp -fno-openmp-extensions -ferror-limit 300 -x c %s -Wno-openmp -Wuninitialized
8
9 // -fopenmp-simd, -fno-openmp-extensions
10 // RUN: %clang_cc1 -verify=expected,ge50,lt51,omp,lt51-omp -fopenmp-simd -fno-openmp-extensions -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized
11 // RUN: %clang_cc1 -verify=expected,lt50,lt51,omp,lt51-omp -fopenmp-simd -fno-openmp-extensions -fopenmp-version=40 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized
12 // RUN: %clang_cc1 -verify=expected,lt50,lt51,omp,lt51-omp -fopenmp-simd -fno-openmp-extensions -fopenmp-version=45 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized
13 // RUN: %clang_cc1 -verify=expected,ge50,lt51,omp,lt51-omp -fopenmp-simd -fno-openmp-extensions -fopenmp-version=50 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized
14 // RUN: %clang_cc1 -verify=expected,ge50,ge51,omp,ge51-omp -fopenmp-simd -fno-openmp-extensions -fopenmp-version=51 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized
15 // RUN: %clang_cc1 -DCCODE -verify -fopenmp-simd -fno-openmp-extensions -ferror-limit 300 -x c %s -Wno-openmp-mapping -Wuninitialized
16
17 // -fopenmp -fopenmp-extensions
18 // RUN: %clang_cc1 -verify=expected,ge50,lt51,ompx,lt51-ompx -fopenmp -fopenmp-extensions -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized
19 // RUN: %clang_cc1 -verify=expected,lt50,lt51,ompx,lt51-ompx -fopenmp -fopenmp-extensions -fopenmp-version=40 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized
20 // RUN: %clang_cc1 -verify=expected,lt50,lt51,ompx,lt51-ompx -fopenmp -fopenmp-extensions -fopenmp-version=45 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized
21 // RUN: %clang_cc1 -verify=expected,ge50,lt51,ompx,lt51-ompx -fopenmp -fopenmp-extensions -fopenmp-version=50 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized
22 // RUN: %clang_cc1 -verify=expected,ge50,ge51,ompx,ge51-ompx -fopenmp -fopenmp-extensions -fopenmp-version=51 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized
23 // RUN: %clang_cc1 -DCCODE -verify -fopenmp -fopenmp-extensions -ferror-limit 300 -x c %s -Wno-openmp -Wuninitialized
24
25 // -fopenmp-simd -fopenmp-extensions
26 // RUN: %clang_cc1 -verify=expected,ge50,lt51,ompx,lt51-ompx -fopenmp-simd -fopenmp-extensions -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized
27 // RUN: %clang_cc1 -verify=expected,lt50,lt51,ompx,lt51-ompx -fopenmp-simd -fopenmp-extensions -fopenmp-version=40 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized
28 // RUN: %clang_cc1 -verify=expected,lt50,lt51,ompx,lt51-ompx -fopenmp-simd -fopenmp-extensions -fopenmp-version=45 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized
29 // RUN: %clang_cc1 -verify=expected,ge50,lt51,ompx,lt51-ompx -fopenmp-simd -fopenmp-extensions -fopenmp-version=50 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized
30 // RUN: %clang_cc1 -verify=expected,ge50,ge51,ompx,ge51-ompx -fopenmp-simd -fopenmp-extensions -fopenmp-version=51 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized
31 // RUN: %clang_cc1 -DCCODE -verify -fopenmp-simd -fopenmp-extensions -ferror-limit 300 -x c %s -Wno-openmp-mapping -Wuninitialized
32
33 // Check
34 #ifdef CCODE
foo(int arg)35 void foo(int arg) {
36 const int n = 0;
37
38 double marr[10][10][10];
39
40 #pragma omp target map(marr[2][0:2][0:2]) // expected-error {{array section does not specify contiguous storage}}
41 {}
42 #pragma omp target map(marr[:][0:][:])
43 {}
44 #pragma omp target map(marr[:][1:][:]) // expected-error {{array section does not specify contiguous storage}}
45 {}
46 #pragma omp target map(marr[:][n:][:])
47 {}
48 }
49 #else
50
xxx(int argc)51 void xxx(int argc) {
52 int map; // expected-note {{initialize the variable 'map' to silence this warning}}
53 #pragma omp target map(tofrom: map) // expected-warning {{variable 'map' is uninitialized when used here}}
54 for (int i = 0; i < 10; ++i)
55 ;
56 }
57
58
59 struct SREF {
60 int &a;
61 int b;
SREFSREF62 SREF(int &a) : a(a) {}
63 };
64
65 template <typename T, int I>
66 struct SA {
67 static int ss;
68 #pragma omp threadprivate(ss) // expected-note {{defined as threadprivate or thread local}}
69 float a;
70 int b[12];
71 float *c;
72 T d;
73 float e[I];
74 T *f;
75 int bf : 20;
funcSA76 void func(int arg) {
77 SREF sref(arg);
78 #pragma omp target
79 {
80 a = 0.0;
81 func(arg);
82 bf = 20;
83 }
84 #pragma omp target map(arg,a,d,sref.b)
85 {}
86 #pragma omp target map(arg[2:2],a,d) // expected-error {{subscripted value is not an array or pointer}}
87 {}
88 #pragma omp target map(arg,a*2) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} ge50-error {{expected addressable lvalue in 'map' clause}}
89 {}
90 #pragma omp target map(arg,(c+1)[2]) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}}
91 {}
92 #pragma omp target map(arg,a[:2],d) // expected-error {{subscripted value is not an array or pointer}}
93 {}
94 #pragma omp target map(arg,a,d[:2]) // expected-error {{subscripted value is not an array or pointer}}
95 {}
96
97 #pragma omp target map(to:ss) // expected-error {{threadprivate variables are not allowed in 'map' clause}}
98 {}
99
100 #pragma omp target map(to:b,e)
101 {}
102 #pragma omp target map(to:b,e) map(to:b) // lt50-error {{variable already marked as mapped in current construct}} lt50-note {{used here}}
103 {}
104 #pragma omp target map(to:b[:2],e)
105 {}
106 #pragma omp target map(to:b,e[:])
107 {}
108 #pragma omp target map(b[-1:]) // expected-error {{array section must be a subset of the original array}}
109 {}
110 #pragma omp target map(b[:-1]) // expected-error {{section length is evaluated to a negative value -1}}
111 {}
112 #pragma omp target map(b[true:true])
113 {}
114
115 #pragma omp target map(: c,f) // expected-error {{missing map type}}
116 {}
117 #pragma omp target map(always, tofrom: c,f)
118 {}
119 #pragma omp target map(always, tofrom: c[1:2],f)
120 {}
121 #pragma omp target map(always, tofrom: c,f[1:2])
122 {}
123 #pragma omp target map(always, tofrom: c[:],f) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
124 {}
125 #pragma omp target map(always, tofrom: c,f[:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
126 {}
127 #pragma omp target map(always) // expected-error {{use of undeclared identifier 'always'}}
128 {}
129 #pragma omp target map(close, tofrom: c,f)
130 {}
131 #pragma omp target map(close, tofrom: c[1:2],f)
132 {}
133 #pragma omp target map(close, tofrom: c,f[1:2])
134 {}
135 #pragma omp target map(close, tofrom: c[:],f) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
136 {}
137 #pragma omp target map(close, tofrom: c,f[:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
138 {}
139 #pragma omp target map(close) // expected-error {{use of undeclared identifier 'close'}}
140 {}
141 // lt51-error@+1 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
142 #pragma omp target map(present, tofrom: c,f)
143 {}
144 // lt51-error@+1 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
145 #pragma omp target map(present, tofrom: c[1:2],f)
146 {}
147 // lt51-error@+1 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
148 #pragma omp target map(present, tofrom: c,f[1:2])
149 {}
150 // expected-error@+2 {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
151 // lt51-error@+1 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
152 #pragma omp target map(present, tofrom: c[:],f)
153 {}
154 // expected-error@+2 {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
155 // lt51-error@+1 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
156 #pragma omp target map(present, tofrom: c,f[:])
157 {}
158 // expected-error@+1 {{use of undeclared identifier 'present'}}
159 #pragma omp target map(present)
160 {}
161 // ge51-omp-error@+2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present'}}
162 // lt51-omp-error@+1 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
163 #pragma omp target map(ompx_hold, tofrom: c,f)
164 {}
165 // ge51-omp-error@+2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present'}}
166 // lt51-omp-error@+1 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
167 #pragma omp target map(ompx_hold, tofrom: c[1:2],f)
168 {}
169 // ge51-omp-error@+2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present'}}
170 // lt51-omp-error@+1 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
171 #pragma omp target map(ompx_hold, tofrom: c,f[1:2])
172 {}
173 // expected-error@+3 {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
174 // ge51-omp-error@+2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present'}}
175 // lt51-omp-error@+1 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
176 #pragma omp target map(ompx_hold, tofrom: c[:],f)
177 {}
178 // expected-error@+3 {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
179 // ge51-omp-error@+2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present'}}
180 // lt51-omp-error@+1 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
181 #pragma omp target map(ompx_hold, tofrom: c,f[:])
182 {}
183 // expected-error@+1 {{use of undeclared identifier 'ompx_hold'}}
184 #pragma omp target map(ompx_hold)
185 {}
186 #pragma omp target map(close, close, tofrom: a) // expected-error {{same map type modifier has been specified more than once}}
187 {}
188 #pragma omp target map(always, close, always, close, tofrom: a) // expected-error 2 {{same map type modifier has been specified more than once}}
189 {}
190 // ge51-error@+2 {{same map type modifier has been specified more than once}}
191 // lt51-error@+1 2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
192 #pragma omp target map(present, present, tofrom: a)
193 {}
194 // ompx-error@+3 {{same map type modifier has been specified more than once}}
195 // ge51-omp-error@+2 2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present'}}
196 // lt51-omp-error@+1 2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
197 #pragma omp target map(ompx_hold, ompx_hold, tofrom: a)
198 {}
199 // expected-error@+7 2 {{same map type modifier has been specified more than once}}
200 // ge51-error@+6 {{same map type modifier has been specified more than once}}
201 // lt51-ompx-error@+5 2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'ompx_hold'}}
202 // lt51-omp-error@+4 2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
203 // ompx-error@+3 {{same map type modifier has been specified more than once}}
204 // ge51-omp-error@+2 2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present'}}
205 // lt51-omp-error@+1 2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
206 #pragma omp target map(always, close, present, ompx_hold, always, close, present, ompx_hold, tofrom: a)
207 {}
208 #pragma omp target map( , tofrom: a) // expected-error {{missing map type modifier}}
209 {}
210 #pragma omp target map( , , tofrom: a) // expected-error {{missing map type modifier}} expected-error {{missing map type modifier}}
211 {}
212 #pragma omp target map( , , : a) // expected-error {{missing map type modifier}} expected-error {{missing map type modifier}} expected-error {{missing map type}}
213 {}
214 // ge51-error@+3 2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present'}}
215 // lt51-error@+2 2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
216 // expected-error@+1 {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}}
217 #pragma omp target map( d, f, bf: a)
218 {}
219 // expected-error@+4 {{missing map type modifier}}
220 // ge51-error@+3 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present'}}
221 // lt51-error@+2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
222 // expected-error@+1 {{missing map type}}
223 #pragma omp target map( , f, : a)
224 {}
225 #pragma omp target map(always close: a) // expected-error {{missing map type}}
226 {}
227 #pragma omp target map(always close bf: a) // expected-error {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}}
228 {}
229 // ge51-error@+3 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present'}}
230 // lt51-error@+2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
231 // expected-error@+1 {{missing map type}}
232 #pragma omp target map(always tofrom close: a)
233 {}
234 // ge51-error@+2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present'}}
235 // lt51-error@+1 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
236 #pragma omp target map(tofrom from: a)
237 {}
238 #pragma omp target map(close bf: a) // expected-error {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}}
239 {}
240 #pragma omp target map(([b[I]][bf])f) // lt50-error {{expected ',' or ']' in lambda capture list}} lt50-error {{expected ')'}} lt50-note {{to match this '('}}
241 {}
242 return;
243 }
244 };
245
246 struct SB {
247 unsigned A;
248 unsigned B;
249 float Arr[100];
250 float *Ptr;
fooSB251 float *foo() {
252 return &Arr[0];
253 }
254 };
255
256 struct SC {
257 unsigned A : 2;
258 unsigned B : 3;
259 unsigned C;
260 unsigned D;
261 float Arr[100];
262 SB S;
263 SB ArrS[100];
264 SB *PtrS;
265 SB *&RPtrS;
266 float *Ptr;
267
SCSC268 SC(SB *&_RPtrS) : RPtrS(_RPtrS) {}
269 };
270
271 union SD {
272 unsigned A;
273 float B;
274 };
275
SAclient(int arg)276 void SAclient(int arg) {
277 SA<int,123> s;
278 s.func(arg); // expected-note {{in instantiation of member function}}
279 double marr[10][10][10];
280 double marr2[5][10][1];
281 double mvla[5][arg][10];
282 double ***mptr;
283 const int n = 0;
284 const int m = 1;
285 double mvla2[5][arg][m+n+10];
286
287 SB *p;
288
289 SD u;
290 SC r(p),t(p);
291 #pragma omp target map(r)
292 {}
293 #pragma omp target map(marr[2] [0:2] [0:2]) // expected-error {{array section does not specify contiguous storage}}
294 {}
295 #pragma omp target map(marr[:] [0:2] [0:2]) // expected-error {{array section does not specify contiguous storage}}
296 {}
297 #pragma omp target map(marr[2][3] [0:2])
298 {}
299 #pragma omp target map(marr[:][:][:])
300 {}
301 #pragma omp target map(marr[:2][:][:])
302 {}
303 #pragma omp target map(marr [arg:][:][:])
304 {}
305 #pragma omp target map(marr [arg:])
306 {}
307 #pragma omp target map(marr [arg:][:arg][:]) // correct if arg is the size of dimension 2
308 {}
309 #pragma omp target map(marr[:arg][:])
310 {}
311 #pragma omp target map(marr[:arg] [n:])
312 {}
313 #pragma omp target map(marr[:][:arg] [n:]) // correct if arg is the size of dimension 2
314 {}
315 #pragma omp target map(marr[:][:m] [n:]) // expected-error {{array section does not specify contiguous storage}}
316 {}
317 #pragma omp target map(marr [n:m][:arg] [n:])
318 {}
319 #pragma omp target map(marr[:2][:1][:]) // expected-error {{array section does not specify contiguous storage}}
320 {}
321 #pragma omp target map(marr[:2] [1:][:]) // expected-error {{array section does not specify contiguous storage}}
322 {}
323 #pragma omp target map(marr[:2][:][:1]) // expected-error {{array section does not specify contiguous storage}}
324 {}
325 #pragma omp target map(marr[:2][:] [1:]) // expected-error {{array section does not specify contiguous storage}}
326 {}
327 #pragma omp target map(marr[:1][:2][:])
328 {}
329 #pragma omp target map(marr[:1][0][:])
330 {}
331 #pragma omp target map(marr[:arg][:2][:]) // correct if arg is 1
332 {}
333 #pragma omp target map(marr[:1] [3:1][:2])
334 {}
335 #pragma omp target map(marr[:1] [3:arg][:2]) // correct if arg is 1
336 {}
337 #pragma omp target map(marr[:1] [3:2][:2]) // expected-error {{array section does not specify contiguous storage}}
338 {}
339 #pragma omp target map(marr[:2][:10][:])
340 {}
341 #pragma omp target map(marr[:2][:][:5 + 5])
342 {}
343 #pragma omp target map(marr[:2] [2 + 2 - 4:] [0:5 + 5])
344 {}
345
346 #pragma omp target map(marr[:1][:2][0]) // expected-error {{array section does not specify contiguous storage}}
347 {}
348 #pragma omp target map(marr2[:1][:2][0])
349 {}
350
351 #pragma omp target map(mvla[:1][:][0]) // correct if the size of dimension 2 is 1.
352 {}
353 #pragma omp target map(mvla[:2][:arg][:]) // correct if arg is the size of dimension 2.
354 {}
355 #pragma omp target map(mvla[:1][:2][0]) // expected-error {{array section does not specify contiguous storage}}
356 {}
357 #pragma omp target map(mvla[1] [2:arg][:])
358 {}
359 #pragma omp target map(mvla[:1][:][:])
360 {}
361 #pragma omp target map(mvla2[:1][:2][:11])
362 {}
363 #pragma omp target map(mvla2[:1][:2][:10]) // expected-error {{array section does not specify contiguous storage}}
364 {}
365
366 #pragma omp target map(mptr[:2] [2 + 2 - 4:1] [0:5 + 5]) // expected-error {{array section does not specify contiguous storage}}
367 {}
368 #pragma omp target map(mptr[:1][:2 - 1] [2:4 - 3])
369 {}
370 #pragma omp target map(mptr[:1][:arg] [2:4 - 3]) // correct if arg is 1.
371 {}
372 #pragma omp target map(mptr[:1][:2 - 1] [0:2])
373 {}
374 #pragma omp target map(mptr[:1][:2] [0:2]) // expected-error {{array section does not specify contiguous storage}}
375 {}
376 #pragma omp target map(mptr[:1][:] [0:2]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
377 {}
378 #pragma omp target map(mptr[:2][:1] [0:2]) // expected-error {{array section does not specify contiguous storage}}
379 {}
380
381 #pragma omp target map(r.ArrS[0].B)
382 {}
383 #pragma omp target map(r.ArrS[:1].B) // expected-error {{OpenMP array section is not allowed here}}
384 {}
385 #pragma omp target map(r.ArrS[:arg].B) // expected-error {{OpenMP array section is not allowed here}}
386 {}
387 #pragma omp target map(r.ArrS[0].Arr [1:23])
388 {}
389 #pragma omp target map(r.ArrS[0].Arr [1:arg])
390 {}
391 #pragma omp target map(r.ArrS[0].Arr [arg:23])
392 {}
393 #pragma omp target map(r.ArrS[0].Error) // expected-error {{no member named 'Error' in 'SB'}}
394 {}
395 #pragma omp target map(r.ArrS[0].A, r.ArrS[1].A) // lt50-error {{multiple array elements associated with the same variable are not allowed in map clauses of the same construct}} lt50-note {{used here}}
396 {}
397 #pragma omp target map(r.ArrS[0].A, t.ArrS[1].A)
398 {}
399 #pragma omp target map(r.PtrS[0], r.PtrS->B) // lt50-error {{same pointer dereferenced in multiple different ways in map clause expressions}} lt50-note {{used here}}
400 {}
401 #pragma omp target map(r.PtrS, r.PtrS->B) // lt50-error {{pointer cannot be mapped along with a section derived from itself}} lt50-note {{used here}}
402 {}
403 #pragma omp target map(r.PtrS->A, r.PtrS->B)
404 {}
405 #pragma omp target map(r.RPtrS[0], r.RPtrS->B) // lt50-error {{same pointer dereferenced in multiple different ways in map clause expressions}} lt50-note {{used here}}
406 {}
407 #pragma omp target map(r.RPtrS, r.RPtrS->B) // lt50-error {{pointer cannot be mapped along with a section derived from itself}} lt50-note {{used here}}
408 {}
409 #pragma omp target map(r.RPtrS->A, r.RPtrS->B)
410 {}
411 #pragma omp target map(r.S.Arr[:12])
412 {}
413 #pragma omp target map(r.S.foo() [:12]) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} ge50-error {{expected addressable lvalue in 'map' clause}}
414 {}
415 #pragma omp target map(r.C, r.D)
416 {}
417 #pragma omp target map(r.C, r.C) // lt50-error {{variable already marked as mapped in current construct}} lt50-note {{used here}}
418 {}
419 #pragma omp target map(r.C) map(r.C) // lt50-error {{variable already marked as mapped in current construct}} lt50-note {{used here}}
420 {}
421 #pragma omp target map(r.C, r.S) // this would be an error only caught at runtime - Sema would have to make sure there is not way for the missing data between fields to be mapped somewhere else.
422 {}
423 #pragma omp target map(r, r.S) // lt50-error {{variable already marked as mapped in current construct}} lt50-note {{used here}}
424 {}
425 #pragma omp target map(r.C, t.C)
426 {}
427 #pragma omp target map(r.A) // expected-error {{bit fields cannot be used to specify storage in a 'map' clause}}
428 {}
429 #pragma omp target map(r.Arr)
430 {}
431 #pragma omp target map(r.Arr [3:5])
432 {}
433 #pragma omp target map(r.Ptr [3:5])
434 {}
435 #pragma omp target map(r.ArrS [3:5].A) // expected-error {{OpenMP array section is not allowed here}}
436 {}
437 #pragma omp target map(r.ArrS [3:5].Arr [6:7]) // expected-error {{OpenMP array section is not allowed here}}
438 {}
439 #pragma omp target map(r.ArrS[3].Arr [6:7])
440 {}
441 #pragma omp target map(r.S.Arr [4:5])
442 {}
443 #pragma omp target map(r.S.Ptr [4:5])
444 {}
445 #pragma omp target map(r.S.Ptr[:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
446 {}
447 #pragma omp target map((p + 1)->A) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}}
448 {}
449 #pragma omp target map(u.B) // expected-error {{mapping of union members is not allowed}}
450 {}
451 #pragma omp target
452 {
453 u.B = 0;
454 r.S.foo();
455 }
456
457 #pragma omp target data map(to \
458 : r.C) // lt50-note {{used here}}
459 {
460 #pragma omp target map(r.D) // lt50-error {{original storage of expression in data environment is shared but data environment do not fully contain mapped expression storage}}
461 {}
462 }
463
464 #pragma omp target data map(to \
465 : t.Ptr) // lt50-note {{used here}}
466 {
467 #pragma omp target map(t.Ptr[:23]) // lt50-error {{pointer cannot be mapped along with a section derived from itself}}
468 {}
469 }
470
471 #pragma omp target data map(to \
472 : t.C, t.D)
473 {
474 #pragma omp target data map(to \
475 : t.C)
476 {
477 #pragma omp target map(t.D)
478 {}
479 }
480 }
481 #pragma omp target data map(marr[:][:][:])
482 {
483 #pragma omp target data map(marr)
484 {}
485 }
486
487 #pragma omp target data map(to \
488 : t)
489 {
490 #pragma omp target data map(to \
491 : t.C)
492 {
493 #pragma omp target map(t.D)
494 {}
495 }
496 }
497 }
foo()498 void foo() {
499 }
500
foobool(int argc)501 bool foobool(int argc) {
502 return argc;
503 }
504
505 struct S1; // expected-note 2 {{declared here}} // expected-note 3 {{forward declaration of 'S1'}}
506 extern S1 a;
507 class S2 {
508 mutable int a;
509 public:
S2()510 S2():a(0) { }
S2(S2 & s2)511 S2(S2 &s2):a(s2.a) { }
512 static float S2s;
513 static const float S2sc;
514 };
515 const float S2::S2sc = 0;
516 const S2 b;
517 const S2 ba[5];
518 class S3 {
519 int a;
520 public:
S3()521 S3():a(0) { }
S3(S3 & s3)522 S3(S3 &s3):a(s3.a) { }
523 };
524 const S3 c;
525 const S3 ca[5];
526 extern const int f;
527 class S4 {
528 int a;
529 S4();
530 S4(const S4 &s4);
531 public:
S4(int v)532 S4(int v):a(v) { }
533 };
534 class S5 {
535 int a;
S5()536 S5():a(0) {}
S5(const S5 & s5)537 S5(const S5 &s5):a(s5.a) { }
538 public:
S5(int v)539 S5(int v):a(v) { }
540 };
541
542 template <class T>
543 struct S6;
544
545 template<>
546 struct S6<int>
547 {
548 virtual void foo();
549 };
550
551 S3 h;
552 #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}
553
554 typedef int from;
555
556 struct dim {
557 double x, y;
558 };
559
560 template<typename T>
561 class Array1D
562 {
563 public:
564 unsigned n1;
565 unsigned size;
566 T * dptr;
567
operator ()(unsigned i1)568 inline T& operator() (unsigned i1) { return dptr[i1]; }
569
Array1D()570 Array1D() {n1=0;size=0;dptr=nullptr;}
571 };
572
573 template <typename T, int I> // expected-note {{declared here}}
tmain(T argc)574 T tmain(T argc) {
575 const T d = 5;
576 const T da[5] = { 0 };
577 S4 e(4);
578 S5 g(5);
579 T i, t[20];
580 T &j = i;
581 T *k = &j;
582 T x;
583 T y;
584 T to, tofrom, always, close, present;
585 const T (&l)[5] = da;
586 #pragma omp target map // expected-error {{expected '(' after 'map'}}
587 {}
588 #pragma omp target map( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}}
589 {}
590 #pragma omp target map() // expected-error {{expected expression}}
591 {}
592 #pragma omp target map(alloc) // expected-error {{use of undeclared identifier 'alloc'}}
593 {}
594 #pragma omp target map(to argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected ',' or ')' in 'map' clause}}
595 {}
596 #pragma omp target map(to:) // expected-error {{expected expression}}
597 {}
598 #pragma omp target map(from: argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
599 {}
600 #pragma omp target map(x: y) // expected-error {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}}
601 {}
602 #pragma omp target map(x)
603 foo();
604 #pragma omp target map(tofrom: t[:I])
605 foo();
606 #pragma omp target map(T: a) // expected-error {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}} expected-error {{incomplete type 'S1' where a complete type is required}}
607 foo();
608 #pragma omp target map(T) // expected-error {{'T' does not refer to a value}}
609 foo();
610 #pragma omp target map(I) // lt50-error 2 {{expected expression containing only member accesses and/or array sections based on named variables}} ge50-error 2 {{expected addressable lvalue in 'map' clause}}
611 foo();
612 #pragma omp target map(S2::S2s)
613 foo();
614 #pragma omp target map(S2::S2sc)
615 foo();
616 #pragma omp target map(x)
617 foo();
618 #pragma omp target map(to: x)
619 foo();
620 #pragma omp target map(to: to)
621 foo();
622 #pragma omp target map(to)
623 foo();
624 #pragma omp target map(to, x)
625 foo();
626 #pragma omp target data map(to x) // expected-error {{expected ',' or ')' in 'map' clause}}
627 #pragma omp target data map(tofrom: argc > 0 ? x : y) // lt50-error 2 {{expected expression containing only member accesses and/or array sections based on named variables}} ge50-error 2 {{expected addressable lvalue in 'map' clause}}
628 #pragma omp target data map(argc)
629 #pragma omp target data map(S1) // expected-error {{'S1' does not refer to a value}}
630 #pragma omp target data map(a, b, c, d, f) // expected-error {{incomplete type 'S1' where a complete type is required}} warn-warning 2 {{Type 'const S2' is not trivially copyable and not guaranteed to be mapped correctly}} warn-warning 2 {{Type 'const S3' is not trivially copyable and not guaranteed to be mapped correctly}}
631 #pragma omp target data map(ba) // warn-warning 2 {{Type 'const S2 [5]' is not trivially copyable and not guaranteed to be mapped correctly}}
632 #pragma omp target data map(ca) // warn-warning 2 {{Type 'const S3 [5]' is not trivially copyable and not guaranteed to be mapped correctly}}
633 #pragma omp target data map(da)
634 #pragma omp target data map(S2::S2s)
635 #pragma omp target data map(S2::S2sc)
636 #pragma omp target data map(e, g) // warn-warning 2 {{Type 'S4' is not trivially copyable and not guaranteed to be mapped correctly}} warn-warning 2 {{Type 'S5' is not trivially copyable and not guaranteed to be mapped correctly}}
637 #pragma omp target data map(h) // expected-error {{threadprivate variables are not allowed in 'map' clause}}
638 #pragma omp target data map(k) map(k) // lt50-error 2 {{variable already marked as mapped in current construct}} lt50-note 2 {{used here}}
639 #pragma omp target map(k), map(k[:5]) // lt50-error 2 {{pointer cannot be mapped along with a section derived from itself}} lt50-note 2 {{used here}}
640 foo();
641 #pragma omp target data map(da)
642 #pragma omp target map(da[:4])
643 foo();
644 #pragma omp target data map(k, j, l) // lt50-note 2 {{used here}}
645 #pragma omp target data map(k[:4]) // lt50-error 2 {{pointer cannot be mapped along with a section derived from itself}}
646 #pragma omp target data map(j)
647 #pragma omp target map(l) map(l[:5]) // lt50-error 2 {{variable already marked as mapped in current construct}} lt50-note 2 {{used here}}
648 foo();
649 #pragma omp target data map(k[:4], j, l[:5]) // lt50-note 2 {{used here}}
650 #pragma omp target data map(k) // lt50-error 2 {{pointer cannot be mapped along with a section derived from itself}}
651 #pragma omp target data map(j)
652 #pragma omp target map(l)
653 foo();
654
655 #pragma omp target data map(always, tofrom: x)
656 #pragma omp target data map(always: x) // expected-error {{missing map type}}
657 // ge51-error@+3 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present'}}
658 // lt51-error@+2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
659 // expected-error@+1 {{missing map type}}
660 #pragma omp target data map(tofrom, always: x)
661 #pragma omp target data map(always, tofrom: always, tofrom, x)
662 #pragma omp target map(tofrom j) // expected-error {{expected ',' or ')' in 'map' clause}}
663 foo();
664
665 #pragma omp target data map(close, tofrom: x)
666 #pragma omp target data map(close: x) // expected-error {{missing map type}}
667 // ge51-error@+3 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present'}}
668 // lt51-error@+2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
669 // expected-error@+1 {{missing map type}}
670 #pragma omp target data map(tofrom, close: x)
671 #pragma omp target data map(close, tofrom: close, tofrom, x)
672 foo();
673
674 // lt51-error@+1 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
675 #pragma omp target data map(present, tofrom: x)
676 // ge51-error@+2 {{missing map type}}
677 // lt51-error@+1 {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}}
678 #pragma omp target data map(present: x)
679 // ge51-error@+4 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present'}}
680 // lt51-error@+3 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
681 // ge51-error@+2 {{missing map type}}
682 // lt51-error@+1 {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}}
683 #pragma omp target data map(tofrom, present: x)
684 // lt51-error@+1 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
685 #pragma omp target data map(present, tofrom: present, tofrom, x)
686 foo();
687
688 T marr[10][10], iarr[5];
689 #pragma omp target data map(marr[10][0:2:2]) // expected-error {{expected ']'}} expected-note {{to match this '['}}
690 {}
691 #pragma omp target data map(iarr[:2:d]) // expected-error {{expected ']'}} expected-note {{to match this '['}}
692 {}
693 return 0;
694 }
695
696 struct SA1{
697 int a;
698 struct SA1 *p;
699 int b[10];
700 };
701 struct SB1{
702 int a;
703 struct SA1 s;
704 struct SA1 sa[10];
705 struct SA1 *sp[10];
706 struct SA1 *p;
707 };
708 struct SC1{
709 int a;
710 struct SB1 s;
711 struct SB1 *p;
712 int b[10];
713 };
714
715 class S8 {
716 public:
717 virtual void foo() = 0;
718 } *s8;
719
720 class S9 {
721 public:
foo()722 virtual void foo() {}
723 } s9;
724
725
main(int argc,char ** argv)726 int main(int argc, char **argv) {
727 const int d = 5;
728 const int da[5] = { 0 };
729 S4 e(4);
730 S5 g(5);
731 int i;
732 int &j = i;
733 int *k = &j;
734 S6<int> m;
735 int x;
736 int y;
737 int to, tofrom, always, close, present;
738 const int (&l)[5] = da;
739 SC1 s;
740 SC1 *p;
741 int Arr[10];
742 #pragma omp target data map // expected-error {{expected '(' after 'map'}} lt50-error {{expected at least one 'map' or 'use_device_ptr' clause for '#pragma omp target data'}} ge50-error {{expected at least one 'map', 'use_device_ptr', or 'use_device_addr' clause for '#pragma omp target data'}}
743 #pragma omp target data map( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}}
744 #pragma omp target data map() // expected-error {{expected expression}}
745 #pragma omp target data map(alloc) // expected-error {{use of undeclared identifier 'alloc'}}
746 #pragma omp target data map(to argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected ',' or ')' in 'map' clause}}
747 #pragma omp target data map(to:) // expected-error {{expected expression}}
748 #pragma omp target data map(from: argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
749 #pragma omp target data map(x: y) // expected-error {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}}
750 #pragma omp target map(x)
751 foo();
752 #pragma omp target map(to: x)
753 foo();
754 #pragma omp target map(to: to)
755 foo();
756 #pragma omp target map(to)
757 foo();
758 #pragma omp target map(to, x)
759 foo();
760 #pragma omp target data map(to x) // expected-error {{expected ',' or ')' in 'map' clause}}
761 #pragma omp target data map(tofrom: argc > 0 ? argv[1] : argv[2]) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} ge50-error {{expected addressable lvalue in 'map' clause}}
762 #pragma omp target data map(argc)
763 #pragma omp target data map(S1) // expected-error {{'S1' does not refer to a value}}
764 #pragma omp target data map(a, b, c, d, f) // expected-error {{incomplete type 'S1' where a complete type is required}} warn-warning {{Type 'const S2' is not trivially copyable and not guaranteed to be mapped correctly}} warn-warning {{Type 'const S3' is not trivially copyable and not guaranteed to be mapped correctly}}
765 #pragma omp target data map(argv[1])
766 #pragma omp target data map(ba) // warn-warning {{Type 'const S2 [5]' is not trivially copyable and not guaranteed to be mapped correctly}}
767 #pragma omp target data map(ca) // warn-warning {{Type 'const S3 [5]' is not trivially copyable and not guaranteed to be mapped correctly}}
768 #pragma omp target data map(da)
769 #pragma omp target data map(S2::S2s)
770 #pragma omp target data map(S2::S2sc)
771 #pragma omp target data map(e, g) // warn-warning {{Type 'S4' is not trivially copyable and not guaranteed to be mapped correctly}} warn-warning {{Type 'S5' is not trivially copyable and not guaranteed to be mapped correctly}}
772 #pragma omp target data map(h) // expected-error {{threadprivate variables are not allowed in 'map' clause}}
773 #pragma omp target data map(k), map(k) // lt50-error {{variable already marked as mapped in current construct}} lt50-note {{used here}}
774 #pragma omp target map(k), map(k[:5]) // lt50-error {{pointer cannot be mapped along with a section derived from itself}} lt50-note {{used here}}
775 foo();
776 #pragma omp target data map(da)
777 #pragma omp target map(da[:4])
778 foo();
779 #pragma omp target data map(k, j, l) // lt50-note {{used here}}
780 #pragma omp target data map(k[:4]) // lt50-error {{pointer cannot be mapped along with a section derived from itself}}
781 #pragma omp target data map(j)
782 #pragma omp target map(l) map(l[:5]) // lt50-error {{variable already marked as mapped in current construct}} lt50-note {{used here}}
783 foo();
784 #pragma omp target data map(k[:4], j, l[:5]) // lt50-note {{used here}}
785 #pragma omp target data map(k) // lt50-error {{pointer cannot be mapped along with a section derived from itself}}
786 #pragma omp target data map(j)
787 #pragma omp target map(l)
788 foo();
789
790 #pragma omp target data map(always, tofrom: x)
791 #pragma omp target data map(always: x) // expected-error {{missing map type}}
792 // ge51-error@+3 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present'}}
793 // lt51-error@+2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
794 // expected-error@+1 {{missing map type}}
795 #pragma omp target data map(tofrom, always: x)
796 #pragma omp target data map(always, tofrom: always, tofrom, x)
797 #pragma omp target map(tofrom j) // expected-error {{expected ',' or ')' in 'map' clause}}
798 foo();
799 #pragma omp target data map(close, tofrom: x)
800 #pragma omp target data map(close: x) // expected-error {{missing map type}}
801 // ge51-error@+3 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present'}}
802 // lt51-error@+2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
803 // expected-error@+1 {{missing map type}}
804 #pragma omp target data map(tofrom, close: x)
805 foo();
806 // lt51-error@+1 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
807 #pragma omp target data map(present, tofrom: x)
808 // ge51-error@+2 {{missing map type}}
809 // lt51-error@+1 {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}}
810 #pragma omp target data map(present: x)
811 // ge51-error@+4 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present'}}
812 // lt51-error@+3 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
813 // ge51-error@+2 {{missing map type}}
814 // lt51-error@+1 {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}}
815 #pragma omp target data map(tofrom, present: x)
816 foo();
817 #pragma omp target private(j) map(j) // expected-error {{private variable cannot be in a map clause in '#pragma omp target' directive}} expected-note {{defined as private}}
818 {}
819 #pragma omp target firstprivate(j) map(j) // expected-error {{firstprivate variable cannot be in a map clause in '#pragma omp target' directive}} expected-note {{defined as firstprivate}}
820 {}
821 #pragma omp target map(m) // warn-warning {{Type 'S6<int>' is not trivially copyable and not guaranteed to be mapped correctly}}
822 {}
823 #pragma omp target
824 { s.a++; }
825 // lt50-note@+1 {{used here}}
826 #pragma omp target map(s.s.s)
827 // lt50-error@+1 {{variable already marked as mapped in current construct}}
828 { s.a++; }
829 // lt50-note@+1 {{used here}}
830 #pragma omp target map(s.s.s.a)
831 // lt50-error@+1 {{variable already marked as mapped in current construct}}
832 { s.a++; }
833 // lt50-note@+1 {{used here}}
834 #pragma omp target map(s.b[:5])
835 // lt50-error@+1 {{variable already marked as mapped in current construct}}
836 { s.a++; }
837 #pragma omp target map(s.p[:5])
838 { s.a++; }
839 // lt50-note@+1 {{used here}}
840 #pragma omp target map(s.s.sa[3].a)
841 // lt50-error@+1 {{variable already marked as mapped in current construct}}
842 { s.a++; }
843 // lt50-note@+1 {{used here}}
844 #pragma omp target map(s.s.sp[3]->a)
845 // lt50-error@+1 {{variable already marked as mapped in current construct}}
846 { s.a++; }
847 // lt50-note@+1 {{used here}}
848 #pragma omp target map(s.p->a)
849 // lt50-error@+1 {{variable already marked as mapped in current construct}}
850 { s.a++; }
851 // lt50-note@+1 {{used here}}
852 #pragma omp target map(s.s.p->a)
853 // lt50-error@+1 {{variable already marked as mapped in current construct}}
854 { s.a++; }
855 // lt50-note@+1 {{used here}}
856 #pragma omp target map(s.s.s.b[:2])
857 // lt50-error@+1 {{variable already marked as mapped in current construct}}
858 { s.a++; }
859 // lt50-note@+1 {{used here}}
860 #pragma omp target map(s.s.p->b[:2])
861 // lt50-error@+1 {{variable already marked as mapped in current construct}}
862 { s.a++; }
863 // lt50-note@+1 {{used here}}
864 #pragma omp target map(s.p->p->p->a)
865 // lt50-error@+1 {{variable already marked as mapped in current construct}}
866 { s.a++; }
867 #pragma omp target map(s.s.s.b[:2])
868 { s.s.s.b[0]++; }
869 #pragma omp target map(s8[0:1], s9) // warn-warning {{Type 'class S8' is not trivially copyable and not guaranteed to be mapped correctly}} warn-warning {{Type 'class S9' is not trivially copyable and not guaranteed to be mapped correctly}}
870 {}
871
872 int **BB, *offset, *a;
873
874 #pragma omp target map(**(BB+*offset)) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}}
875 {}
876 #pragma omp target map(**(BB+y)) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}}
877 {}
878 #pragma omp target map(*(a+*offset)) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}}
879 {}
880 #pragma omp target map(**(*offset+BB)) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}}
881 {}
882 #pragma omp target map(**(y+BB)) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}}
883 {}
884 #pragma omp target map(*(*offset+a)) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}}
885 {}
886 #pragma omp target map(**(*offset+BB+*a)) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}}
887 {}
888 #pragma omp target map(**(*(*(&offset))+BB+*a)) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}}
889 {}
890 #pragma omp target map(*(a+(a))) // expected-error {{invalid operands to binary expression ('int *' and 'int *')}}
891 {}
892 #pragma omp target map(*(1+*a+*a)) // expected-error {{indirection requires pointer operand ('int' invalid)}}
893 {}
894
895 #pragma omp target map(delete: a) // expected-error {{map type 'delete' is not allowed for '#pragma omp target'}}
896 {}
897 #pragma omp target map(release: a) // expected-error {{map type 'release' is not allowed for '#pragma omp target'}}
898 {}
899
900 int marr[10][10], iarr[5];
901
902 #pragma omp target map(marr[10][0:2:2]) // expected-error {{expected ']'}} expected-note {{to match this '['}}
903 {}
904 #pragma omp target map(iarr[:2:d]) // expected-error {{expected ']'}} expected-note {{to match this '['}}
905 {}
906
907 #pragma omp target data map(Arr[0:4]) // lt50-note {{used here}}
908 {
909 #pragma omp target
910 Arr[0] = 2; // lt50-error {{original storage of expression in data environment is shared but data environment do not fully contain mapped expression storage}}
911 }
912
913 Array1D<dim> pos;
914
915 #pragma omp target enter data map(to:pos)
916 #pragma omp target enter data map(to:pos.dptr[0:pos.size])
917 #pragma omp target teams distribute parallel for
918 for(int i=0; i<100; i++) {
919 pos(i).x = i;
920 pos(i).y = i+1;
921 }
922
923 return tmain<int, 3>(argc)+tmain<from, 4>(argc); // expected-note {{in instantiation of function template specialization 'tmain<int, 3>' requested here}} expected-note {{in instantiation of function template specialization 'tmain<int, 4>' requested here}}
924 }
925 #endif
926