1
2
3 // expected-no-diagnostics
4 #ifndef HEADER
5 #define HEADER
6
7 // RUN: %clang_cc1 -DOMP45 -verify -Wno-vla -fopenmp -fopenmp-version=45 -ast-print %s | FileCheck %s --check-prefix=OMP45
8 // RUN: %clang_cc1 -DOMP45 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s
9 // RUN: %clang_cc1 -DOMP45 -fopenmp -fopenmp-version=45 -std=c++11 -include-pch %t -verify -Wno-vla %s -ast-print | FileCheck %s --check-prefix=OMP45
10
11 // RUN: %clang_cc1 -DOMP45 -verify -Wno-vla -fopenmp-simd -fopenmp-version=45 -ast-print %s | FileCheck %s --check-prefix=OMP45
12 // RUN: %clang_cc1 -DOMP45 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s
13 // RUN: %clang_cc1 -DOMP45 -fopenmp-simd -fopenmp-version=45 -std=c++11 -include-pch %t -verify -Wno-vla %s -ast-print | FileCheck %s --check-prefix=OMP45
14 #ifdef OMP45
15
foo()16 void foo() {}
17
18 template <typename T, int C>
tmain(T argc,T * argv)19 T tmain(T argc, T *argv) {
20 T i, j, a[20], always, close;
21 #pragma omp target
22 foo();
23 #pragma omp target if (target:argc > 0)
24 foo();
25 #pragma omp target if (C)
26 foo();
27 #pragma omp target map(i)
28 foo();
29 #pragma omp target map(a[0:10], i)
30 foo();
31 #pragma omp target map(to: i) map(from: j)
32 foo();
33 #pragma omp target map(always,alloc: i)
34 foo();
35 #pragma omp target map(always from: i)
36 foo();
37 #pragma omp target map(always)
38 {always++;}
39 #pragma omp target map(always,i)
40 {always++;i++;}
41 #pragma omp target map(close,alloc: i)
42 foo();
43 #pragma omp target map(close, from: i)
44 foo();
45 #pragma omp target map(close)
46 {close++;}
47 #pragma omp target map(close,i)
48 {close++;i++;}
49 #pragma omp target nowait
50 foo();
51 #pragma omp target depend(in : argc, argv[i:argc], a[:])
52 foo();
53 #pragma omp target defaultmap(tofrom: scalar)
54 foo();
55 return 0;
56 }
57
58 // OMP45: template <typename T, int C> T tmain(T argc, T *argv) {
59 // OMP45-NEXT: T i, j, a[20]
60 // OMP45-NEXT: #pragma omp target{{$}}
61 // OMP45-NEXT: foo();
62 // OMP45-NEXT: #pragma omp target if(target: argc > 0)
63 // OMP45-NEXT: foo()
64 // OMP45-NEXT: #pragma omp target if(C)
65 // OMP45-NEXT: foo()
66 // OMP45-NEXT: #pragma omp target map(tofrom: i)
67 // OMP45-NEXT: foo()
68 // OMP45-NEXT: #pragma omp target map(tofrom: a[0:10],i)
69 // OMP45-NEXT: foo()
70 // OMP45-NEXT: #pragma omp target map(to: i) map(from: j)
71 // OMP45-NEXT: foo()
72 // OMP45-NEXT: #pragma omp target map(always,alloc: i)
73 // OMP45-NEXT: foo()
74 // OMP45-NEXT: #pragma omp target map(always,from: i)
75 // OMP45-NEXT: foo()
76 // OMP45-NEXT: #pragma omp target map(tofrom: always)
77 // OMP45-NEXT: {
78 // OMP45-NEXT: always++;
79 // OMP45-NEXT: }
80 // OMP45-NEXT: #pragma omp target map(tofrom: always,i)
81 // OMP45-NEXT: {
82 // OMP45-NEXT: always++;
83 // OMP45-NEXT: i++;
84 // OMP45-NEXT: }
85 // OMP45-NEXT: #pragma omp target map(close,alloc: i)
86 // OMP45-NEXT: foo()
87 // OMP45-NEXT: #pragma omp target map(close,from: i)
88 // OMP45-NEXT: foo()
89 // OMP45-NEXT: #pragma omp target map(tofrom: close)
90 // OMP45-NEXT: {
91 // OMP45-NEXT: close++;
92 // OMP45-NEXT: }
93 // OMP45-NEXT: #pragma omp target map(tofrom: close,i)
94 // OMP45-NEXT: {
95 // OMP45-NEXT: close++;
96 // OMP45-NEXT: i++;
97 // OMP45-NEXT: }
98 // OMP45-NEXT: #pragma omp target nowait
99 // OMP45-NEXT: foo()
100 // OMP45-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:])
101 // OMP45-NEXT: foo()
102 // OMP45-NEXT: #pragma omp target defaultmap(tofrom: scalar)
103 // OMP45-NEXT: foo()
104 // OMP45: template<> int tmain<int, 5>(int argc, int *argv) {
105 // OMP45-NEXT: int i, j, a[20]
106 // OMP45-NEXT: #pragma omp target
107 // OMP45-NEXT: foo();
108 // OMP45-NEXT: #pragma omp target if(target: argc > 0)
109 // OMP45-NEXT: foo()
110 // OMP45-NEXT: #pragma omp target if(5)
111 // OMP45-NEXT: foo()
112 // OMP45-NEXT: #pragma omp target map(tofrom: i)
113 // OMP45-NEXT: foo()
114 // OMP45-NEXT: #pragma omp target map(tofrom: a[0:10],i)
115 // OMP45-NEXT: foo()
116 // OMP45-NEXT: #pragma omp target map(to: i) map(from: j)
117 // OMP45-NEXT: foo()
118 // OMP45-NEXT: #pragma omp target map(always,alloc: i)
119 // OMP45-NEXT: foo()
120 // OMP45-NEXT: #pragma omp target map(always,from: i)
121 // OMP45-NEXT: foo()
122 // OMP45-NEXT: #pragma omp target map(tofrom: always)
123 // OMP45-NEXT: {
124 // OMP45-NEXT: always++;
125 // OMP45-NEXT: }
126 // OMP45-NEXT: #pragma omp target map(tofrom: always,i)
127 // OMP45-NEXT: {
128 // OMP45-NEXT: always++;
129 // OMP45-NEXT: i++;
130 // OMP45-NEXT: }
131 // OMP45-NEXT: #pragma omp target map(close,alloc: i)
132 // OMP45-NEXT: foo()
133 // OMP45-NEXT: #pragma omp target map(close,from: i)
134 // OMP45-NEXT: foo()
135 // OMP45-NEXT: #pragma omp target map(tofrom: close)
136 // OMP45-NEXT: {
137 // OMP45-NEXT: close++;
138 // OMP45-NEXT: }
139 // OMP45-NEXT: #pragma omp target map(tofrom: close,i)
140 // OMP45-NEXT: {
141 // OMP45-NEXT: close++;
142 // OMP45-NEXT: i++;
143 // OMP45-NEXT: }
144 // OMP45-NEXT: #pragma omp target nowait
145 // OMP45-NEXT: foo()
146 // OMP45-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:])
147 // OMP45-NEXT: foo()
148 // OMP45-NEXT: #pragma omp target defaultmap(tofrom: scalar)
149 // OMP45-NEXT: foo()
150 // OMP45: template<> char tmain<char, 1>(char argc, char *argv) {
151 // OMP45-NEXT: char i, j, a[20]
152 // OMP45-NEXT: #pragma omp target
153 // OMP45-NEXT: foo();
154 // OMP45-NEXT: #pragma omp target if(target: argc > 0)
155 // OMP45-NEXT: foo()
156 // OMP45-NEXT: #pragma omp target if(1)
157 // OMP45-NEXT: foo()
158 // OMP45-NEXT: #pragma omp target map(tofrom: i)
159 // OMP45-NEXT: foo()
160 // OMP45-NEXT: #pragma omp target map(tofrom: a[0:10],i)
161 // OMP45-NEXT: foo()
162 // OMP45-NEXT: #pragma omp target map(to: i) map(from: j)
163 // OMP45-NEXT: foo()
164 // OMP45-NEXT: #pragma omp target map(always,alloc: i)
165 // OMP45-NEXT: foo()
166 // OMP45-NEXT: #pragma omp target map(always,from: i)
167 // OMP45-NEXT: foo()
168 // OMP45-NEXT: #pragma omp target map(tofrom: always)
169 // OMP45-NEXT: {
170 // OMP45-NEXT: always++;
171 // OMP45-NEXT: }
172 // OMP45-NEXT: #pragma omp target map(tofrom: always,i)
173 // OMP45-NEXT: {
174 // OMP45-NEXT: always++;
175 // OMP45-NEXT: i++;
176 // OMP45-NEXT: }
177 // OMP45-NEXT: #pragma omp target map(close,alloc: i)
178 // OMP45-NEXT: foo()
179 // OMP45-NEXT: #pragma omp target map(close,from: i)
180 // OMP45-NEXT: foo()
181 // OMP45-NEXT: #pragma omp target map(tofrom: close)
182 // OMP45-NEXT: {
183 // OMP45-NEXT: close++;
184 // OMP45-NEXT: }
185 // OMP45-NEXT: #pragma omp target map(tofrom: close,i)
186 // OMP45-NEXT: {
187 // OMP45-NEXT: close++;
188 // OMP45-NEXT: i++;
189 // OMP45-NEXT: }
190 // OMP45-NEXT: #pragma omp target nowait
191 // OMP45-NEXT: foo()
192 // OMP45-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:])
193 // OMP45-NEXT: foo()
194 // OMP45-NEXT: #pragma omp target defaultmap(tofrom: scalar)
195 // OMP45-NEXT: foo()
196
197 // OMP45-LABEL: class S {
198 class S {
foo()199 void foo() {
200 // OMP45-NEXT: void foo() {
201 int a = 0;
202 // OMP45-NEXT: int a = 0;
203 #pragma omp target map(this[0])
204 // OMP45-NEXT: #pragma omp target map(tofrom: this[0])
205 a++;
206 // OMP45-NEXT: a++;
207 #pragma omp target map(this[:1])
208 // OMP45-NEXT: #pragma omp target map(tofrom: this[:1])
209 a++;
210 // OMP45-NEXT: a++;
211 #pragma omp target map((this)[0])
212 // OMP45-NEXT: #pragma omp target map(tofrom: (this)[0])
213 a++;
214 // OMP45-NEXT: a++;
215 #pragma omp target map(this[:a])
216 // OMP45-NEXT: #pragma omp target map(tofrom: this[:a])
217 a++;
218 // OMP45-NEXT: a++;
219 #pragma omp target map(this[a:1])
220 // OMP45-NEXT: #pragma omp target map(tofrom: this[a:1])
221 a++;
222 // OMP45-NEXT: a++;
223 #pragma omp target map(this[a])
224 // OMP45-NEXT: #pragma omp target map(tofrom: this[a])
225 a++;
226 // OMP45-NEXT: a++;
227 }
228 // OMP45-NEXT: }
229 };
230 // OMP45-NEXT: };
231
232 // OMP45-LABEL: int main(int argc, char **argv) {
main(int argc,char ** argv)233 int main (int argc, char **argv) {
234 int i, j, a[20], always, close;
235 // OMP45-NEXT: int i, j, a[20]
236 #pragma omp target
237 // OMP45-NEXT: #pragma omp target
238 foo();
239 // OMP45-NEXT: foo();
240 #pragma omp target if (argc > 0)
241 // OMP45-NEXT: #pragma omp target if(argc > 0)
242 foo();
243 // OMP45-NEXT: foo();
244
245 #pragma omp target map(i) if(argc>0)
246 // OMP45-NEXT: #pragma omp target map(tofrom: i) if(argc > 0)
247 foo();
248 // OMP45-NEXT: foo();
249
250 #pragma omp target map(i)
251 // OMP45-NEXT: #pragma omp target map(tofrom: i)
252 foo();
253 // OMP45-NEXT: foo();
254
255 #pragma omp target map(a[0:10], i)
256 // OMP45-NEXT: #pragma omp target map(tofrom: a[0:10],i)
257 foo();
258 // OMP45-NEXT: foo();
259
260 #pragma omp target map(to: i) map(from: j)
261 // OMP45-NEXT: #pragma omp target map(to: i) map(from: j)
262 foo();
263 // OMP45-NEXT: foo();
264
265 #pragma omp target map(always,alloc: i)
266 // OMP45-NEXT: #pragma omp target map(always,alloc: i)
267 foo();
268 // OMP45-NEXT: foo();
269
270 #pragma omp target map(always from: i)
271 // OMP45-NEXT: #pragma omp target map(always,from: i)
272 foo();
273 // OMP45-NEXT: foo();
274
275 #pragma omp target map(always)
276 // OMP45-NEXT: #pragma omp target map(tofrom: always)
277 {always++;}
278 // OMP45-NEXT: {
279 // OMP45-NEXT: always++;
280 // OMP45-NEXT: }
281
282 #pragma omp target map(always,i)
283 // OMP45-NEXT: #pragma omp target map(tofrom: always,i)
284 {always++;i++;}
285 // OMP45-NEXT: {
286 // OMP45-NEXT: always++;
287 // OMP45-NEXT: i++;
288 // OMP45-NEXT: }
289
290 #pragma omp target map(close,alloc: i)
291 // OMP45-NEXT: #pragma omp target map(close,alloc: i)
292 foo();
293 // OMP45-NEXT: foo();
294
295 #pragma omp target map(close from: i)
296 // OMP45-NEXT: #pragma omp target map(close,from: i)
297 foo();
298 // OMP45-NEXT: foo();
299
300 #pragma omp target map(close)
301 // OMP45-NEXT: #pragma omp target map(tofrom: close)
302 {close++;}
303 // OMP45-NEXT: {
304 // OMP45-NEXT: close++;
305 // OMP45-NEXT: }
306
307 #pragma omp target map(close,i)
308 // OMP45-NEXT: #pragma omp target map(tofrom: close,i)
309 {close++;i++;}
310 // OMP45-NEXT: {
311 // OMP45-NEXT: close++;
312 // OMP45-NEXT: i++;
313 // OMP45-NEXT: }
314
315 #pragma omp target nowait
316 // OMP45-NEXT: #pragma omp target nowait
317 foo();
318 // OMP45-NEXT: foo();
319
320 #pragma omp target depend(in : argc, argv[i:argc], a[:])
321 // OMP45-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:])
322 foo();
323 // OMP45-NEXT: foo();
324
325 #pragma omp target defaultmap(tofrom: scalar)
326 // OMP45-NEXT: #pragma omp target defaultmap(tofrom: scalar)
327 foo();
328 // OMP45-NEXT: foo();
329
330 return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]);
331 }
332
333 #endif
334
335 #ifdef OMP5
336
337 ///==========================================================================///
338 // RUN: %clang_cc1 -DOMP5 -verify -Wno-vla -fopenmp -fopenmp-version=50 -ast-print %s | FileCheck %s --check-prefix OMP5
339 // RUN: %clang_cc1 -DOMP5 -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s
340 // RUN: %clang_cc1 -DOMP5 -fopenmp -fopenmp-version=50 -std=c++11 -include-pch %t -verify -Wno-vla %s -ast-print | FileCheck %s --check-prefix OMP5
341
342 // RUN: %clang_cc1 -DOMP5 -verify -Wno-vla -fopenmp-simd -fopenmp-version=50 -ast-print %s | FileCheck %s --check-prefix OMP5
343 // RUN: %clang_cc1 -DOMP5 -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s
344 // RUN: %clang_cc1 -DOMP5 -fopenmp-simd -fopenmp-version=50 -std=c++11 -include-pch %t -verify -Wno-vla %s -ast-print | FileCheck %s --check-prefix OMP5
345
346 // RUN: %clang_cc1 -DOMP5 -verify -Wno-vla -fopenmp -fopenmp-version=99 -DOMP99 -ast-print %s | FileCheck %s --check-prefixes=OMP5,REV
347 // RUN: %clang_cc1 -DOMP5 -fopenmp -fopenmp-version=99 -DOMP99 -x c++ -std=c++11 -emit-pch -o %t %s
348 // RUN: %clang_cc1 -DOMP5 -fopenmp -fopenmp-version=99 -DOMP99 -std=c++11 -include-pch %t -verify -Wno-vla %s -ast-print | FileCheck %s --check-prefixes=OMP5,REV
349
350 // RUN: %clang_cc1 -DOMP5 -verify -Wno-vla -fopenmp-simd -fopenmp-version=99 -DOMP99 -ast-print %s | FileCheck %s --check-prefixes=OMP5,REV
351 // RUN: %clang_cc1 -DOMP5 -fopenmp-simd -fopenmp-version=99 -DOMP99 -x c++ -std=c++11 -emit-pch -o %t %s
352 // RUN: %clang_cc1 -DOMP5 -fopenmp-simd -fopenmp-version=99 -DOMP99 -std=c++11 -include-pch %t -verify -Wno-vla %s -ast-print | FileCheck %s --check-prefixes=OMP5,REV
353
354 #ifdef OMP99
355 #pragma omp requires reverse_offload
356 #endif
357 typedef void **omp_allocator_handle_t;
358 extern const omp_allocator_handle_t omp_null_allocator;
359 extern const omp_allocator_handle_t omp_default_mem_alloc;
360 extern const omp_allocator_handle_t omp_large_cap_mem_alloc;
361 extern const omp_allocator_handle_t omp_const_mem_alloc;
362 extern const omp_allocator_handle_t omp_high_bw_mem_alloc;
363 extern const omp_allocator_handle_t omp_low_lat_mem_alloc;
364 extern const omp_allocator_handle_t omp_cgroup_mem_alloc;
365 extern const omp_allocator_handle_t omp_pteam_mem_alloc;
366 extern const omp_allocator_handle_t omp_thread_mem_alloc;
367
foo()368 void foo() {}
369
370 #pragma omp declare target
bar()371 void bar() {}
372 #pragma omp end declare target
373
374 int a;
375 #pragma omp declare target link(a)
376
377 template <typename T, int C>
tmain(T argc,T * argv)378 T tmain(T argc, T *argv) {
379 T i, j, a[20], always, close;
380 #pragma omp target device(argc)
381 foo();
382 #pragma omp target if (target:argc > 0) device(device_num: C)
383 foo();
384 #ifdef OMP99
385 #pragma omp target if (C) device(ancestor: argc)
386 foo();
387 #endif
388 #pragma omp target map(i)
389 foo();
390 #pragma omp target map(a[0:10], i)
391 foo();
392 #pragma omp target map(to: i) map(from: j)
393 foo();
394 #pragma omp target map(always,alloc: i)
395 foo();
396 #pragma omp target map(always, from: i)
397 foo();
398 #pragma omp target map(always)
399 {always++;}
400 #pragma omp target map(always,i)
401 {always++;i++;}
402 #pragma omp target map(close,alloc: i)
403 foo();
404 #pragma omp target map(close, from: i)
405 foo();
406 #pragma omp target map(close)
407 {close++;}
408 #pragma omp target map(close,i)
409 {close++;i++;}
410 #pragma omp target nowait
411 foo();
412 #pragma omp target depend(in : argc, argv[i:argc], a[:])
413 foo();
414 #pragma omp target defaultmap(alloc: scalar)
415 foo();
416 #pragma omp target defaultmap(to: scalar)
417 foo();
418 #pragma omp target defaultmap(from: scalar)
419 foo();
420 #pragma omp target defaultmap(tofrom: scalar)
421 foo();
422 #pragma omp target defaultmap(firstprivate: scalar)
423 foo();
424 #pragma omp target defaultmap(none: scalar)
425 foo();
426 #pragma omp target defaultmap(default: scalar)
427 foo();
428 #pragma omp target defaultmap(alloc: aggregate)
429 foo();
430 #pragma omp target defaultmap(to: aggregate)
431 foo();
432 #pragma omp target defaultmap(from: aggregate)
433 foo();
434 #pragma omp target defaultmap(tofrom: aggregate)
435 foo();
436 #pragma omp target defaultmap(firstprivate: aggregate)
437 foo();
438 #pragma omp target defaultmap(none: aggregate)
439 foo();
440 #pragma omp target defaultmap(default: aggregate)
441 foo();
442 #pragma omp target defaultmap(alloc: pointer)
443 foo();
444 #pragma omp target defaultmap(to: pointer)
445 foo();
446 #pragma omp target defaultmap(from: pointer)
447 foo();
448 #pragma omp target defaultmap(tofrom: pointer)
449 foo();
450 #pragma omp target defaultmap(firstprivate: pointer)
451 foo();
452 #pragma omp target defaultmap(none: pointer)
453 foo();
454 #pragma omp target defaultmap(default: pointer)
455 foo();
456 #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer)
457 foo();
458 #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate)
459 foo();
460 #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar)
461 foo();
462 #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer)
463 foo();
464 #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar)
465 foo();
466
467 int *g;
468
469 #pragma omp target is_device_ptr(g) defaultmap(none: pointer)
470 g++;
471 #pragma omp target private(g) defaultmap(none: pointer)
472 g++;
473 #pragma omp target firstprivate(g) defaultmap(none: pointer)
474 g++;
475 #pragma omp target defaultmap(none: scalar) map(to: i)
476 i++;
477 #pragma omp target defaultmap(none: aggregate) map(to: a)
478 a[3]++;
479 #pragma omp target defaultmap(none: scalar)
480 bar();
481
482 return 0;
483 }
484
485 // OMP5: template <typename T, int C> T tmain(T argc, T *argv) {
486 // OMP5-NEXT: T i, j, a[20]
487 // OMP5-NEXT: #pragma omp target device(argc){{$}}
488 // OMP5-NEXT: foo();
489 // OMP5-NEXT: #pragma omp target if(target: argc > 0) device(device_num: C)
490 // OMP5-NEXT: foo()
491 // REV: #pragma omp target if(C) device(ancestor: argc)
492 // REV-NEXT: foo()
493 // OMP5-NEXT: #pragma omp target map(tofrom: i)
494 // OMP5-NEXT: foo()
495 // OMP5-NEXT: #pragma omp target map(tofrom: a[0:10],i)
496 // OMP5-NEXT: foo()
497 // OMP5-NEXT: #pragma omp target map(to: i) map(from: j)
498 // OMP5-NEXT: foo()
499 // OMP5-NEXT: #pragma omp target map(always,alloc: i)
500 // OMP5-NEXT: foo()
501 // OMP5-NEXT: #pragma omp target map(always,from: i)
502 // OMP5-NEXT: foo()
503 // OMP5-NEXT: #pragma omp target map(tofrom: always)
504 // OMP5-NEXT: {
505 // OMP5-NEXT: always++;
506 // OMP5-NEXT: }
507 // OMP5-NEXT: #pragma omp target map(tofrom: always,i)
508 // OMP5-NEXT: {
509 // OMP5-NEXT: always++;
510 // OMP5-NEXT: i++;
511 // OMP5-NEXT: }
512 // OMP5-NEXT: #pragma omp target map(close,alloc: i)
513 // OMP5-NEXT: foo()
514 // OMP5-NEXT: #pragma omp target map(close,from: i)
515 // OMP5-NEXT: foo()
516 // OMP5-NEXT: #pragma omp target map(tofrom: close)
517 // OMP5-NEXT: {
518 // OMP5-NEXT: close++;
519 // OMP5-NEXT: }
520 // OMP5-NEXT: #pragma omp target map(tofrom: close,i)
521 // OMP5-NEXT: {
522 // OMP5-NEXT: close++;
523 // OMP5-NEXT: i++;
524 // OMP5-NEXT: }
525 // OMP5-NEXT: #pragma omp target nowait
526 // OMP5-NEXT: foo()
527 // OMP5-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:])
528 // OMP5-NEXT: foo()
529 // OMP5-NEXT: #pragma omp target defaultmap(alloc: scalar)
530 // OMP5-NEXT: foo()
531 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar)
532 // OMP5-NEXT: foo()
533 // OMP5-NEXT: #pragma omp target defaultmap(from: scalar)
534 // OMP5-NEXT: foo()
535 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: scalar)
536 // OMP5-NEXT: foo()
537 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: scalar)
538 // OMP5-NEXT: foo()
539 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar)
540 // OMP5-NEXT: foo()
541 // OMP5-NEXT: #pragma omp target defaultmap(default: scalar)
542 // OMP5-NEXT: foo()
543 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate)
544 // OMP5-NEXT: foo()
545 // OMP5-NEXT: #pragma omp target defaultmap(to: aggregate)
546 // OMP5-NEXT: foo()
547 // OMP5-NEXT: #pragma omp target defaultmap(from: aggregate)
548 // OMP5-NEXT: foo()
549 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate)
550 // OMP5-NEXT: foo()
551 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: aggregate)
552 // OMP5-NEXT: foo()
553 // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate)
554 // OMP5-NEXT: foo()
555 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate)
556 // OMP5-NEXT: foo()
557 // OMP5-NEXT: #pragma omp target defaultmap(alloc: pointer)
558 // OMP5-NEXT: foo()
559 // OMP5-NEXT: #pragma omp target defaultmap(to: pointer)
560 // OMP5-NEXT: foo()
561 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer)
562 // OMP5-NEXT: foo()
563 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: pointer)
564 // OMP5-NEXT: foo()
565 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: pointer)
566 // OMP5-NEXT: foo()
567 // OMP5-NEXT: #pragma omp target defaultmap(none: pointer)
568 // OMP5-NEXT: foo()
569 // OMP5-NEXT: #pragma omp target defaultmap(default: pointer)
570 // OMP5-NEXT: foo()
571 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer)
572 // OMP5-NEXT: foo()
573 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate)
574 // OMP5-NEXT: foo()
575 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar)
576 // OMP5-NEXT: foo()
577 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer)
578 // OMP5-NEXT: foo()
579 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar)
580 // OMP5-NEXT: foo()
581 // OMP5: template<> int tmain<int, 5>(int argc, int *argv) {
582 // OMP5-NEXT: int i, j, a[20]
583 // OMP5-NEXT: #pragma omp target
584 // OMP5-NEXT: foo();
585 // OMP5-NEXT: #pragma omp target if(target: argc > 0)
586 // OMP5-NEXT: foo()
587 // REV: #pragma omp target if(5)
588 // REV-NEXT: foo()
589 // OMP5-NEXT: #pragma omp target map(tofrom: i)
590 // OMP5-NEXT: foo()
591 // OMP5-NEXT: #pragma omp target map(tofrom: a[0:10],i)
592 // OMP5-NEXT: foo()
593 // OMP5-NEXT: #pragma omp target map(to: i) map(from: j)
594 // OMP5-NEXT: foo()
595 // OMP5-NEXT: #pragma omp target map(always,alloc: i)
596 // OMP5-NEXT: foo()
597 // OMP5-NEXT: #pragma omp target map(always,from: i)
598 // OMP5-NEXT: foo()
599 // OMP5-NEXT: #pragma omp target map(tofrom: always)
600 // OMP5-NEXT: {
601 // OMP5-NEXT: always++;
602 // OMP5-NEXT: }
603 // OMP5-NEXT: #pragma omp target map(tofrom: always,i)
604 // OMP5-NEXT: {
605 // OMP5-NEXT: always++;
606 // OMP5-NEXT: i++;
607 // OMP5-NEXT: }
608 // OMP5-NEXT: #pragma omp target map(close,alloc: i)
609 // OMP5-NEXT: foo()
610 // OMP5-NEXT: #pragma omp target map(close,from: i)
611 // OMP5-NEXT: foo()
612 // OMP5-NEXT: #pragma omp target map(tofrom: close)
613 // OMP5-NEXT: {
614 // OMP5-NEXT: close++;
615 // OMP5-NEXT: }
616 // OMP5-NEXT: #pragma omp target map(tofrom: close,i)
617 // OMP5-NEXT: {
618 // OMP5-NEXT: close++;
619 // OMP5-NEXT: i++;
620 // OMP5-NEXT: }
621 // OMP5-NEXT: #pragma omp target nowait
622 // OMP5-NEXT: foo()
623 // OMP5-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:])
624 // OMP5-NEXT: foo()
625 // OMP5-NEXT: #pragma omp target defaultmap(alloc: scalar)
626 // OMP5-NEXT: foo()
627 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar)
628 // OMP5-NEXT: foo()
629 // OMP5-NEXT: #pragma omp target defaultmap(from: scalar)
630 // OMP5-NEXT: foo()
631 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: scalar)
632 // OMP5-NEXT: foo()
633 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: scalar)
634 // OMP5-NEXT: foo()
635 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar)
636 // OMP5-NEXT: foo()
637 // OMP5-NEXT: #pragma omp target defaultmap(default: scalar)
638 // OMP5-NEXT: foo()
639 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate)
640 // OMP5-NEXT: foo()
641 // OMP5-NEXT: #pragma omp target defaultmap(to: aggregate)
642 // OMP5-NEXT: foo()
643 // OMP5-NEXT: #pragma omp target defaultmap(from: aggregate)
644 // OMP5-NEXT: foo()
645 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate)
646 // OMP5-NEXT: foo()
647 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: aggregate)
648 // OMP5-NEXT: foo()
649 // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate)
650 // OMP5-NEXT: foo()
651 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate)
652 // OMP5-NEXT: foo()
653 // OMP5-NEXT: #pragma omp target defaultmap(alloc: pointer)
654 // OMP5-NEXT: foo()
655 // OMP5-NEXT: #pragma omp target defaultmap(to: pointer)
656 // OMP5-NEXT: foo()
657 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer)
658 // OMP5-NEXT: foo()
659 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: pointer)
660 // OMP5-NEXT: foo()
661 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: pointer)
662 // OMP5-NEXT: foo()
663 // OMP5-NEXT: #pragma omp target defaultmap(none: pointer)
664 // OMP5-NEXT: foo()
665 // OMP5-NEXT: #pragma omp target defaultmap(default: pointer)
666 // OMP5-NEXT: foo()
667 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer)
668 // OMP5-NEXT: foo()
669 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate)
670 // OMP5-NEXT: foo()
671 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar)
672 // OMP5-NEXT: foo()
673 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer)
674 // OMP5-NEXT: foo()
675 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar)
676 // OMP5-NEXT: foo()
677 // OMP5: template<> char tmain<char, 1>(char argc, char *argv) {
678 // OMP5-NEXT: char i, j, a[20]
679 // OMP5-NEXT: #pragma omp target device(argc)
680 // OMP5-NEXT: foo();
681 // OMP5-NEXT: #pragma omp target if(target: argc > 0) device(device_num: 1)
682 // OMP5-NEXT: foo()
683 // REV: #pragma omp target if(1) device(ancestor: argc)
684 // REV-NEXT: foo()
685 // OMP5-NEXT: #pragma omp target map(tofrom: i)
686 // OMP5-NEXT: foo()
687 // OMP5-NEXT: #pragma omp target map(tofrom: a[0:10],i)
688 // OMP5-NEXT: foo()
689 // OMP5-NEXT: #pragma omp target map(to: i) map(from: j)
690 // OMP5-NEXT: foo()
691 // OMP5-NEXT: #pragma omp target map(always,alloc: i)
692 // OMP5-NEXT: foo()
693 // OMP5-NEXT: #pragma omp target map(always,from: i)
694 // OMP5-NEXT: foo()
695 // OMP5-NEXT: #pragma omp target map(tofrom: always)
696 // OMP5-NEXT: {
697 // OMP5-NEXT: always++;
698 // OMP5-NEXT: }
699 // OMP5-NEXT: #pragma omp target map(tofrom: always,i)
700 // OMP5-NEXT: {
701 // OMP5-NEXT: always++;
702 // OMP5-NEXT: i++;
703 // OMP5-NEXT: }
704 // OMP5-NEXT: #pragma omp target map(close,alloc: i)
705 // OMP5-NEXT: foo()
706 // OMP5-NEXT: #pragma omp target map(close,from: i)
707 // OMP5-NEXT: foo()
708 // OMP5-NEXT: #pragma omp target map(tofrom: close)
709 // OMP5-NEXT: {
710 // OMP5-NEXT: close++;
711 // OMP5-NEXT: }
712 // OMP5-NEXT: #pragma omp target map(tofrom: close,i)
713 // OMP5-NEXT: {
714 // OMP5-NEXT: close++;
715 // OMP5-NEXT: i++;
716 // OMP5-NEXT: }
717 // OMP5-NEXT: #pragma omp target nowait
718 // OMP5-NEXT: foo()
719 // OMP5-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:])
720 // OMP5-NEXT: foo()
721 // OMP5-NEXT: #pragma omp target defaultmap(alloc: scalar)
722 // OMP5-NEXT: foo()
723 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar)
724 // OMP5-NEXT: foo()
725 // OMP5-NEXT: #pragma omp target defaultmap(from: scalar)
726 // OMP5-NEXT: foo()
727 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: scalar)
728 // OMP5-NEXT: foo()
729 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: scalar)
730 // OMP5-NEXT: foo()
731 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar)
732 // OMP5-NEXT: foo()
733 // OMP5-NEXT: #pragma omp target defaultmap(default: scalar)
734 // OMP5-NEXT: foo()
735 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate)
736 // OMP5-NEXT: foo()
737 // OMP5-NEXT: #pragma omp target defaultmap(to: aggregate)
738 // OMP5-NEXT: foo()
739 // OMP5-NEXT: #pragma omp target defaultmap(from: aggregate)
740 // OMP5-NEXT: foo()
741 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate)
742 // OMP5-NEXT: foo()
743 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: aggregate)
744 // OMP5-NEXT: foo()
745 // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate)
746 // OMP5-NEXT: foo()
747 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate)
748 // OMP5-NEXT: foo()
749 // OMP5-NEXT: #pragma omp target defaultmap(alloc: pointer)
750 // OMP5-NEXT: foo()
751 // OMP5-NEXT: #pragma omp target defaultmap(to: pointer)
752 // OMP5-NEXT: foo()
753 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer)
754 // OMP5-NEXT: foo()
755 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: pointer)
756 // OMP5-NEXT: foo()
757 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: pointer)
758 // OMP5-NEXT: foo()
759 // OMP5-NEXT: #pragma omp target defaultmap(none: pointer)
760 // OMP5-NEXT: foo()
761 // OMP5-NEXT: #pragma omp target defaultmap(default: pointer)
762 // OMP5-NEXT: foo()
763 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer)
764 // OMP5-NEXT: foo()
765 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate)
766 // OMP5-NEXT: foo()
767 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar)
768 // OMP5-NEXT: foo()
769 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer)
770 // OMP5-NEXT: foo()
771 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar)
772 // OMP5-NEXT: foo()
773 // OMP5-NEXT: int *g;
774 // OMP5-NEXT: #pragma omp target is_device_ptr(g) defaultmap(none: pointer)
775 // OMP5-NEXT: g++;
776 // OMP5-NEXT: #pragma omp target private(g) defaultmap(none: pointer)
777 // OMP5-NEXT: g++;
778 // OMP5-NEXT: #pragma omp target firstprivate(g) defaultmap(none: pointer)
779 // OMP5-NEXT: g++;
780 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) map(to: i)
781 // OMP5-NEXT: i++;
782 // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate) map(to: a)
783 // OMP5-NEXT: a[3]++;
784 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar)
785 // OMP5-NEXT: bar();
786
787 // OMP5-LABEL: class S {
788 class S {
foo()789 void foo() {
790 // OMP5-NEXT: void foo() {
791 int a = 0;
792 // OMP5-NEXT: int a = 0;
793 #pragma omp target map(this[0])
794 // OMP5-NEXT: #pragma omp target map(tofrom: this[0])
795 a++;
796 // OMP5-NEXT: a++;
797 #pragma omp target map(this[:1])
798 // OMP5-NEXT: #pragma omp target map(tofrom: this[:1])
799 a++;
800 // OMP5-NEXT: a++;
801 #pragma omp target map((this)[0])
802 // OMP5-NEXT: #pragma omp target map(tofrom: (this)[0])
803 a++;
804 // OMP5-NEXT: a++;
805 #pragma omp target map(this[:a])
806 // OMP5-NEXT: #pragma omp target map(tofrom: this[:a])
807 a++;
808 // OMP5-NEXT: a++;
809 #pragma omp target map(this[a:1])
810 // OMP5-NEXT: #pragma omp target map(tofrom: this[a:1])
811 a++;
812 // OMP5-NEXT: a++;
813 #pragma omp target map(this[a])
814 // OMP5-NEXT: #pragma omp target map(tofrom: this[a])
815 a++;
816 // OMP5-NEXT: a++;
817 }
818 // OMP5-NEXT: }
819 };
820 // OMP5-NEXT: };
821
822 // OMP5-LABEL: int main(int argc, char **argv) {
main(int argc,char ** argv)823 int main (int argc, char **argv) {
824 int i, j, a[20], always, close;
825 // OMP5-NEXT: int i, j, a[20]
826 #pragma omp target
827 // OMP5-NEXT: #pragma omp target
828 foo();
829 // OMP5-NEXT: foo();
830 #pragma omp target if (argc > 0)
831 // OMP5-NEXT: #pragma omp target if(argc > 0)
832 foo();
833 // OMP5-NEXT: foo();
834
835 #pragma omp target map(i) if(argc>0)
836 // OMP5-NEXT: #pragma omp target map(tofrom: i) if(argc > 0)
837 foo();
838 // OMP5-NEXT: foo();
839
840 #pragma omp target map(i)
841 // OMP5-NEXT: #pragma omp target map(tofrom: i)
842 foo();
843 // OMP5-NEXT: foo();
844
845 #pragma omp target map(a[0:10], i)
846 // OMP5-NEXT: #pragma omp target map(tofrom: a[0:10],i)
847 foo();
848 // OMP5-NEXT: foo();
849
850 #pragma omp target map(to: i) map(from: j)
851 // OMP5-NEXT: #pragma omp target map(to: i) map(from: j)
852 foo();
853 // OMP5-NEXT: foo();
854
855 #pragma omp target map(always,alloc: i)
856 // OMP5-NEXT: #pragma omp target map(always,alloc: i)
857 foo();
858 // OMP5-NEXT: foo();
859
860 #pragma omp target map(always, from: i)
861 // OMP5-NEXT: #pragma omp target map(always,from: i)
862 foo();
863 // OMP5-NEXT: foo();
864
865 #pragma omp target map(always)
866 // OMP5-NEXT: #pragma omp target map(tofrom: always)
867 {always++;}
868 // OMP5-NEXT: {
869 // OMP5-NEXT: always++;
870 // OMP5-NEXT: }
871
872 #pragma omp target map(always,i)
873 // OMP5-NEXT: #pragma omp target map(tofrom: always,i)
874 {always++;i++;}
875 // OMP5-NEXT: {
876 // OMP5-NEXT: always++;
877 // OMP5-NEXT: i++;
878 // OMP5-NEXT: }
879
880 #pragma omp target map(close,alloc: i)
881 // OMP5-NEXT: #pragma omp target map(close,alloc: i)
882 foo();
883 // OMP5-NEXT: foo();
884
885 #pragma omp target map(close, from: i)
886 // OMP5-NEXT: #pragma omp target map(close,from: i)
887 foo();
888 // OMP5-NEXT: foo();
889
890 #pragma omp target map(close)
891 // OMP5-NEXT: #pragma omp target map(tofrom: close)
892 {close++;}
893 // OMP5-NEXT: {
894 // OMP5-NEXT: close++;
895 // OMP5-NEXT: }
896
897 #pragma omp target map(close,i)
898 // OMP5-NEXT: #pragma omp target map(tofrom: close,i)
899 {close++;i++;}
900 // OMP5-NEXT: {
901 // OMP5-NEXT: close++;
902 // OMP5-NEXT: i++;
903 // OMP5-NEXT: }
904
905 #pragma omp target nowait
906 // OMP5-NEXT: #pragma omp target nowait
907 foo();
908 // OMP5-NEXT: foo();
909
910 #pragma omp target depend(in : argc, argv[i:argc], a[:])
911 // OMP5-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:])
912 foo();
913 // OMP5-NEXT: foo();
914
915 #pragma omp target defaultmap(alloc: scalar)
916 // OMP5-NEXT: #pragma omp target defaultmap(alloc: scalar)
917 foo();
918 // OMP5-NEXT: foo();
919
920 #pragma omp target defaultmap(to: scalar)
921 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar)
922 foo();
923 // OMP5-NEXT: foo();
924
925 #pragma omp target defaultmap(from: scalar)
926 // OMP5-NEXT: #pragma omp target defaultmap(from: scalar)
927 foo();
928 // OMP5-NEXT: foo();
929
930 #pragma omp target defaultmap(tofrom: scalar)
931 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: scalar)
932 foo();
933 // OMP5-NEXT: foo();
934
935 #pragma omp target defaultmap(firstprivate: scalar)
936 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: scalar)
937 foo();
938 // OMP5-NEXT: foo();
939
940 #pragma omp target defaultmap(none: scalar)
941 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar)
942 foo();
943 // OMP5-NEXT: foo();
944
945 #pragma omp target defaultmap(default: scalar)
946 // OMP5-NEXT: #pragma omp target defaultmap(default: scalar)
947 foo();
948 // OMP5-NEXT: foo();
949
950 #pragma omp target defaultmap(alloc: aggregate)
951 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate)
952 foo();
953 // OMP5-NEXT: foo();
954
955 #pragma omp target defaultmap(to: aggregate)
956 // OMP5-NEXT: #pragma omp target defaultmap(to: aggregate)
957 foo();
958 // OMP5-NEXT: foo();
959
960 #pragma omp target defaultmap(from: aggregate)
961 // OMP5-NEXT: #pragma omp target defaultmap(from: aggregate)
962 foo();
963 // OMP5-NEXT: foo();
964
965 #pragma omp target defaultmap(tofrom: aggregate)
966 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate)
967 foo();
968 // OMP5-NEXT: foo();
969
970 #pragma omp target defaultmap(firstprivate: aggregate)
971 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: aggregate)
972 foo();
973 // OMP5-NEXT: foo();
974
975 #pragma omp target defaultmap(none: aggregate)
976 // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate)
977 foo();
978 // OMP5-NEXT: foo();
979
980 #pragma omp target defaultmap(default: aggregate)
981 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate)
982 foo();
983 // OMP5-NEXT: foo();
984
985 #pragma omp target defaultmap(alloc: pointer)
986 // OMP5-NEXT: #pragma omp target defaultmap(alloc: pointer)
987 foo();
988 // OMP5-NEXT: foo();
989
990 #pragma omp target defaultmap(to: pointer)
991 // OMP5-NEXT: #pragma omp target defaultmap(to: pointer)
992 foo();
993 // OMP5-NEXT: foo();
994
995 #pragma omp target defaultmap(from: pointer)
996 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer)
997 foo();
998 // OMP5-NEXT: foo();
999
1000 #pragma omp target defaultmap(tofrom: pointer)
1001 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: pointer)
1002 foo();
1003 // OMP5-NEXT: foo();
1004
1005 #pragma omp target defaultmap(firstprivate: pointer)
1006 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: pointer)
1007 foo();
1008 // OMP5-NEXT: foo();
1009
1010 #pragma omp target defaultmap(none: pointer)
1011 // OMP5-NEXT: #pragma omp target defaultmap(none: pointer)
1012 foo();
1013 // OMP5-NEXT: foo();
1014
1015 #pragma omp target defaultmap(default: pointer)
1016 // OMP5-NEXT: #pragma omp target defaultmap(default: pointer)
1017 foo();
1018 // OMP5-NEXT: foo();
1019
1020 #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer)
1021 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer)
1022 foo();
1023 // OMP5-NEXT: foo();
1024
1025 #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate)
1026 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate)
1027 foo();
1028 // OMP5-NEXT: foo();
1029
1030 #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar)
1031 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar)
1032 foo();
1033 // OMP5-NEXT: foo();
1034
1035 #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer)
1036 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer)
1037 foo();
1038 // OMP5-NEXT: foo();
1039
1040 #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar)
1041 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar)
1042 foo();
1043 // OMP5-NEXT: foo();
1044
1045 int *g;
1046 // OMP5-NEXT: int *g;
1047
1048 #pragma omp target is_device_ptr(g) defaultmap(none: pointer)
1049 // OMP5-NEXT: #pragma omp target is_device_ptr(g) defaultmap(none: pointer)
1050 g++;
1051 // OMP5-NEXT: g++;
1052
1053 #pragma omp target private(g) defaultmap(none: pointer)
1054 // OMP5-NEXT: #pragma omp target private(g) defaultmap(none: pointer)
1055 g++;
1056 // OMP5-NEXT: g++;
1057
1058 #pragma omp target firstprivate(g) defaultmap(none: pointer)
1059 // OMP5-NEXT: #pragma omp target firstprivate(g) defaultmap(none: pointer)
1060 g++;
1061 // OMP5-NEXT: g++;
1062
1063 #pragma omp target defaultmap(none: scalar) map(to: i)
1064 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) map(to: i)
1065 i++;
1066 // OMP5-NEXT: i++;
1067
1068 #pragma omp target defaultmap(none: aggregate) map(to: a)
1069 // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate) map(to: a)
1070 a[3]++;
1071 // OMP5-NEXT: a[3]++;
1072
1073 #pragma omp target defaultmap(none: scalar)
1074 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar)
1075 bar();
1076 // OMP5-NEXT: bar();
1077 #pragma omp target defaultmap(none)
1078 // OMP5-NEXT: #pragma omp target defaultmap(none)
1079 // OMP5-NEXT: bar();
1080 bar();
1081 #pragma omp target allocate(omp_default_mem_alloc:argv) uses_allocators(omp_default_mem_alloc,omp_large_cap_mem_alloc) allocate(omp_large_cap_mem_alloc:argc) private(argc, argv)
1082 // OMP5-NEXT: #pragma omp target allocate(omp_default_mem_alloc: argv) uses_allocators(omp_default_mem_alloc,omp_large_cap_mem_alloc) allocate(omp_large_cap_mem_alloc: argc) private(argc,argv)
1083 // OMP5-NEXT: bar();
1084 bar();
1085 return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]);
1086 }
1087
1088 #endif //OMP5
1089
1090 #ifdef OMP51
1091
1092 ///==========================================================================///
1093 // RUN: %clang_cc1 -DOMP51 -verify -Wno-vla -fopenmp -ast-print %s | FileCheck %s --check-prefix OMP51
1094 // RUN: %clang_cc1 -DOMP51 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s
1095 // RUN: %clang_cc1 -DOMP51 -fopenmp -std=c++11 -include-pch %t -verify -Wno-vla %s -ast-print | FileCheck %s --check-prefix OMP51
1096
1097 // RUN: %clang_cc1 -DOMP51 -verify -Wno-vla -fopenmp-simd -ast-print %s | FileCheck %s --check-prefix OMP51
1098 // RUN: %clang_cc1 -DOMP51 -fopenmp-simd -x c++ -std=c++11 -emit-pch -o %t %s
1099 // RUN: %clang_cc1 -DOMP51 -fopenmp-simd -std=c++11 -include-pch %t -verify -Wno-vla %s -ast-print | FileCheck %s --check-prefix OMP51
1100
foo()1101 void foo() {}
1102
1103 template <typename T, int C>
tmain(T argc,T * argv)1104 T tmain(T argc, T *argv) {
1105 #pragma omp target defaultmap(present: scalar)
1106 foo();
1107 #pragma omp target defaultmap(present: aggregate)
1108 foo();
1109 #pragma omp target defaultmap(present: pointer)
1110 foo();
1111 #pragma omp target thread_limit(C)
1112 foo();
1113 #pragma omp target defaultmap(present)
1114 foo();
1115
1116 return 0;
1117 }
1118
1119 // OMP51: template <typename T, int C> T tmain(T argc, T *argv) {
1120 // OMP51-NEXT: #pragma omp target defaultmap(present: scalar)
1121 // OMP51-NEXT: foo()
1122 // OMP51-NEXT: #pragma omp target defaultmap(present: aggregate)
1123 // OMP51-NEXT: foo()
1124 // OMP51-NEXT: #pragma omp target defaultmap(present: pointer)
1125 // OMP51-NEXT: foo()
1126 // OMP51-NEXT: #pragma omp target thread_limit(C)
1127 // OMP51-NEXT: foo()
1128 // OMP51-NEXT: #pragma omp target defaultmap(present)
1129 // OMP51-NEXT: foo()
1130
1131 // OMP51-LABEL: int main(int argc, char **argv) {
main(int argc,char ** argv)1132 int main (int argc, char **argv) {
1133 #pragma omp target defaultmap(present: scalar)
1134 // OMP51-NEXT: #pragma omp target defaultmap(present: scalar)
1135 foo();
1136 // OMP51-NEXT: foo();
1137 #pragma omp target defaultmap(present: aggregate)
1138 // OMP51-NEXT: #pragma omp target defaultmap(present: aggregate)
1139 foo();
1140 // OMP51-NEXT: foo();
1141 #pragma omp target defaultmap(present: pointer)
1142 // OMP51-NEXT: #pragma omp target defaultmap(present: pointer)
1143 foo();
1144 // OMP51-NEXT: foo();
1145
1146 return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]);
1147 }
1148 #endif // OMP51
1149
1150 #ifdef OMP52
1151
1152 ///==========================================================================///
1153 // RUN: %clang_cc1 -DOMP52 -verify -Wno-vla -fopenmp -fopenmp-version=52 -ast-print %s | FileCheck %s --check-prefix OMP52
1154 // RUN: %clang_cc1 -DOMP52 -fopenmp -fopenmp-version=52 -x c++ -std=c++11 -emit-pch -o %t %s
1155 // RUN: %clang_cc1 -DOMP52 -fopenmp -fopenmp-version=52 -std=c++11 -include-pch %t -verify -Wno-vla %s -ast-print | FileCheck %s --check-prefix OMP52
1156
1157 // RUN: %clang_cc1 -DOMP52 -verify -Wno-vla -fopenmp-simd -fopenmp-version=52 -ast-print %s | FileCheck %s --check-prefix OMP52
1158 // RUN: %clang_cc1 -DOMP52 -fopenmp-simd -fopenmp-version=52 -x c++ -std=c++11 -emit-pch -o %t %s
1159 // RUN: %clang_cc1 -DOMP52 -fopenmp-simd -fopenmp-version=52 -std=c++11 -include-pch %t -verify -Wno-vla %s -ast-print | FileCheck %s --check-prefix OMP52
1160
foo()1161 void foo() {}
1162
1163 template <typename T, int C>
tmain(T argc,T * argv)1164 T tmain(T argc, T *argv) {
1165 int N = 100;
1166 int v[N];
1167 #pragma omp target map(iterator(it = 0:N:2), to: v[it])
1168 foo();
1169 #pragma omp target map(iterator(it = 0:N:4), from: v[it])
1170 foo();
1171
1172 return 0;
1173 }
1174
1175 // OMP52: template <typename T, int C> T tmain(T argc, T *argv) {
1176 // OMP52-NEXT: int N = 100;
1177 // OMP52-NEXT: int v[N];
1178 // OMP52-NEXT: #pragma omp target map(iterator(int it = 0:N:2),to: v[it])
1179 // OMP52-NEXT: foo()
1180 // OMP52-NEXT: #pragma omp target map(iterator(int it = 0:N:4),from: v[it])
1181 // OMP52-NEXT: foo()
1182
1183 // OMP52-LABEL: int main(int argc, char **argv) {
main(int argc,char ** argv)1184 int main (int argc, char **argv) {
1185 int i, j, a[20], always, close;
1186 // OMP52-NEXT: int i, j, a[20]
1187 #pragma omp target
1188 // OMP52-NEXT: #pragma omp target
1189 foo();
1190 // OMP52-NEXT: foo();
1191 #pragma omp target map(iterator(it = 0:20:2), to: a[it])
1192 // OMP52-NEXT: #pragma omp target map(iterator(int it = 0:20:2),to: a[it])
1193 foo();
1194 // OMP52-NEXT: foo();
1195 #pragma omp target map(iterator(it = 0:20:4), from: a[it])
1196 // OMP52-NEXT: #pragma omp target map(iterator(int it = 0:20:4),from: a[it])
1197 foo();
1198 // OMP52-NEXT: foo();
1199
1200 return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]);
1201 }
1202 #endif // OMP52
1203
1204 #ifdef OMP60
1205
1206 ///==========================================================================///
1207 // RUN: %clang_cc1 -DOMP60 -verify -Wno-vla -fopenmp -fopenmp-version=60 -ast-print %s | FileCheck %s --check-prefix OMP60
1208 // RUN: %clang_cc1 -DOMP60 -fopenmp -fopenmp-version=60 -x c++ -std=c++11 -emit-pch -o %t %s
1209 // RUN: %clang_cc1 -DOMP60 -fopenmp -fopenmp-version=60 -std=c++11 -include-pch %t -verify -Wno-vla %s -ast-print | FileCheck %s --check-prefix OMP60
1210
1211 // RUN: %clang_cc1 -DOMP60 -verify -Wno-vla -fopenmp-simd -fopenmp-version=60 -ast-print %s | FileCheck %s --check-prefix OMP60
1212 // RUN: %clang_cc1 -DOMP60 -fopenmp-simd -fopenmp-version=60 -x c++ -std=c++11 -emit-pch -o %t %s
1213 // RUN: %clang_cc1 -DOMP60 -fopenmp-simd -fopenmp-version=60 -std=c++11 -include-pch %t -verify -Wno-vla %s -ast-print | FileCheck %s --check-prefix OMP60
1214
foo()1215 void foo() {}
1216 template <typename T, int C>
tmain(T argc,T * argv)1217 T tmain(T argc, T *argv) {
1218 T i;
1219 #pragma omp target map(from always: i)
1220 foo();
1221 #pragma omp target map(from, close: i)
1222 foo();
1223 #pragma omp target map(always,close: i)
1224 foo();
1225 return 0;
1226 }
1227 //OMP60: template <typename T, int C> T tmain(T argc, T *argv) {
1228 //OMP60-NEXT: T i;
1229 //OMP60-NEXT: #pragma omp target map(always,from: i)
1230 //OMP60-NEXT: foo();
1231 //OMP60-NEXT: #pragma omp target map(close,from: i)
1232 //OMP60-NEXT: foo();
1233 //OMP60-NEXT: #pragma omp target map(always,close,tofrom: i)
1234 //OMP60-NEXT: foo();
1235 //OMP60-NEXT: return 0;
1236 //OMP60-NEXT:}
1237 //OMP60: template<> int tmain<int, 5>(int argc, int *argv) {
1238 //OMP60-NEXT: int i;
1239 //OMP60-NEXT: #pragma omp target map(always,from: i)
1240 //OMP60-NEXT: foo();
1241 //OMP60-NEXT: #pragma omp target map(close,from: i)
1242 //OMP60-NEXT: foo();
1243 //OMP60-NEXT: #pragma omp target map(always,close,tofrom: i)
1244 //OMP60-NEXT: foo();
1245 //OMP60-NEXT: return 0;
1246 //OMP60-NEXT:}
1247 //OMP60: template<> char tmain<char, 1>(char argc, char *argv) {
1248 //OMP60-NEXT: char i;
1249 //OMP60-NEXT: #pragma omp target map(always,from: i)
1250 //OMP60-NEXT: foo();
1251 //OMP60-NEXT: #pragma omp target map(close,from: i)
1252 //OMP60-NEXT: foo();
1253 //OMP60-NEXT: #pragma omp target map(always,close,tofrom: i)
1254 //OMP60-NEXT: foo();
1255 //OMP60-NEXT: return 0;
1256 //OMP60-NEXT:}
main(int argc,char ** argv)1257 int main (int argc, char **argv) {
1258 return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]);
1259 }
1260 #endif // OMP60
1261
1262 #ifdef OMPX
1263
1264 // RUN: %clang_cc1 -DOMPX -verify -Wno-vla -fopenmp -fopenmp-extensions -ast-print %s | FileCheck %s --check-prefix=OMPX
1265 // RUN: %clang_cc1 -DOMPX -fopenmp -fopenmp-extensions -x c++ -std=c++11 -emit-pch -o %t %s
1266 // RUN: %clang_cc1 -DOMPX -fopenmp -fopenmp-extensions -std=c++11 -include-pch %t -verify -Wno-vla %s -ast-print | FileCheck %s --check-prefix=OMPX
1267
1268 // RUN: %clang_cc1 -DOMPX -verify -Wno-vla -fopenmp-simd -fopenmp-extensions -ast-print %s | FileCheck %s --check-prefix=OMPX
1269 // RUN: %clang_cc1 -DOMPX -fopenmp-simd -fopenmp-extensions -x c++ -std=c++11 -emit-pch -o %t %s
1270 // RUN: %clang_cc1 -DOMPX -fopenmp-simd -fopenmp-extensions -std=c++11 -include-pch %t -verify -Wno-vla %s -ast-print | FileCheck %s --check-prefix=OMPX
1271
foo()1272 void foo() {}
1273
1274 template <typename T, int C>
tmain(T argc,T * argv)1275 T tmain(T argc, T *argv) {
1276 T i, ompx_hold;
1277 #pragma omp target map(ompx_hold,alloc: i)
1278 foo();
1279 #pragma omp target map(ompx_hold from: i)
1280 foo();
1281 #pragma omp target map(ompx_hold)
1282 {ompx_hold++;}
1283 #pragma omp target map(ompx_hold,i)
1284 {ompx_hold++;i++;}
1285 return 0;
1286 }
1287
1288 // OMPX: template <typename T, int C> T tmain(T argc, T *argv) {
1289 // OMPX-NEXT: T i, ompx_hold;
1290 // OMPX-NEXT: #pragma omp target map(ompx_hold,alloc: i)
1291 // OMPX-NEXT: foo()
1292 // OMPX-NEXT: #pragma omp target map(ompx_hold,from: i)
1293 // OMPX-NEXT: foo()
1294 // OMPX-NEXT: #pragma omp target map(tofrom: ompx_hold)
1295 // OMPX-NEXT: {
1296 // OMPX-NEXT: ompx_hold++;
1297 // OMPX-NEXT: }
1298 // OMPX-NEXT: #pragma omp target map(tofrom: ompx_hold,i)
1299 // OMPX-NEXT: {
1300 // OMPX-NEXT: ompx_hold++;
1301 // OMPX-NEXT: i++;
1302 // OMPX-NEXT: }
1303
1304 // OMPX-LABEL: int main(int argc, char **argv) {
1305 // OMPX-NEXT: int i, ompx_hold;
1306 // OMPX-NEXT: #pragma omp target map(ompx_hold,alloc: i)
1307 // OMPX-NEXT: foo();
1308 // OMPX-NEXT: #pragma omp target map(ompx_hold,from: i)
1309 // OMPX-NEXT: foo();
1310 // OMPX-NEXT: #pragma omp target map(tofrom: ompx_hold)
1311 // OMPX-NEXT: {
1312 // OMPX-NEXT: ompx_hold++;
1313 // OMPX-NEXT: }
1314 // OMPX-NEXT: #pragma omp target map(tofrom: ompx_hold,i)
1315 // OMPX-NEXT: {
1316 // OMPX-NEXT: ompx_hold++;
1317 // OMPX-NEXT: i++;
1318 // OMPX-NEXT: }
main(int argc,char ** argv)1319 int main (int argc, char **argv) {
1320 int i, ompx_hold;
1321 #pragma omp target map(ompx_hold,alloc: i)
1322 foo();
1323 #pragma omp target map(ompx_hold from: i)
1324 foo();
1325 #pragma omp target map(ompx_hold)
1326 {ompx_hold++;}
1327 #pragma omp target map(ompx_hold,i)
1328 {ompx_hold++;i++;}
1329 return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]);
1330 }
1331
1332 #endif
1333 #endif
1334