Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / clang / test / OpenMP / target_ast_print.cpp
blobd3daed053cc2ea5a6d9da22845f72a0fd4de93de
3 // expected-no-diagnostics
4 #ifndef HEADER
5 #define HEADER
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 -fsyntax-only -verify -Wno-vla %s -ast-print | FileCheck %s --check-prefix=OMP45
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 -fsyntax-only -verify -Wno-vla %s -ast-print | FileCheck %s --check-prefix=OMP45
14 #ifdef OMP45
16 void foo() {}
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;
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()
197 // OMP45-LABEL: class S {
198 class S {
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++;
228 // OMP45-NEXT: }
230 // OMP45-NEXT: };
232 // OMP45-LABEL: int 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();
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();
250 #pragma omp target map(i)
251 // OMP45-NEXT: #pragma omp target map(tofrom: i)
252 foo();
253 // OMP45-NEXT: foo();
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();
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();
265 #pragma omp target map(always,alloc: i)
266 // OMP45-NEXT: #pragma omp target map(always,alloc: i)
267 foo();
268 // OMP45-NEXT: foo();
270 #pragma omp target map(always from: i)
271 // OMP45-NEXT: #pragma omp target map(always,from: i)
272 foo();
273 // OMP45-NEXT: foo();
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: }
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: }
290 #pragma omp target map(close,alloc: i)
291 // OMP45-NEXT: #pragma omp target map(close,alloc: i)
292 foo();
293 // OMP45-NEXT: foo();
295 #pragma omp target map(close from: i)
296 // OMP45-NEXT: #pragma omp target map(close,from: i)
297 foo();
298 // OMP45-NEXT: foo();
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: }
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: }
315 #pragma omp target nowait
316 // OMP45-NEXT: #pragma omp target nowait
317 foo();
318 // OMP45-NEXT: foo();
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();
325 #pragma omp target defaultmap(tofrom: scalar)
326 // OMP45-NEXT: #pragma omp target defaultmap(tofrom: scalar)
327 foo();
328 // OMP45-NEXT: foo();
330 return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]);
333 #endif
335 #ifdef OMP5
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 -fsyntax-only -verify -Wno-vla %s -ast-print | FileCheck %s --check-prefix OMP5
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 -fsyntax-only -verify -Wno-vla %s -ast-print | FileCheck %s --check-prefix OMP5
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 -fsyntax-only -verify -Wno-vla %s -ast-print | FileCheck %s --check-prefixes=OMP5,REV
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 -fsyntax-only -verify -Wno-vla %s -ast-print | FileCheck %s --check-prefixes=OMP5,REV
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;
368 void foo() {}
370 #pragma omp declare target
371 void bar() {}
372 #pragma omp end declare target
374 int a;
375 #pragma omp declare target link(a)
377 template <typename T, int C>
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();
467 int *g;
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();
482 return 0;
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();
787 // OMP5-LABEL: class S {
788 class S {
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++;
818 // OMP5-NEXT: }
820 // OMP5-NEXT: };
822 // OMP5-LABEL: int 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();
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();
840 #pragma omp target map(i)
841 // OMP5-NEXT: #pragma omp target map(tofrom: i)
842 foo();
843 // OMP5-NEXT: foo();
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();
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();
855 #pragma omp target map(always,alloc: i)
856 // OMP5-NEXT: #pragma omp target map(always,alloc: i)
857 foo();
858 // OMP5-NEXT: foo();
860 #pragma omp target map(always, from: i)
861 // OMP5-NEXT: #pragma omp target map(always,from: i)
862 foo();
863 // OMP5-NEXT: foo();
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: }
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: }
880 #pragma omp target map(close,alloc: i)
881 // OMP5-NEXT: #pragma omp target map(close,alloc: i)
882 foo();
883 // OMP5-NEXT: foo();
885 #pragma omp target map(close, from: i)
886 // OMP5-NEXT: #pragma omp target map(close,from: i)
887 foo();
888 // OMP5-NEXT: foo();
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: }
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: }
905 #pragma omp target nowait
906 // OMP5-NEXT: #pragma omp target nowait
907 foo();
908 // OMP5-NEXT: foo();
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();
915 #pragma omp target defaultmap(alloc: scalar)
916 // OMP5-NEXT: #pragma omp target defaultmap(alloc: scalar)
917 foo();
918 // OMP5-NEXT: foo();
920 #pragma omp target defaultmap(to: scalar)
921 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar)
922 foo();
923 // OMP5-NEXT: foo();
925 #pragma omp target defaultmap(from: scalar)
926 // OMP5-NEXT: #pragma omp target defaultmap(from: scalar)
927 foo();
928 // OMP5-NEXT: foo();
930 #pragma omp target defaultmap(tofrom: scalar)
931 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: scalar)
932 foo();
933 // OMP5-NEXT: foo();
935 #pragma omp target defaultmap(firstprivate: scalar)
936 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: scalar)
937 foo();
938 // OMP5-NEXT: foo();
940 #pragma omp target defaultmap(none: scalar)
941 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar)
942 foo();
943 // OMP5-NEXT: foo();
945 #pragma omp target defaultmap(default: scalar)
946 // OMP5-NEXT: #pragma omp target defaultmap(default: scalar)
947 foo();
948 // OMP5-NEXT: foo();
950 #pragma omp target defaultmap(alloc: aggregate)
951 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate)
952 foo();
953 // OMP5-NEXT: foo();
955 #pragma omp target defaultmap(to: aggregate)
956 // OMP5-NEXT: #pragma omp target defaultmap(to: aggregate)
957 foo();
958 // OMP5-NEXT: foo();
960 #pragma omp target defaultmap(from: aggregate)
961 // OMP5-NEXT: #pragma omp target defaultmap(from: aggregate)
962 foo();
963 // OMP5-NEXT: foo();
965 #pragma omp target defaultmap(tofrom: aggregate)
966 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate)
967 foo();
968 // OMP5-NEXT: foo();
970 #pragma omp target defaultmap(firstprivate: aggregate)
971 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: aggregate)
972 foo();
973 // OMP5-NEXT: foo();
975 #pragma omp target defaultmap(none: aggregate)
976 // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate)
977 foo();
978 // OMP5-NEXT: foo();
980 #pragma omp target defaultmap(default: aggregate)
981 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate)
982 foo();
983 // OMP5-NEXT: foo();
985 #pragma omp target defaultmap(alloc: pointer)
986 // OMP5-NEXT: #pragma omp target defaultmap(alloc: pointer)
987 foo();
988 // OMP5-NEXT: foo();
990 #pragma omp target defaultmap(to: pointer)
991 // OMP5-NEXT: #pragma omp target defaultmap(to: pointer)
992 foo();
993 // OMP5-NEXT: foo();
995 #pragma omp target defaultmap(from: pointer)
996 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer)
997 foo();
998 // OMP5-NEXT: foo();
1000 #pragma omp target defaultmap(tofrom: pointer)
1001 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: pointer)
1002 foo();
1003 // OMP5-NEXT: foo();
1005 #pragma omp target defaultmap(firstprivate: pointer)
1006 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: pointer)
1007 foo();
1008 // OMP5-NEXT: foo();
1010 #pragma omp target defaultmap(none: pointer)
1011 // OMP5-NEXT: #pragma omp target defaultmap(none: pointer)
1012 foo();
1013 // OMP5-NEXT: foo();
1015 #pragma omp target defaultmap(default: pointer)
1016 // OMP5-NEXT: #pragma omp target defaultmap(default: pointer)
1017 foo();
1018 // OMP5-NEXT: foo();
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();
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();
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();
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();
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();
1045 int *g;
1046 // OMP5-NEXT: int *g;
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++;
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++;
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++;
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++;
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]++;
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]);
1088 #endif //OMP5
1090 #ifdef OMP51
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 -fsyntax-only -verify -Wno-vla %s -ast-print | FileCheck %s --check-prefix OMP51
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 -fsyntax-only -verify -Wno-vla %s -ast-print | FileCheck %s --check-prefix OMP51
1101 void foo() {}
1103 template <typename T, int C>
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();
1114 return 0;
1117 // OMP51: template <typename T, int C> T tmain(T argc, T *argv) {
1118 // OMP51-NEXT: #pragma omp target defaultmap(present: scalar)
1119 // OMP51-NEXT: foo()
1120 // OMP51-NEXT: #pragma omp target defaultmap(present: aggregate)
1121 // OMP51-NEXT: foo()
1122 // OMP51-NEXT: #pragma omp target defaultmap(present: pointer)
1123 // OMP51-NEXT: foo()
1124 // OMP51-NEXT: #pragma omp target thread_limit(C)
1125 // OMP51-NEXT: foo()
1127 // OMP51-LABEL: int main(int argc, char **argv) {
1128 int main (int argc, char **argv) {
1129 #pragma omp target defaultmap(present: scalar)
1130 // OMP51-NEXT: #pragma omp target defaultmap(present: scalar)
1131 foo();
1132 // OMP51-NEXT: foo();
1133 #pragma omp target defaultmap(present: aggregate)
1134 // OMP51-NEXT: #pragma omp target defaultmap(present: aggregate)
1135 foo();
1136 // OMP51-NEXT: foo();
1137 #pragma omp target defaultmap(present: pointer)
1138 // OMP51-NEXT: #pragma omp target defaultmap(present: pointer)
1139 foo();
1140 // OMP51-NEXT: foo();
1142 return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]);
1144 #endif // OMP51
1146 #ifdef OMP52
1148 ///==========================================================================///
1149 // RUN: %clang_cc1 -DOMP52 -verify -Wno-vla -fopenmp -fopenmp-version=52 -ast-print %s | FileCheck %s --check-prefix OMP52
1150 // RUN: %clang_cc1 -DOMP52 -fopenmp -fopenmp-version=52 -x c++ -std=c++11 -emit-pch -o %t %s
1151 // RUN: %clang_cc1 -DOMP52 -fopenmp -fopenmp-version=52 -std=c++11 -include-pch %t -fsyntax-only -verify -Wno-vla %s -ast-print | FileCheck %s --check-prefix OMP52
1153 // RUN: %clang_cc1 -DOMP52 -verify -Wno-vla -fopenmp-simd -fopenmp-version=52 -ast-print %s | FileCheck %s --check-prefix OMP52
1154 // RUN: %clang_cc1 -DOMP52 -fopenmp-simd -fopenmp-version=52 -x c++ -std=c++11 -emit-pch -o %t %s
1155 // RUN: %clang_cc1 -DOMP52 -fopenmp-simd -fopenmp-version=52 -std=c++11 -include-pch %t -fsyntax-only -verify -Wno-vla %s -ast-print | FileCheck %s --check-prefix OMP52
1157 void foo() {}
1159 template <typename T, int C>
1160 T tmain(T argc, T *argv) {
1161 int N = 100;
1162 int v[N];
1163 #pragma omp target map(iterator(it = 0:N:2), to: v[it])
1164 foo();
1165 #pragma omp target map(iterator(it = 0:N:4), from: v[it])
1166 foo();
1168 return 0;
1171 // OMP52: template <typename T, int C> T tmain(T argc, T *argv) {
1172 // OMP52-NEXT: int N = 100;
1173 // OMP52-NEXT: int v[N];
1174 // OMP52-NEXT: #pragma omp target map(iterator(int it = 0:N:2),to: v[it])
1175 // OMP52-NEXT: foo()
1176 // OMP52-NEXT: #pragma omp target map(iterator(int it = 0:N:4),from: v[it])
1177 // OMP52-NEXT: foo()
1179 // OMP52-LABEL: int main(int argc, char **argv) {
1180 int main (int argc, char **argv) {
1181 int i, j, a[20], always, close;
1182 // OMP52-NEXT: int i, j, a[20]
1183 #pragma omp target
1184 // OMP52-NEXT: #pragma omp target
1185 foo();
1186 // OMP52-NEXT: foo();
1187 #pragma omp target map(iterator(it = 0:20:2), to: a[it])
1188 // OMP52-NEXT: #pragma omp target map(iterator(int it = 0:20:2),to: a[it])
1189 foo();
1190 // OMP52-NEXT: foo();
1191 #pragma omp target map(iterator(it = 0:20:4), from: a[it])
1192 // OMP52-NEXT: #pragma omp target map(iterator(int it = 0:20:4),from: a[it])
1193 foo();
1194 // OMP52-NEXT: foo();
1196 return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]);
1198 #endif // OMP52
1200 #ifdef OMPX
1202 // RUN: %clang_cc1 -DOMPX -verify -Wno-vla -fopenmp -fopenmp-extensions -ast-print %s | FileCheck %s --check-prefix=OMPX
1203 // RUN: %clang_cc1 -DOMPX -fopenmp -fopenmp-extensions -x c++ -std=c++11 -emit-pch -o %t %s
1204 // RUN: %clang_cc1 -DOMPX -fopenmp -fopenmp-extensions -std=c++11 -include-pch %t -fsyntax-only -verify -Wno-vla %s -ast-print | FileCheck %s --check-prefix=OMPX
1206 // RUN: %clang_cc1 -DOMPX -verify -Wno-vla -fopenmp-simd -fopenmp-extensions -ast-print %s | FileCheck %s --check-prefix=OMPX
1207 // RUN: %clang_cc1 -DOMPX -fopenmp-simd -fopenmp-extensions -x c++ -std=c++11 -emit-pch -o %t %s
1208 // RUN: %clang_cc1 -DOMPX -fopenmp-simd -fopenmp-extensions -std=c++11 -include-pch %t -fsyntax-only -verify -Wno-vla %s -ast-print | FileCheck %s --check-prefix=OMPX
1210 void foo() {}
1212 template <typename T, int C>
1213 T tmain(T argc, T *argv) {
1214 T i, ompx_hold;
1215 #pragma omp target map(ompx_hold,alloc: i)
1216 foo();
1217 #pragma omp target map(ompx_hold from: i)
1218 foo();
1219 #pragma omp target map(ompx_hold)
1220 {ompx_hold++;}
1221 #pragma omp target map(ompx_hold,i)
1222 {ompx_hold++;i++;}
1223 return 0;
1226 // OMPX: template <typename T, int C> T tmain(T argc, T *argv) {
1227 // OMPX-NEXT: T i, ompx_hold;
1228 // OMPX-NEXT: #pragma omp target map(ompx_hold,alloc: i)
1229 // OMPX-NEXT: foo()
1230 // OMPX-NEXT: #pragma omp target map(ompx_hold,from: i)
1231 // OMPX-NEXT: foo()
1232 // OMPX-NEXT: #pragma omp target map(tofrom: ompx_hold)
1233 // OMPX-NEXT: {
1234 // OMPX-NEXT: ompx_hold++;
1235 // OMPX-NEXT: }
1236 // OMPX-NEXT: #pragma omp target map(tofrom: ompx_hold,i)
1237 // OMPX-NEXT: {
1238 // OMPX-NEXT: ompx_hold++;
1239 // OMPX-NEXT: i++;
1240 // OMPX-NEXT: }
1242 // OMPX-LABEL: int main(int argc, char **argv) {
1243 // OMPX-NEXT: int i, ompx_hold;
1244 // OMPX-NEXT: #pragma omp target map(ompx_hold,alloc: i)
1245 // OMPX-NEXT: foo();
1246 // OMPX-NEXT: #pragma omp target map(ompx_hold,from: i)
1247 // OMPX-NEXT: foo();
1248 // OMPX-NEXT: #pragma omp target map(tofrom: ompx_hold)
1249 // OMPX-NEXT: {
1250 // OMPX-NEXT: ompx_hold++;
1251 // OMPX-NEXT: }
1252 // OMPX-NEXT: #pragma omp target map(tofrom: ompx_hold,i)
1253 // OMPX-NEXT: {
1254 // OMPX-NEXT: ompx_hold++;
1255 // OMPX-NEXT: i++;
1256 // OMPX-NEXT: }
1257 int main (int argc, char **argv) {
1258 int i, ompx_hold;
1259 #pragma omp target map(ompx_hold,alloc: i)
1260 foo();
1261 #pragma omp target map(ompx_hold from: i)
1262 foo();
1263 #pragma omp target map(ompx_hold)
1264 {ompx_hold++;}
1265 #pragma omp target map(ompx_hold,i)
1266 {ompx_hold++;i++;}
1267 return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]);
1270 #endif
1271 #endif