1 
2 
3 // expected-no-diagnostics
4 #ifndef HEADER
5 #define HEADER
6 
7 // RUN: %clang_cc1 -DOMP45 -verify -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 -fsyntax-only -verify %s -ast-print | FileCheck %s --check-prefix=OMP45
10 
11 // RUN: %clang_cc1 -DOMP45 -verify -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 -fsyntax-only -verify %s -ast-print | FileCheck %s --check-prefix=OMP45
14 #ifdef OMP45
15 
foo()16 void foo() {}
17 
18 template <typename T, int C>
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 -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 -fsyntax-only -verify %s -ast-print | FileCheck %s --check-prefix OMP5
341 
342 // RUN: %clang_cc1 -DOMP5 -verify -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 -fsyntax-only -verify %s -ast-print | FileCheck %s --check-prefix OMP5
345 
346 typedef void **omp_allocator_handle_t;
347 extern const omp_allocator_handle_t omp_null_allocator;
348 extern const omp_allocator_handle_t omp_default_mem_alloc;
349 extern const omp_allocator_handle_t omp_large_cap_mem_alloc;
350 extern const omp_allocator_handle_t omp_const_mem_alloc;
351 extern const omp_allocator_handle_t omp_high_bw_mem_alloc;
352 extern const omp_allocator_handle_t omp_low_lat_mem_alloc;
353 extern const omp_allocator_handle_t omp_cgroup_mem_alloc;
354 extern const omp_allocator_handle_t omp_pteam_mem_alloc;
355 extern const omp_allocator_handle_t omp_thread_mem_alloc;
356 
foo()357 void foo() {}
358 
359 #pragma omp declare target
bar()360 void bar() {}
361 #pragma omp end declare target
362 
363 int a;
364 #pragma omp declare target link(a)
365 
366 template <typename T, int C>
367 T tmain(T argc, T *argv) {
368   T i, j, a[20], always, close;
369 #pragma omp target device(argc)
370   foo();
371 #pragma omp target if (target:argc > 0) device(device_num: C)
372   foo();
373 #pragma omp target if (C) device(ancestor: argc)
374   foo();
375 #pragma omp target map(i)
376   foo();
377 #pragma omp target map(a[0:10], i)
378   foo();
379 #pragma omp target map(to: i) map(from: j)
380   foo();
381 #pragma omp target map(always,alloc: i)
382   foo();
383 #pragma omp target map(always from: i)
384   foo();
385 #pragma omp target map(always)
386   {always++;}
387 #pragma omp target map(always,i)
388   {always++;i++;}
389 #pragma omp target map(close,alloc: i)
390   foo();
391 #pragma omp target map(close from: i)
392   foo();
393 #pragma omp target map(close)
394   {close++;}
395 #pragma omp target map(close,i)
396   {close++;i++;}
397 #pragma omp target nowait
398   foo();
399 #pragma omp target depend(in : argc, argv[i:argc], a[:])
400   foo();
401 #pragma omp target defaultmap(alloc: scalar)
402   foo();
403 #pragma omp target defaultmap(to: scalar)
404   foo();
405 #pragma omp target defaultmap(from: scalar)
406   foo();
407 #pragma omp target defaultmap(tofrom: scalar)
408   foo();
409 #pragma omp target defaultmap(firstprivate: scalar)
410   foo();
411 #pragma omp target defaultmap(none: scalar)
412   foo();
413 #pragma omp target defaultmap(default: scalar)
414   foo();
415 #pragma omp target defaultmap(alloc: aggregate)
416   foo();
417 #pragma omp target defaultmap(to: aggregate)
418   foo();
419 #pragma omp target defaultmap(from: aggregate)
420   foo();
421 #pragma omp target defaultmap(tofrom: aggregate)
422   foo();
423 #pragma omp target defaultmap(firstprivate: aggregate)
424   foo();
425 #pragma omp target defaultmap(none: aggregate)
426   foo();
427 #pragma omp target defaultmap(default: aggregate)
428   foo();
429 #pragma omp target defaultmap(alloc: pointer)
430   foo();
431 #pragma omp target defaultmap(to: pointer)
432   foo();
433 #pragma omp target defaultmap(from: pointer)
434   foo();
435 #pragma omp target defaultmap(tofrom: pointer)
436   foo();
437 #pragma omp target defaultmap(firstprivate: pointer)
438   foo();
439 #pragma omp target defaultmap(none: pointer)
440   foo();
441 #pragma omp target defaultmap(default: pointer)
442   foo();
443 #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer)
444   foo();
445 #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate)
446   foo();
447 #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar)
448   foo();
449 #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer)
450   foo();
451 #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar)
452   foo();
453 
454   int *g;
455 
456 #pragma omp target is_device_ptr(g) defaultmap(none: pointer)
457   g++;
458 #pragma omp target private(g) defaultmap(none: pointer)
459   g++;
460 #pragma omp target firstprivate(g) defaultmap(none: pointer)
461   g++;
462 #pragma omp target defaultmap(none: scalar) map(to: i)
463   i++;
464 #pragma omp target defaultmap(none: aggregate) map(to: a)
465   a[3]++;
466 #pragma omp target defaultmap(none: scalar)
467   bar();
468 
469   return 0;
470 }
471 
472 // OMP5: template <typename T, int C> T tmain(T argc, T *argv) {
473 // OMP5-NEXT: T i, j, a[20]
474 // OMP5-NEXT: #pragma omp target device(argc){{$}}
475 // OMP5-NEXT: foo();
476 // OMP5-NEXT: #pragma omp target if(target: argc > 0) device(device_num: C)
477 // OMP5-NEXT: foo()
478 // OMP5-NEXT: #pragma omp target if(C) device(ancestor: argc)
479 // OMP5-NEXT: foo()
480 // OMP5-NEXT: #pragma omp target map(tofrom: i)
481 // OMP5-NEXT: foo()
482 // OMP5-NEXT: #pragma omp target map(tofrom: a[0:10],i)
483 // OMP5-NEXT: foo()
484 // OMP5-NEXT: #pragma omp target map(to: i) map(from: j)
485 // OMP5-NEXT: foo()
486 // OMP5-NEXT: #pragma omp target map(always,alloc: i)
487 // OMP5-NEXT: foo()
488 // OMP5-NEXT: #pragma omp target map(always,from: i)
489 // OMP5-NEXT: foo()
490 // OMP5-NEXT: #pragma omp target map(tofrom: always)
491 // OMP5-NEXT: {
492 // OMP5-NEXT: always++;
493 // OMP5-NEXT: }
494 // OMP5-NEXT: #pragma omp target map(tofrom: always,i)
495 // OMP5-NEXT: {
496 // OMP5-NEXT: always++;
497 // OMP5-NEXT: i++;
498 // OMP5-NEXT: }
499 // OMP5-NEXT: #pragma omp target map(close,alloc: i)
500 // OMP5-NEXT: foo()
501 // OMP5-NEXT: #pragma omp target map(close,from: i)
502 // OMP5-NEXT: foo()
503 // OMP5-NEXT: #pragma omp target map(tofrom: close)
504 // OMP5-NEXT: {
505 // OMP5-NEXT: close++;
506 // OMP5-NEXT: }
507 // OMP5-NEXT: #pragma omp target map(tofrom: close,i)
508 // OMP5-NEXT: {
509 // OMP5-NEXT: close++;
510 // OMP5-NEXT: i++;
511 // OMP5-NEXT: }
512 // OMP5-NEXT: #pragma omp target nowait
513 // OMP5-NEXT: foo()
514 // OMP5-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:])
515 // OMP5-NEXT: foo()
516 // OMP5-NEXT: #pragma omp target defaultmap(alloc: scalar)
517 // OMP5-NEXT: foo()
518 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar)
519 // OMP5-NEXT: foo()
520 // OMP5-NEXT: #pragma omp target defaultmap(from: scalar)
521 // OMP5-NEXT: foo()
522 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: scalar)
523 // OMP5-NEXT: foo()
524 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: scalar)
525 // OMP5-NEXT: foo()
526 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar)
527 // OMP5-NEXT: foo()
528 // OMP5-NEXT: #pragma omp target defaultmap(default: scalar)
529 // OMP5-NEXT: foo()
530 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate)
531 // OMP5-NEXT: foo()
532 // OMP5-NEXT: #pragma omp target defaultmap(to: aggregate)
533 // OMP5-NEXT: foo()
534 // OMP5-NEXT: #pragma omp target defaultmap(from: aggregate)
535 // OMP5-NEXT: foo()
536 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate)
537 // OMP5-NEXT: foo()
538 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: aggregate)
539 // OMP5-NEXT: foo()
540 // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate)
541 // OMP5-NEXT: foo()
542 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate)
543 // OMP5-NEXT: foo()
544 // OMP5-NEXT: #pragma omp target defaultmap(alloc: pointer)
545 // OMP5-NEXT: foo()
546 // OMP5-NEXT: #pragma omp target defaultmap(to: pointer)
547 // OMP5-NEXT: foo()
548 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer)
549 // OMP5-NEXT: foo()
550 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: pointer)
551 // OMP5-NEXT: foo()
552 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: pointer)
553 // OMP5-NEXT: foo()
554 // OMP5-NEXT: #pragma omp target defaultmap(none: pointer)
555 // OMP5-NEXT: foo()
556 // OMP5-NEXT: #pragma omp target defaultmap(default: pointer)
557 // OMP5-NEXT: foo()
558 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer)
559 // OMP5-NEXT: foo()
560 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate)
561 // OMP5-NEXT: foo()
562 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar)
563 // OMP5-NEXT: foo()
564 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer)
565 // OMP5-NEXT: foo()
566 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar)
567 // OMP5-NEXT: foo()
568 // OMP5: template<> int tmain<int, 5>(int argc, int *argv) {
569 // OMP5-NEXT: int i, j, a[20]
570 // OMP5-NEXT: #pragma omp target
571 // OMP5-NEXT: foo();
572 // OMP5-NEXT: #pragma omp target if(target: argc > 0)
573 // OMP5-NEXT: foo()
574 // OMP5-NEXT: #pragma omp target if(5)
575 // OMP5-NEXT: foo()
576 // OMP5-NEXT: #pragma omp target map(tofrom: i)
577 // OMP5-NEXT: foo()
578 // OMP5-NEXT: #pragma omp target map(tofrom: a[0:10],i)
579 // OMP5-NEXT: foo()
580 // OMP5-NEXT: #pragma omp target map(to: i) map(from: j)
581 // OMP5-NEXT: foo()
582 // OMP5-NEXT: #pragma omp target map(always,alloc: i)
583 // OMP5-NEXT: foo()
584 // OMP5-NEXT: #pragma omp target map(always,from: i)
585 // OMP5-NEXT: foo()
586 // OMP5-NEXT: #pragma omp target map(tofrom: always)
587 // OMP5-NEXT: {
588 // OMP5-NEXT: always++;
589 // OMP5-NEXT: }
590 // OMP5-NEXT: #pragma omp target map(tofrom: always,i)
591 // OMP5-NEXT: {
592 // OMP5-NEXT: always++;
593 // OMP5-NEXT: i++;
594 // OMP5-NEXT: }
595 // OMP5-NEXT: #pragma omp target map(close,alloc: i)
596 // OMP5-NEXT: foo()
597 // OMP5-NEXT: #pragma omp target map(close,from: i)
598 // OMP5-NEXT: foo()
599 // OMP5-NEXT: #pragma omp target map(tofrom: close)
600 // OMP5-NEXT: {
601 // OMP5-NEXT: close++;
602 // OMP5-NEXT: }
603 // OMP5-NEXT: #pragma omp target map(tofrom: close,i)
604 // OMP5-NEXT: {
605 // OMP5-NEXT: close++;
606 // OMP5-NEXT: i++;
607 // OMP5-NEXT: }
608 // OMP5-NEXT: #pragma omp target nowait
609 // OMP5-NEXT: foo()
610 // OMP5-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:])
611 // OMP5-NEXT: foo()
612 // OMP5-NEXT: #pragma omp target defaultmap(alloc: scalar)
613 // OMP5-NEXT: foo()
614 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar)
615 // OMP5-NEXT: foo()
616 // OMP5-NEXT: #pragma omp target defaultmap(from: scalar)
617 // OMP5-NEXT: foo()
618 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: scalar)
619 // OMP5-NEXT: foo()
620 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: scalar)
621 // OMP5-NEXT: foo()
622 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar)
623 // OMP5-NEXT: foo()
624 // OMP5-NEXT: #pragma omp target defaultmap(default: scalar)
625 // OMP5-NEXT: foo()
626 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate)
627 // OMP5-NEXT: foo()
628 // OMP5-NEXT: #pragma omp target defaultmap(to: aggregate)
629 // OMP5-NEXT: foo()
630 // OMP5-NEXT: #pragma omp target defaultmap(from: aggregate)
631 // OMP5-NEXT: foo()
632 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate)
633 // OMP5-NEXT: foo()
634 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: aggregate)
635 // OMP5-NEXT: foo()
636 // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate)
637 // OMP5-NEXT: foo()
638 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate)
639 // OMP5-NEXT: foo()
640 // OMP5-NEXT: #pragma omp target defaultmap(alloc: pointer)
641 // OMP5-NEXT: foo()
642 // OMP5-NEXT: #pragma omp target defaultmap(to: pointer)
643 // OMP5-NEXT: foo()
644 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer)
645 // OMP5-NEXT: foo()
646 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: pointer)
647 // OMP5-NEXT: foo()
648 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: pointer)
649 // OMP5-NEXT: foo()
650 // OMP5-NEXT: #pragma omp target defaultmap(none: pointer)
651 // OMP5-NEXT: foo()
652 // OMP5-NEXT: #pragma omp target defaultmap(default: pointer)
653 // OMP5-NEXT: foo()
654 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer)
655 // OMP5-NEXT: foo()
656 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate)
657 // OMP5-NEXT: foo()
658 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar)
659 // OMP5-NEXT: foo()
660 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer)
661 // OMP5-NEXT: foo()
662 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar)
663 // OMP5-NEXT: foo()
664 // OMP5: template<> char tmain<char, 1>(char argc, char *argv) {
665 // OMP5-NEXT: char i, j, a[20]
666 // OMP5-NEXT: #pragma omp target device(argc)
667 // OMP5-NEXT: foo();
668 // OMP5-NEXT: #pragma omp target if(target: argc > 0) device(device_num: 1)
669 // OMP5-NEXT: foo()
670 // OMP5-NEXT: #pragma omp target if(1) device(ancestor: argc)
671 // OMP5-NEXT: foo()
672 // OMP5-NEXT: #pragma omp target map(tofrom: i)
673 // OMP5-NEXT: foo()
674 // OMP5-NEXT: #pragma omp target map(tofrom: a[0:10],i)
675 // OMP5-NEXT: foo()
676 // OMP5-NEXT: #pragma omp target map(to: i) map(from: j)
677 // OMP5-NEXT: foo()
678 // OMP5-NEXT: #pragma omp target map(always,alloc: i)
679 // OMP5-NEXT: foo()
680 // OMP5-NEXT: #pragma omp target map(always,from: i)
681 // OMP5-NEXT: foo()
682 // OMP5-NEXT: #pragma omp target map(tofrom: always)
683 // OMP5-NEXT: {
684 // OMP5-NEXT: always++;
685 // OMP5-NEXT: }
686 // OMP5-NEXT: #pragma omp target map(tofrom: always,i)
687 // OMP5-NEXT: {
688 // OMP5-NEXT: always++;
689 // OMP5-NEXT: i++;
690 // OMP5-NEXT: }
691 // OMP5-NEXT: #pragma omp target map(close,alloc: i)
692 // OMP5-NEXT: foo()
693 // OMP5-NEXT: #pragma omp target map(close,from: i)
694 // OMP5-NEXT: foo()
695 // OMP5-NEXT: #pragma omp target map(tofrom: close)
696 // OMP5-NEXT: {
697 // OMP5-NEXT: close++;
698 // OMP5-NEXT: }
699 // OMP5-NEXT: #pragma omp target map(tofrom: close,i)
700 // OMP5-NEXT: {
701 // OMP5-NEXT: close++;
702 // OMP5-NEXT: i++;
703 // OMP5-NEXT: }
704 // OMP5-NEXT: #pragma omp target nowait
705 // OMP5-NEXT: foo()
706 // OMP5-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:])
707 // OMP5-NEXT: foo()
708 // OMP5-NEXT: #pragma omp target defaultmap(alloc: scalar)
709 // OMP5-NEXT: foo()
710 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar)
711 // OMP5-NEXT: foo()
712 // OMP5-NEXT: #pragma omp target defaultmap(from: scalar)
713 // OMP5-NEXT: foo()
714 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: scalar)
715 // OMP5-NEXT: foo()
716 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: scalar)
717 // OMP5-NEXT: foo()
718 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar)
719 // OMP5-NEXT: foo()
720 // OMP5-NEXT: #pragma omp target defaultmap(default: scalar)
721 // OMP5-NEXT: foo()
722 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate)
723 // OMP5-NEXT: foo()
724 // OMP5-NEXT: #pragma omp target defaultmap(to: aggregate)
725 // OMP5-NEXT: foo()
726 // OMP5-NEXT: #pragma omp target defaultmap(from: aggregate)
727 // OMP5-NEXT: foo()
728 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate)
729 // OMP5-NEXT: foo()
730 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: aggregate)
731 // OMP5-NEXT: foo()
732 // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate)
733 // OMP5-NEXT: foo()
734 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate)
735 // OMP5-NEXT: foo()
736 // OMP5-NEXT: #pragma omp target defaultmap(alloc: pointer)
737 // OMP5-NEXT: foo()
738 // OMP5-NEXT: #pragma omp target defaultmap(to: pointer)
739 // OMP5-NEXT: foo()
740 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer)
741 // OMP5-NEXT: foo()
742 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: pointer)
743 // OMP5-NEXT: foo()
744 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: pointer)
745 // OMP5-NEXT: foo()
746 // OMP5-NEXT: #pragma omp target defaultmap(none: pointer)
747 // OMP5-NEXT: foo()
748 // OMP5-NEXT: #pragma omp target defaultmap(default: pointer)
749 // OMP5-NEXT: foo()
750 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer)
751 // OMP5-NEXT: foo()
752 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate)
753 // OMP5-NEXT: foo()
754 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar)
755 // OMP5-NEXT: foo()
756 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer)
757 // OMP5-NEXT: foo()
758 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar)
759 // OMP5-NEXT: foo()
760 // OMP5-NEXT: int *g;
761 // OMP5-NEXT: #pragma omp target is_device_ptr(g) defaultmap(none: pointer)
762 // OMP5-NEXT: g++;
763 // OMP5-NEXT: #pragma omp target private(g) defaultmap(none: pointer)
764 // OMP5-NEXT: g++;
765 // OMP5-NEXT: #pragma omp target firstprivate(g) defaultmap(none: pointer)
766 // OMP5-NEXT: g++;
767 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) map(to: i)
768 // OMP5-NEXT: i++;
769 // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate) map(to: a)
770 // OMP5-NEXT: a[3]++;
771 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar)
772 // OMP5-NEXT: bar();
773 
774 // OMP5-LABEL: class S {
775 class S {
foo()776   void foo() {
777 // OMP5-NEXT: void foo() {
778     int a = 0;
779 // OMP5-NEXT: int a = 0;
780     #pragma omp target map(this[0])
781 // OMP5-NEXT: #pragma omp target map(tofrom: this[0])
782       a++;
783 // OMP5-NEXT: a++;
784     #pragma omp target map(this[:1])
785 // OMP5-NEXT: #pragma omp target map(tofrom: this[:1])
786       a++;
787 // OMP5-NEXT: a++;
788     #pragma omp target map((this)[0])
789 // OMP5-NEXT: #pragma omp target map(tofrom: (this)[0])
790       a++;
791 // OMP5-NEXT: a++;
792     #pragma omp target map(this[:a])
793 // OMP5-NEXT: #pragma omp target map(tofrom: this[:a])
794       a++;
795 // OMP5-NEXT: a++;
796     #pragma omp target map(this[a:1])
797 // OMP5-NEXT: #pragma omp target map(tofrom: this[a:1])
798       a++;
799 // OMP5-NEXT: a++;
800     #pragma omp target map(this[a])
801 // OMP5-NEXT: #pragma omp target map(tofrom: this[a])
802       a++;
803 // OMP5-NEXT: a++;
804   }
805 // OMP5-NEXT: }
806 };
807 // OMP5-NEXT: };
808 
809 // OMP5-LABEL: int main(int argc, char **argv) {
main(int argc,char ** argv)810 int main (int argc, char **argv) {
811   int i, j, a[20], always, close;
812 // OMP5-NEXT: int i, j, a[20]
813 #pragma omp target
814 // OMP5-NEXT: #pragma omp target
815   foo();
816 // OMP5-NEXT: foo();
817 #pragma omp target if (argc > 0)
818 // OMP5-NEXT: #pragma omp target if(argc > 0)
819   foo();
820 // OMP5-NEXT: foo();
821 
822 #pragma omp target map(i) if(argc>0)
823 // OMP5-NEXT: #pragma omp target map(tofrom: i) if(argc > 0)
824   foo();
825 // OMP5-NEXT: foo();
826 
827 #pragma omp target map(i)
828 // OMP5-NEXT: #pragma omp target map(tofrom: i)
829   foo();
830 // OMP5-NEXT: foo();
831 
832 #pragma omp target map(a[0:10], i)
833 // OMP5-NEXT: #pragma omp target map(tofrom: a[0:10],i)
834   foo();
835 // OMP5-NEXT: foo();
836 
837 #pragma omp target map(to: i) map(from: j)
838 // OMP5-NEXT: #pragma omp target map(to: i) map(from: j)
839   foo();
840 // OMP5-NEXT: foo();
841 
842 #pragma omp target map(always,alloc: i)
843 // OMP5-NEXT: #pragma omp target map(always,alloc: i)
844   foo();
845 // OMP5-NEXT: foo();
846 
847 #pragma omp target map(always from: i)
848 // OMP5-NEXT: #pragma omp target map(always,from: i)
849   foo();
850 // OMP5-NEXT: foo();
851 
852 #pragma omp target map(always)
853 // OMP5-NEXT: #pragma omp target map(tofrom: always)
854   {always++;}
855 // OMP5-NEXT: {
856 // OMP5-NEXT: always++;
857 // OMP5-NEXT: }
858 
859 #pragma omp target map(always,i)
860 // OMP5-NEXT: #pragma omp target map(tofrom: always,i)
861   {always++;i++;}
862 // OMP5-NEXT: {
863 // OMP5-NEXT: always++;
864 // OMP5-NEXT: i++;
865 // OMP5-NEXT: }
866 
867 #pragma omp target map(close,alloc: i)
868 // OMP5-NEXT: #pragma omp target map(close,alloc: i)
869   foo();
870 // OMP5-NEXT: foo();
871 
872 #pragma omp target map(close from: i)
873 // OMP5-NEXT: #pragma omp target map(close,from: i)
874   foo();
875 // OMP5-NEXT: foo();
876 
877 #pragma omp target map(close)
878 // OMP5-NEXT: #pragma omp target map(tofrom: close)
879   {close++;}
880 // OMP5-NEXT: {
881 // OMP5-NEXT: close++;
882 // OMP5-NEXT: }
883 
884 #pragma omp target map(close,i)
885 // OMP5-NEXT: #pragma omp target map(tofrom: close,i)
886   {close++;i++;}
887 // OMP5-NEXT: {
888 // OMP5-NEXT: close++;
889 // OMP5-NEXT: i++;
890 // OMP5-NEXT: }
891 
892 #pragma omp target nowait
893 // OMP5-NEXT: #pragma omp target nowait
894   foo();
895 // OMP5-NEXT: foo();
896 
897 #pragma omp target depend(in : argc, argv[i:argc], a[:])
898 // OMP5-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:])
899   foo();
900 // OMP5-NEXT: foo();
901 
902 #pragma omp target defaultmap(alloc: scalar)
903 // OMP5-NEXT: #pragma omp target defaultmap(alloc: scalar)
904   foo();
905 // OMP5-NEXT: foo();
906 
907 #pragma omp target defaultmap(to: scalar)
908 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar)
909   foo();
910 // OMP5-NEXT: foo();
911 
912 #pragma omp target defaultmap(from: scalar)
913 // OMP5-NEXT: #pragma omp target defaultmap(from: scalar)
914   foo();
915 // OMP5-NEXT: foo();
916 
917 #pragma omp target defaultmap(tofrom: scalar)
918 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: scalar)
919   foo();
920 // OMP5-NEXT: foo();
921 
922 #pragma omp target defaultmap(firstprivate: scalar)
923 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: scalar)
924   foo();
925 // OMP5-NEXT: foo();
926 
927 #pragma omp target defaultmap(none: scalar)
928 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar)
929   foo();
930 // OMP5-NEXT: foo();
931 
932 #pragma omp target defaultmap(default: scalar)
933 // OMP5-NEXT: #pragma omp target defaultmap(default: scalar)
934   foo();
935 // OMP5-NEXT: foo();
936 
937 #pragma omp target defaultmap(alloc: aggregate)
938 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate)
939   foo();
940 // OMP5-NEXT: foo();
941 
942 #pragma omp target defaultmap(to: aggregate)
943 // OMP5-NEXT: #pragma omp target defaultmap(to: aggregate)
944   foo();
945 // OMP5-NEXT: foo();
946 
947 #pragma omp target defaultmap(from: aggregate)
948 // OMP5-NEXT: #pragma omp target defaultmap(from: aggregate)
949   foo();
950 // OMP5-NEXT: foo();
951 
952 #pragma omp target defaultmap(tofrom: aggregate)
953 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate)
954   foo();
955 // OMP5-NEXT: foo();
956 
957 #pragma omp target defaultmap(firstprivate: aggregate)
958 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: aggregate)
959   foo();
960 // OMP5-NEXT: foo();
961 
962 #pragma omp target defaultmap(none: aggregate)
963 // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate)
964   foo();
965 // OMP5-NEXT: foo();
966 
967 #pragma omp target defaultmap(default: aggregate)
968 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate)
969   foo();
970 // OMP5-NEXT: foo();
971 
972 #pragma omp target defaultmap(alloc: pointer)
973 // OMP5-NEXT: #pragma omp target defaultmap(alloc: pointer)
974   foo();
975 // OMP5-NEXT: foo();
976 
977 #pragma omp target defaultmap(to: pointer)
978 // OMP5-NEXT: #pragma omp target defaultmap(to: pointer)
979   foo();
980 // OMP5-NEXT: foo();
981 
982 #pragma omp target defaultmap(from: pointer)
983 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer)
984   foo();
985 // OMP5-NEXT: foo();
986 
987 #pragma omp target defaultmap(tofrom: pointer)
988 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: pointer)
989   foo();
990 // OMP5-NEXT: foo();
991 
992 #pragma omp target defaultmap(firstprivate: pointer)
993 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: pointer)
994   foo();
995 // OMP5-NEXT: foo();
996 
997 #pragma omp target defaultmap(none: pointer)
998 // OMP5-NEXT: #pragma omp target defaultmap(none: pointer)
999   foo();
1000 // OMP5-NEXT: foo();
1001 
1002 #pragma omp target defaultmap(default: pointer)
1003 // OMP5-NEXT: #pragma omp target defaultmap(default: pointer)
1004   foo();
1005 // OMP5-NEXT: foo();
1006 
1007 #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer)
1008 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer)
1009   foo();
1010 // OMP5-NEXT: foo();
1011 
1012 #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate)
1013 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate)
1014   foo();
1015 // OMP5-NEXT: foo();
1016 
1017 #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar)
1018 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar)
1019   foo();
1020 // OMP5-NEXT: foo();
1021 
1022 #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer)
1023 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer)
1024   foo();
1025 // OMP5-NEXT: foo();
1026 
1027 #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar)
1028 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar)
1029   foo();
1030 // OMP5-NEXT: foo();
1031 
1032   int *g;
1033 // OMP5-NEXT: int *g;
1034 
1035 #pragma omp target is_device_ptr(g) defaultmap(none: pointer)
1036 // OMP5-NEXT: #pragma omp target is_device_ptr(g) defaultmap(none: pointer)
1037   g++;
1038 // OMP5-NEXT: g++;
1039 
1040 #pragma omp target private(g) defaultmap(none: pointer)
1041 // OMP5-NEXT: #pragma omp target private(g) defaultmap(none: pointer)
1042   g++;
1043 // OMP5-NEXT: g++;
1044 
1045 #pragma omp target firstprivate(g) defaultmap(none: pointer)
1046 // OMP5-NEXT: #pragma omp target firstprivate(g) defaultmap(none: pointer)
1047   g++;
1048 // OMP5-NEXT: g++;
1049 
1050 #pragma omp target defaultmap(none: scalar) map(to: i)
1051 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) map(to: i)
1052   i++;
1053 // OMP5-NEXT: i++;
1054 
1055 #pragma omp target defaultmap(none: aggregate) map(to: a)
1056 // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate) map(to: a)
1057   a[3]++;
1058 // OMP5-NEXT: a[3]++;
1059 
1060 #pragma omp target defaultmap(none: scalar)
1061 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar)
1062   bar();
1063 // OMP5-NEXT: bar();
1064 #pragma omp target defaultmap(none)
1065   // OMP5-NEXT: #pragma omp target defaultmap(none)
1066   // OMP5-NEXT: bar();
1067   bar();
1068 #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)
1069   // 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)
1070   // OMP5-NEXT: bar();
1071   bar();
1072   return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]);
1073 }
1074 
1075 #endif //OMP5
1076 
1077 #ifdef OMP51
1078 
1079 ///==========================================================================///
1080 // RUN: %clang_cc1 -DOMP51 -verify -fopenmp -fopenmp-version=51 -ast-print %s | FileCheck %s --check-prefix OMP51
1081 // RUN: %clang_cc1 -DOMP51 -fopenmp -fopenmp-version=51 -x c++ -std=c++11 -emit-pch -o %t %s
1082 // RUN: %clang_cc1 -DOMP51 -fopenmp -fopenmp-version=51 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s --check-prefix OMP51
1083 
1084 // RUN: %clang_cc1 -DOMP51 -verify -fopenmp-simd -fopenmp-version=51 -ast-print %s | FileCheck %s --check-prefix OMP51
1085 // RUN: %clang_cc1 -DOMP51 -fopenmp-simd -fopenmp-version=51 -x c++ -std=c++11 -emit-pch -o %t %s
1086 // RUN: %clang_cc1 -DOMP51 -fopenmp-simd -fopenmp-version=51 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s --check-prefix OMP51
1087 
foo()1088 void foo() {}
1089 
1090 template <typename T, int C>
1091 T tmain(T argc, T *argv) {
1092   #pragma omp target defaultmap(present: scalar)
1093   foo();
1094   #pragma omp target defaultmap(present: aggregate)
1095   foo();
1096   #pragma omp target defaultmap(present: pointer)
1097   foo();
1098 
1099   return 0;
1100 }
1101 
1102 // OMP51: template <typename T, int C> T tmain(T argc, T *argv) {
1103 // OMP51-NEXT: #pragma omp target defaultmap(present: scalar)
1104 // OMP51-NEXT: foo()
1105 // OMP51-NEXT: #pragma omp target defaultmap(present: aggregate)
1106 // OMP51-NEXT: foo()
1107 // OMP51-NEXT: #pragma omp target defaultmap(present: pointer)
1108 // OMP51-NEXT: foo()
1109 
1110 // OMP51-LABEL: int main(int argc, char **argv) {
main(int argc,char ** argv)1111 int main (int argc, char **argv) {
1112 #pragma omp target defaultmap(present: scalar)
1113 // OMP51-NEXT: #pragma omp target defaultmap(present: scalar)
1114   foo();
1115 // OMP51-NEXT: foo();
1116 #pragma omp target defaultmap(present: aggregate)
1117 // OMP51-NEXT: #pragma omp target defaultmap(present: aggregate)
1118   foo();
1119 // OMP51-NEXT: foo();
1120 #pragma omp target defaultmap(present: pointer)
1121 // OMP51-NEXT: #pragma omp target defaultmap(present: pointer)
1122   foo();
1123 // OMP51-NEXT: foo();
1124 
1125   return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]);
1126 }
1127 #endif // OMP51
1128 
1129 #ifdef OMPX
1130 
1131 // RUN: %clang_cc1 -DOMPX -verify -fopenmp -fopenmp-extensions -ast-print %s | FileCheck %s --check-prefix=OMPX
1132 // RUN: %clang_cc1 -DOMPX -fopenmp -fopenmp-extensions -x c++ -std=c++11 -emit-pch -o %t %s
1133 // RUN: %clang_cc1 -DOMPX -fopenmp -fopenmp-extensions -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s --check-prefix=OMPX
1134 
1135 // RUN: %clang_cc1 -DOMPX -verify -fopenmp-simd -fopenmp-extensions -ast-print %s | FileCheck %s --check-prefix=OMPX
1136 // RUN: %clang_cc1 -DOMPX -fopenmp-simd -fopenmp-extensions -x c++ -std=c++11 -emit-pch -o %t %s
1137 // RUN: %clang_cc1 -DOMPX -fopenmp-simd -fopenmp-extensions -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s --check-prefix=OMPX
1138 
foo()1139 void foo() {}
1140 
1141 template <typename T, int C>
1142 T tmain(T argc, T *argv) {
1143   T i, ompx_hold;
1144 #pragma omp target map(ompx_hold,alloc: i)
1145   foo();
1146 #pragma omp target map(ompx_hold from: i)
1147   foo();
1148 #pragma omp target map(ompx_hold)
1149   {ompx_hold++;}
1150 #pragma omp target map(ompx_hold,i)
1151   {ompx_hold++;i++;}
1152   return 0;
1153 }
1154 
1155 //      OMPX: template <typename T, int C> T tmain(T argc, T *argv) {
1156 // OMPX-NEXT:   T i, ompx_hold;
1157 // OMPX-NEXT:   #pragma omp target map(ompx_hold,alloc: i)
1158 // OMPX-NEXT:   foo()
1159 // OMPX-NEXT:   #pragma omp target map(ompx_hold,from: i)
1160 // OMPX-NEXT:   foo()
1161 // OMPX-NEXT:   #pragma omp target map(tofrom: ompx_hold)
1162 // OMPX-NEXT:   {
1163 // OMPX-NEXT:     ompx_hold++;
1164 // OMPX-NEXT:   }
1165 // OMPX-NEXT:   #pragma omp target map(tofrom: ompx_hold,i)
1166 // OMPX-NEXT:   {
1167 // OMPX-NEXT:     ompx_hold++;
1168 // OMPX-NEXT:     i++;
1169 // OMPX-NEXT:   }
1170 
1171 // OMPX-LABEL: int main(int argc, char **argv) {
1172 //  OMPX-NEXT:   int i, ompx_hold;
1173 //  OMPX-NEXT:   #pragma omp target map(ompx_hold,alloc: i)
1174 //  OMPX-NEXT:   foo();
1175 //  OMPX-NEXT:   #pragma omp target map(ompx_hold,from: i)
1176 //  OMPX-NEXT:   foo();
1177 //  OMPX-NEXT:   #pragma omp target map(tofrom: ompx_hold)
1178 //  OMPX-NEXT:   {
1179 //  OMPX-NEXT:     ompx_hold++;
1180 //  OMPX-NEXT:   }
1181 //  OMPX-NEXT:   #pragma omp target map(tofrom: ompx_hold,i)
1182 //  OMPX-NEXT:   {
1183 //  OMPX-NEXT:     ompx_hold++;
1184 //  OMPX-NEXT:     i++;
1185 //  OMPX-NEXT:   }
main(int argc,char ** argv)1186 int main (int argc, char **argv) {
1187   int i, ompx_hold;
1188   #pragma omp target map(ompx_hold,alloc: i)
1189   foo();
1190   #pragma omp target map(ompx_hold from: i)
1191   foo();
1192   #pragma omp target map(ompx_hold)
1193   {ompx_hold++;}
1194   #pragma omp target map(ompx_hold,i)
1195   {ompx_hold++;i++;}
1196   return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]);
1197 }
1198 
1199 #endif
1200 #endif
1201