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 | |
13 | void foo() {} |
14 | |
15 | template <typename T, int C> |
16 | T 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 { |
195 | class 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) { |
230 | int 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 | |