Clang Project

clang_source_code/test/OpenMP/target_ast_print.cpp
1// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -ast-print %s | FileCheck %s
2// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s
3// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
4
5// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -ast-print %s | FileCheck %s
6// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s
7// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
8// expected-no-diagnostics
9
10#ifndef HEADER
11#define HEADER
12
13void foo() {}
14
15template <typename T, int C>
16T tmain(T argc, T *argv) {
17  T i, j, a[20], always, close;
18#pragma omp target
19  foo();
20#pragma omp target if (target:argc > 0)
21  foo();
22#pragma omp target if (C)
23  foo();
24#pragma omp target map(i)
25  foo();
26#pragma omp target map(a[0:10], i)
27  foo();
28#pragma omp target map(to: i) map(from: j)
29  foo();
30#pragma omp target map(always,alloc: i)
31  foo();
32#pragma omp target map(always from: i)
33  foo();
34#pragma omp target map(always)
35  {always++;}
36#pragma omp target map(always,i)
37  {always++;i++;}
38#pragma omp target map(close,alloc: i)
39  foo();
40#pragma omp target map(close from: i)
41  foo();
42#pragma omp target map(close)
43  {close++;}
44#pragma omp target map(close,i)
45  {close++;i++;}
46#pragma omp target nowait
47  foo();
48#pragma omp target depend(in : argc, argv[i:argc], a[:])
49  foo();
50#pragma omp target defaultmap(tofrom: scalar)
51  foo();
52  return 0;
53}
54
55// CHECK: template <typename T, int C> T tmain(T argc, T *argv) {
56// CHECK-NEXT: T i, j, a[20]
57// CHECK-NEXT: #pragma omp target{{$}}
58// CHECK-NEXT: foo();
59// CHECK-NEXT: #pragma omp target if(target: argc > 0)
60// CHECK-NEXT: foo()
61// CHECK-NEXT: #pragma omp target if(C)
62// CHECK-NEXT: foo()
63// CHECK-NEXT: #pragma omp target map(tofrom: i)
64// CHECK-NEXT: foo()
65// CHECK-NEXT: #pragma omp target map(tofrom: a[0:10],i)
66// CHECK-NEXT: foo()
67// CHECK-NEXT: #pragma omp target map(to: i) map(from: j)
68// CHECK-NEXT: foo()
69// CHECK-NEXT: #pragma omp target map(always,alloc: i)
70// CHECK-NEXT: foo()
71// CHECK-NEXT: #pragma omp target map(always,from: i)
72// CHECK-NEXT: foo()
73// CHECK-NEXT: #pragma omp target map(tofrom: always)
74// CHECK-NEXT: {
75// CHECK-NEXT: always++;
76// CHECK-NEXT: }
77// CHECK-NEXT: #pragma omp target map(tofrom: always,i)
78// CHECK-NEXT: {
79// CHECK-NEXT: always++;
80// CHECK-NEXT: i++;
81// CHECK-NEXT: }
82// CHECK-NEXT: #pragma omp target map(close,alloc: i)
83// CHECK-NEXT: foo()
84// CHECK-NEXT: #pragma omp target map(close,from: i)
85// CHECK-NEXT: foo()
86// CHECK-NEXT: #pragma omp target map(tofrom: close)
87// CHECK-NEXT: {
88// CHECK-NEXT: close++;
89// CHECK-NEXT: }
90// CHECK-NEXT: #pragma omp target map(tofrom: close,i)
91// CHECK-NEXT: {
92// CHECK-NEXT: close++;
93// CHECK-NEXT: i++;
94// CHECK-NEXT: }
95// CHECK-NEXT: #pragma omp target nowait
96// CHECK-NEXT: foo()
97// CHECK-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:])
98// CHECK-NEXT: foo()
99// CHECK-NEXT: #pragma omp target defaultmap(tofrom: scalar)
100// CHECK-NEXT: foo()
101// CHECK: template<> int tmain<int, 5>(int argc, int *argv) {
102// CHECK-NEXT: int i, j, a[20]
103// CHECK-NEXT: #pragma omp target
104// CHECK-NEXT: foo();
105// CHECK-NEXT: #pragma omp target if(target: argc > 0)
106// CHECK-NEXT: foo()
107// CHECK-NEXT: #pragma omp target if(5)
108// CHECK-NEXT: foo()
109// CHECK-NEXT: #pragma omp target map(tofrom: i)
110// CHECK-NEXT: foo()
111// CHECK-NEXT: #pragma omp target map(tofrom: a[0:10],i)
112// CHECK-NEXT: foo()
113// CHECK-NEXT: #pragma omp target map(to: i) map(from: j)
114// CHECK-NEXT: foo()
115// CHECK-NEXT: #pragma omp target map(always,alloc: i)
116// CHECK-NEXT: foo()
117// CHECK-NEXT: #pragma omp target map(always,from: i)
118// CHECK-NEXT: foo()
119// CHECK-NEXT: #pragma omp target map(tofrom: always)
120// CHECK-NEXT: {
121// CHECK-NEXT: always++;
122// CHECK-NEXT: }
123// CHECK-NEXT: #pragma omp target map(tofrom: always,i)
124// CHECK-NEXT: {
125// CHECK-NEXT: always++;
126// CHECK-NEXT: i++;
127// CHECK-NEXT: }
128// CHECK-NEXT: #pragma omp target map(close,alloc: i)
129// CHECK-NEXT: foo()
130// CHECK-NEXT: #pragma omp target map(close,from: i)
131// CHECK-NEXT: foo()
132// CHECK-NEXT: #pragma omp target map(tofrom: close)
133// CHECK-NEXT: {
134// CHECK-NEXT: close++;
135// CHECK-NEXT: }
136// CHECK-NEXT: #pragma omp target map(tofrom: close,i)
137// CHECK-NEXT: {
138// CHECK-NEXT: close++;
139// CHECK-NEXT: i++;
140// CHECK-NEXT: }
141// CHECK-NEXT: #pragma omp target nowait
142// CHECK-NEXT: foo()
143// CHECK-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:])
144// CHECK-NEXT: foo()
145// CHECK-NEXT: #pragma omp target defaultmap(tofrom: scalar)
146// CHECK-NEXT: foo()
147// CHECK: template<> char tmain<char, 1>(char argc, char *argv) {
148// CHECK-NEXT: char i, j, a[20]
149// CHECK-NEXT: #pragma omp target
150// CHECK-NEXT: foo();
151// CHECK-NEXT: #pragma omp target if(target: argc > 0)
152// CHECK-NEXT: foo()
153// CHECK-NEXT: #pragma omp target if(1)
154// CHECK-NEXT: foo()
155// CHECK-NEXT: #pragma omp target map(tofrom: i)
156// CHECK-NEXT: foo()
157// CHECK-NEXT: #pragma omp target map(tofrom: a[0:10],i)
158// CHECK-NEXT: foo()
159// CHECK-NEXT: #pragma omp target map(to: i) map(from: j)
160// CHECK-NEXT: foo()
161// CHECK-NEXT: #pragma omp target map(always,alloc: i)
162// CHECK-NEXT: foo()
163// CHECK-NEXT: #pragma omp target map(always,from: i)
164// CHECK-NEXT: foo()
165// CHECK-NEXT: #pragma omp target map(tofrom: always)
166// CHECK-NEXT: {
167// CHECK-NEXT: always++;
168// CHECK-NEXT: }
169// CHECK-NEXT: #pragma omp target map(tofrom: always,i)
170// CHECK-NEXT: {
171// CHECK-NEXT: always++;
172// CHECK-NEXT: i++;
173// CHECK-NEXT: }
174// CHECK-NEXT: #pragma omp target map(close,alloc: i)
175// CHECK-NEXT: foo()
176// CHECK-NEXT: #pragma omp target map(close,from: i)
177// CHECK-NEXT: foo()
178// CHECK-NEXT: #pragma omp target map(tofrom: close)
179// CHECK-NEXT: {
180// CHECK-NEXT: close++;
181// CHECK-NEXT: }
182// CHECK-NEXT: #pragma omp target map(tofrom: close,i)
183// CHECK-NEXT: {
184// CHECK-NEXT: close++;
185// CHECK-NEXT: i++;
186// CHECK-NEXT: }
187// CHECK-NEXT: #pragma omp target nowait
188// CHECK-NEXT: foo()
189// CHECK-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:])
190// CHECK-NEXT: foo()
191// CHECK-NEXT: #pragma omp target defaultmap(tofrom: scalar)
192// CHECK-NEXT: foo()
193
194// CHECK-LABEL: class S {
195class S {
196  void foo() {
197// CHECK-NEXT: void foo() {
198    int a = 0;
199// CHECK-NEXT: int a = 0;
200    #pragma omp target map(this[0])
201// CHECK-NEXT: #pragma omp target map(tofrom: this[0])
202      a++;
203// CHECK-NEXT: a++;
204    #pragma omp target map(this[:1])
205// CHECK-NEXT: #pragma omp target map(tofrom: this[:1])
206      a++;
207// CHECK-NEXT: a++;
208    #pragma omp target map((this)[0])
209// CHECK-NEXT: #pragma omp target map(tofrom: (this)[0])
210      a++;
211// CHECK-NEXT: a++;
212    #pragma omp target map(this[:a])
213// CHECK-NEXT: #pragma omp target map(tofrom: this[:a])
214      a++;
215// CHECK-NEXT: a++;
216    #pragma omp target map(this[a:1])
217// CHECK-NEXT: #pragma omp target map(tofrom: this[a:1])
218      a++;
219// CHECK-NEXT: a++;
220    #pragma omp target map(this[a])
221// CHECK-NEXT: #pragma omp target map(tofrom: this[a])
222      a++;
223// CHECK-NEXT: a++;
224  }
225// CHECK-NEXT: }
226};
227// CHECK-NEXT: };
228
229// CHECK-LABEL: int main(int argc, char **argv) {
230int main (int argc, char **argv) {
231  int i, j, a[20], always, close;
232// CHECK-NEXT: int i, j, a[20]
233#pragma omp target
234// CHECK-NEXT: #pragma omp target
235  foo();
236// CHECK-NEXT: foo();
237#pragma omp target if (argc > 0)
238// CHECK-NEXT: #pragma omp target if(argc > 0)
239  foo();
240// CHECK-NEXT: foo();
241
242#pragma omp target map(i) if(argc>0)
243// CHECK-NEXT: #pragma omp target map(tofrom: i) if(argc > 0)
244  foo();
245// CHECK-NEXT: foo();
246
247#pragma omp target map(i)
248// CHECK-NEXT: #pragma omp target map(tofrom: i)
249  foo();
250// CHECK-NEXT: foo();
251
252#pragma omp target map(a[0:10], i)
253// CHECK-NEXT: #pragma omp target map(tofrom: a[0:10],i)
254  foo();
255// CHECK-NEXT: foo();
256
257#pragma omp target map(to: i) map(from: j)
258// CHECK-NEXT: #pragma omp target map(to: i) map(from: j)
259  foo();
260// CHECK-NEXT: foo();
261
262#pragma omp target map(always,alloc: i)
263// CHECK-NEXT: #pragma omp target map(always,alloc: i)
264  foo();
265// CHECK-NEXT: foo();
266
267#pragma omp target map(always from: i)
268// CHECK-NEXT: #pragma omp target map(always,from: i)
269  foo();
270// CHECK-NEXT: foo();
271
272#pragma omp target map(always)
273// CHECK-NEXT: #pragma omp target map(tofrom: always)
274  {always++;}
275// CHECK-NEXT: {
276// CHECK-NEXT: always++;
277// CHECK-NEXT: }
278
279#pragma omp target map(always,i)
280// CHECK-NEXT: #pragma omp target map(tofrom: always,i)
281  {always++;i++;}
282// CHECK-NEXT: {
283// CHECK-NEXT: always++;
284// CHECK-NEXT: i++;
285// CHECK-NEXT: }
286
287#pragma omp target map(close,alloc: i)
288// CHECK-NEXT: #pragma omp target map(close,alloc: i)
289  foo();
290// CHECK-NEXT: foo();
291
292#pragma omp target map(close from: i)
293// CHECK-NEXT: #pragma omp target map(close,from: i)
294  foo();
295// CHECK-NEXT: foo();
296
297#pragma omp target map(close)
298// CHECK-NEXT: #pragma omp target map(tofrom: close)
299  {close++;}
300// CHECK-NEXT: {
301// CHECK-NEXT: close++;
302// CHECK-NEXT: }
303
304#pragma omp target map(close,i)
305// CHECK-NEXT: #pragma omp target map(tofrom: close,i)
306  {close++;i++;}
307// CHECK-NEXT: {
308// CHECK-NEXT: close++;
309// CHECK-NEXT: i++;
310// CHECK-NEXT: }
311
312#pragma omp target nowait
313// CHECK-NEXT: #pragma omp target nowait
314  foo();
315// CHECK-NEXT: foo();
316
317#pragma omp target depend(in : argc, argv[i:argc], a[:])
318// CHECK-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:])
319  foo();
320// CHECK-NEXT: foo();
321
322#pragma omp target defaultmap(tofrom: scalar)
323// CHECK-NEXT: #pragma omp target defaultmap(tofrom: scalar)
324  foo();
325// CHECK-NEXT: foo();
326
327  return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]);
328}
329
330#endif
331