1 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -ast-print %s | FileCheck %s
2 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s
3 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
4 
5 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 -ast-print %s | FileCheck %s
6 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s
7 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -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 template <class T>
14 T foo(T argc) {
15   T b = T();
16   T a = T();
17 #pragma omp atomic
18   a++;
19 #pragma omp atomic read
20   a = argc;
21 #pragma omp atomic write
22   a = argc + argc;
23 #pragma omp atomic update
24   a = a + argc;
25 #pragma omp atomic capture
26   a = b++;
27 #pragma omp atomic capture
28   {
29     a = b;
30     b++;
31   }
32 #pragma omp atomic seq_cst
33   a++;
34 #pragma omp atomic read seq_cst
35   a = argc;
36 #pragma omp atomic seq_cst write
37   a = argc + argc;
38 #pragma omp atomic update seq_cst
39   a = a + argc;
40 #pragma omp atomic seq_cst capture
41   a = b++;
42 #pragma omp atomic capture seq_cst
43   {
44     a = b;
45     b++;
46   }
47 #pragma omp atomic
48   a++;
49 #pragma omp atomic read
50   a = argc;
51 #pragma omp atomic write
52   a = argc + argc;
53 #pragma omp atomic update
54   a = a + argc;
55 #pragma omp atomic acq_rel capture
56   a = b++;
57 #pragma omp atomic capture acq_rel
58   {
59     a = b;
60     b++;
61   }
62 #pragma omp atomic
63   a++;
64 #pragma omp atomic read acquire
65   a = argc;
66 #pragma omp atomic write
67   a = argc + argc;
68 #pragma omp atomic update
69   a = a + argc;
70 #pragma omp atomic acquire capture
71   a = b++;
72 #pragma omp atomic capture acquire
73   {
74     a = b;
75     b++;
76   }
77 #pragma omp atomic release
78   a++;
79 #pragma omp atomic read
80   a = argc;
81 #pragma omp atomic release write
82   a = argc + argc;
83 #pragma omp atomic update release
84   a = a + argc;
85 #pragma omp atomic release capture
86   a = b++;
87 #pragma omp atomic capture release
88   {
89     a = b;
90     b++;
91   }
92 #pragma omp atomic relaxed
93   a++;
94 #pragma omp atomic read
95   a = argc;
96 #pragma omp atomic relaxed write
97   a = argc + argc;
98 #pragma omp atomic update relaxed
99   a = a + argc;
100 #pragma omp atomic relaxed capture
101   a = b++;
102 #pragma omp atomic capture relaxed
103   {
104     a = b;
105     b++;
106   }
107   return T();
108 }
109 
110 // CHECK: T a = T();
111 // CHECK-NEXT: #pragma omp atomic{{$}}
112 // CHECK-NEXT: a++;
113 // CHECK-NEXT: #pragma omp atomic read
114 // CHECK-NEXT: a = argc;
115 // CHECK-NEXT: #pragma omp atomic write
116 // CHECK-NEXT: a = argc + argc;
117 // CHECK-NEXT: #pragma omp atomic update
118 // CHECK-NEXT: a = a + argc;
119 // CHECK-NEXT: #pragma omp atomic capture
120 // CHECK-NEXT: a = b++;
121 // CHECK-NEXT: #pragma omp atomic capture
122 // CHECK-NEXT: {
123 // CHECK-NEXT: a = b;
124 // CHECK-NEXT: b++;
125 // CHECK-NEXT: }
126 // CHECK-NEXT: #pragma omp atomic seq_cst
127 // CHECK-NEXT: a++;
128 // CHECK-NEXT: #pragma omp atomic read seq_cst
129 // CHECK-NEXT: a = argc;
130 // CHECK-NEXT: #pragma omp atomic seq_cst write
131 // CHECK-NEXT: a = argc + argc;
132 // CHECK-NEXT: #pragma omp atomic update seq_cst
133 // CHECK-NEXT: a = a + argc;
134 // CHECK-NEXT: #pragma omp atomic seq_cst capture
135 // CHECK-NEXT: a = b++;
136 // CHECK-NEXT: #pragma omp atomic capture seq_cst
137 // CHECK-NEXT: {
138 // CHECK-NEXT: a = b;
139 // CHECK-NEXT: b++;
140 // CHECK-NEXT: }
141 // CHECK-NEXT: #pragma omp atomic
142 // CHECK-NEXT: a++;
143 // CHECK-NEXT: #pragma omp atomic read
144 // CHECK-NEXT: a = argc;
145 // CHECK-NEXT: #pragma omp atomic write
146 // CHECK-NEXT: a = argc + argc;
147 // CHECK-NEXT: #pragma omp atomic update
148 // CHECK-NEXT: a = a + argc;
149 // CHECK-NEXT: #pragma omp atomic acq_rel capture
150 // CHECK-NEXT: a = b++;
151 // CHECK-NEXT: #pragma omp atomic capture acq_rel
152 // CHECK-NEXT: {
153 // CHECK-NEXT: a = b;
154 // CHECK-NEXT: b++;
155 // CHECK-NEXT: }
156 // CHECK-NEXT: #pragma omp atomic
157 // CHECK-NEXT: a++;
158 // CHECK-NEXT: #pragma omp atomic read acquire
159 // CHECK-NEXT: a = argc;
160 // CHECK-NEXT: #pragma omp atomic write
161 // CHECK-NEXT: a = argc + argc;
162 // CHECK-NEXT: #pragma omp atomic update
163 // CHECK-NEXT: a = a + argc;
164 // CHECK-NEXT: #pragma omp atomic acquire capture
165 // CHECK-NEXT: a = b++;
166 // CHECK-NEXT: #pragma omp atomic capture acquire
167 // CHECK-NEXT: {
168 // CHECK-NEXT: a = b;
169 // CHECK-NEXT: b++;
170 // CHECK-NEXT: }
171 // CHECK-NEXT: #pragma omp atomic release
172 // CHECK-NEXT: a++;
173 // CHECK-NEXT: #pragma omp atomic read
174 // CHECK-NEXT: a = argc;
175 // CHECK-NEXT: #pragma omp atomic release write
176 // CHECK-NEXT: a = argc + argc;
177 // CHECK-NEXT: #pragma omp atomic update release
178 // CHECK-NEXT: a = a + argc;
179 // CHECK-NEXT: #pragma omp atomic release capture
180 // CHECK-NEXT: a = b++;
181 // CHECK-NEXT: #pragma omp atomic capture release
182 // CHECK-NEXT: {
183 // CHECK-NEXT: a = b;
184 // CHECK-NEXT: b++;
185 // CHECK-NEXT: }
186 // CHECK-NEXT: #pragma omp atomic relaxed
187 // CHECK-NEXT: a++;
188 // CHECK-NEXT: #pragma omp atomic read
189 // CHECK-NEXT: a = argc;
190 // CHECK-NEXT: #pragma omp atomic relaxed write
191 // CHECK-NEXT: a = argc + argc;
192 // CHECK-NEXT: #pragma omp atomic update relaxed
193 // CHECK-NEXT: a = a + argc;
194 // CHECK-NEXT: #pragma omp atomic relaxed capture
195 // CHECK-NEXT: a = b++;
196 // CHECK-NEXT: #pragma omp atomic capture relaxed
197 // CHECK-NEXT: {
198 // CHECK-NEXT: a = b;
199 // CHECK-NEXT: b++;
200 // CHECK-NEXT: }
201 // CHECK: int a = int();
202 // CHECK-NEXT: #pragma omp atomic
203 // CHECK-NEXT: a++;
204 // CHECK-NEXT: #pragma omp atomic read
205 // CHECK-NEXT: a = argc;
206 // CHECK-NEXT: #pragma omp atomic write
207 // CHECK-NEXT: a = argc + argc;
208 // CHECK-NEXT: #pragma omp atomic update
209 // CHECK-NEXT: a = a + argc;
210 // CHECK-NEXT: #pragma omp atomic capture
211 // CHECK-NEXT: a = b++;
212 // CHECK-NEXT: #pragma omp atomic capture
213 // CHECK-NEXT: {
214 // CHECK-NEXT: a = b;
215 // CHECK-NEXT: b++;
216 // CHECK-NEXT: }
217 // CHECK-NEXT: #pragma omp atomic seq_cst
218 // CHECK-NEXT: a++;
219 // CHECK-NEXT: #pragma omp atomic read seq_cst
220 // CHECK-NEXT: a = argc;
221 // CHECK-NEXT: #pragma omp atomic seq_cst write
222 // CHECK-NEXT: a = argc + argc;
223 // CHECK-NEXT: #pragma omp atomic update seq_cst
224 // CHECK-NEXT: a = a + argc;
225 // CHECK-NEXT: #pragma omp atomic seq_cst capture
226 // CHECK-NEXT: a = b++;
227 // CHECK-NEXT: #pragma omp atomic capture seq_cst
228 // CHECK-NEXT: {
229 // CHECK-NEXT: a = b;
230 // CHECK-NEXT: b++;
231 // CHECK-NEXT: }
232 // CHECK-NEXT: #pragma omp atomic
233 // CHECK-NEXT: a++;
234 // CHECK-NEXT: #pragma omp atomic read
235 // CHECK-NEXT: a = argc;
236 // CHECK-NEXT: #pragma omp atomic write
237 // CHECK-NEXT: a = argc + argc;
238 // CHECK-NEXT: #pragma omp atomic update
239 // CHECK-NEXT: a = a + argc;
240 // CHECK-NEXT: #pragma omp atomic acq_rel capture
241 // CHECK-NEXT: a = b++;
242 // CHECK-NEXT: #pragma omp atomic capture acq_rel
243 // CHECK-NEXT: {
244 // CHECK-NEXT: a = b;
245 // CHECK-NEXT: b++;
246 // CHECK-NEXT: }
247 // CHECK-NEXT: #pragma omp atomic
248 // CHECK-NEXT: a++;
249 // CHECK-NEXT: #pragma omp atomic read acquire
250 // CHECK-NEXT: a = argc;
251 // CHECK-NEXT: #pragma omp atomic write
252 // CHECK-NEXT: a = argc + argc;
253 // CHECK-NEXT: #pragma omp atomic update
254 // CHECK-NEXT: a = a + argc;
255 // CHECK-NEXT: #pragma omp atomic acquire capture
256 // CHECK-NEXT: a = b++;
257 // CHECK-NEXT: #pragma omp atomic capture acquire
258 // CHECK-NEXT: {
259 // CHECK-NEXT: a = b;
260 // CHECK-NEXT: b++;
261 // CHECK-NEXT: }
262 // CHECK-NEXT: #pragma omp atomic release
263 // CHECK-NEXT: a++;
264 // CHECK-NEXT: #pragma omp atomic read
265 // CHECK-NEXT: a = argc;
266 // CHECK-NEXT: #pragma omp atomic release write
267 // CHECK-NEXT: a = argc + argc;
268 // CHECK-NEXT: #pragma omp atomic update release
269 // CHECK-NEXT: a = a + argc;
270 // CHECK-NEXT: #pragma omp atomic release capture
271 // CHECK-NEXT: a = b++;
272 // CHECK-NEXT: #pragma omp atomic capture release
273 // CHECK-NEXT: {
274 // CHECK-NEXT: a = b;
275 // CHECK-NEXT: b++;
276 // CHECK-NEXT: }
277 // CHECK-NEXT: #pragma omp atomic relaxed
278 // CHECK-NEXT: a++;
279 // CHECK-NEXT: #pragma omp atomic read
280 // CHECK-NEXT: a = argc;
281 // CHECK-NEXT: #pragma omp atomic relaxed write
282 // CHECK-NEXT: a = argc + argc;
283 // CHECK-NEXT: #pragma omp atomic update relaxed
284 // CHECK-NEXT: a = a + argc;
285 // CHECK-NEXT: #pragma omp atomic relaxed capture
286 // CHECK-NEXT: a = b++;
287 // CHECK-NEXT: #pragma omp atomic capture relaxed
288 // CHECK-NEXT: {
289 // CHECK-NEXT: a = b;
290 // CHECK-NEXT: b++;
291 // CHECK-NEXT: }
292 
293 int main(int argc, char **argv) {
294   int b = 0;
295   int a = 0;
296 // CHECK: int a = 0;
297 #pragma omp atomic
298   a++;
299 #pragma omp atomic read
300   a = argc;
301 #pragma omp atomic write
302   a = argc + argc;
303 #pragma omp atomic update
304   a = a + argc;
305 #pragma omp atomic capture
306   a = b++;
307 #pragma omp atomic capture
308   {
309     a = b;
310     b++;
311   }
312 #pragma omp atomic seq_cst
313   a++;
314 #pragma omp atomic read seq_cst
315   a = argc;
316 #pragma omp atomic seq_cst write
317   a = argc + argc;
318 #pragma omp atomic update seq_cst
319   a = a + argc;
320 #pragma omp atomic seq_cst capture
321   a = b++;
322 #pragma omp atomic capture seq_cst
323   {
324     a = b;
325     b++;
326   }
327 #pragma omp atomic
328   a++;
329 #pragma omp atomic read
330   a = argc;
331 #pragma omp atomic write
332   a = argc + argc;
333 #pragma omp atomic update
334   a = a + argc;
335 #pragma omp atomic acq_rel capture
336   a = b++;
337 #pragma omp atomic capture acq_rel
338   {
339     a = b;
340     b++;
341   }
342 #pragma omp atomic
343   a++;
344 #pragma omp atomic read acquire
345   a = argc;
346 #pragma omp atomic write
347   a = argc + argc;
348 #pragma omp atomic update
349   a = a + argc;
350 #pragma omp atomic acquire capture
351   a = b++;
352 #pragma omp atomic capture acquire
353   {
354     a = b;
355     b++;
356   }
357 #pragma omp atomic release
358   a++;
359 #pragma omp atomic read
360   a = argc;
361 #pragma omp atomic release write
362   a = argc + argc;
363 #pragma omp atomic update release
364   a = a + argc;
365 #pragma omp atomic release capture
366   a = b++;
367 #pragma omp atomic capture release
368   {
369     a = b;
370     b++;
371   }
372 #pragma omp atomic relaxed
373   a++;
374 #pragma omp atomic read
375   a = argc;
376 #pragma omp atomic relaxed write
377   a = argc + argc;
378 #pragma omp atomic update relaxed
379   a = a + argc;
380 #pragma omp atomic relaxed capture
381   a = b++;
382 #pragma omp atomic capture relaxed
383   {
384     a = b;
385     b++;
386   }
387   // CHECK-NEXT: #pragma omp atomic
388   // CHECK-NEXT: a++;
389   // CHECK-NEXT: #pragma omp atomic read
390   // CHECK-NEXT: a = argc;
391   // CHECK-NEXT: #pragma omp atomic write
392   // CHECK-NEXT: a = argc + argc;
393   // CHECK-NEXT: #pragma omp atomic update
394   // CHECK-NEXT: a = a + argc;
395   // CHECK-NEXT: #pragma omp atomic capture
396   // CHECK-NEXT: a = b++;
397   // CHECK-NEXT: #pragma omp atomic capture
398   // CHECK-NEXT: {
399   // CHECK-NEXT: a = b;
400   // CHECK-NEXT: b++;
401   // CHECK-NEXT: }
402   // CHECK-NEXT: #pragma omp atomic seq_cst
403   // CHECK-NEXT: a++;
404   // CHECK-NEXT: #pragma omp atomic read seq_cst
405   // CHECK-NEXT: a = argc;
406   // CHECK-NEXT: #pragma omp atomic seq_cst write
407   // CHECK-NEXT: a = argc + argc;
408   // CHECK-NEXT: #pragma omp atomic update seq_cst
409   // CHECK-NEXT: a = a + argc;
410   // CHECK-NEXT: #pragma omp atomic seq_cst capture
411   // CHECK-NEXT: a = b++;
412   // CHECK-NEXT: #pragma omp atomic capture seq_cst
413   // CHECK-NEXT: {
414   // CHECK-NEXT: a = b;
415   // CHECK-NEXT: b++;
416   // CHECK-NEXT: }
417   // CHECK-NEXT: #pragma omp atomic
418   // CHECK-NEXT: a++;
419   // CHECK-NEXT: #pragma omp atomic read
420   // CHECK-NEXT: a = argc;
421   // CHECK-NEXT: #pragma omp atomic write
422   // CHECK-NEXT: a = argc + argc;
423   // CHECK-NEXT: #pragma omp atomic update
424   // CHECK-NEXT: a = a + argc;
425   // CHECK-NEXT: #pragma omp atomic acq_rel capture
426   // CHECK-NEXT: a = b++;
427   // CHECK-NEXT: #pragma omp atomic capture acq_rel
428   // CHECK-NEXT: {
429   // CHECK-NEXT: a = b;
430   // CHECK-NEXT: b++;
431   // CHECK-NEXT: }
432   // CHECK-NEXT: #pragma omp atomic
433   // CHECK-NEXT: a++;
434   // CHECK-NEXT: #pragma omp atomic read acquire
435   // CHECK-NEXT: a = argc;
436   // CHECK-NEXT: #pragma omp atomic write
437   // CHECK-NEXT: a = argc + argc;
438   // CHECK-NEXT: #pragma omp atomic update
439   // CHECK-NEXT: a = a + argc;
440   // CHECK-NEXT: #pragma omp atomic acquire capture
441   // CHECK-NEXT: a = b++;
442   // CHECK-NEXT: #pragma omp atomic capture acquire
443   // CHECK-NEXT: {
444   // CHECK-NEXT: a = b;
445   // CHECK-NEXT: b++;
446   // CHECK-NEXT: }
447   // CHECK-NEXT: #pragma omp atomic release
448   // CHECK-NEXT: a++;
449   // CHECK-NEXT: #pragma omp atomic read
450   // CHECK-NEXT: a = argc;
451   // CHECK-NEXT: #pragma omp atomic release write
452   // CHECK-NEXT: a = argc + argc;
453   // CHECK-NEXT: #pragma omp atomic update release
454   // CHECK-NEXT: a = a + argc;
455   // CHECK-NEXT: #pragma omp atomic release capture
456   // CHECK-NEXT: a = b++;
457   // CHECK-NEXT: #pragma omp atomic capture release
458   // CHECK-NEXT: {
459   // CHECK-NEXT: a = b;
460   // CHECK-NEXT: b++;
461   // CHECK-NEXT: }
462   // CHECK-NEXT: #pragma omp atomic relaxed
463   // CHECK-NEXT: a++;
464   // CHECK-NEXT: #pragma omp atomic read
465   // CHECK-NEXT: a = argc;
466   // CHECK-NEXT: #pragma omp atomic relaxed write
467   // CHECK-NEXT: a = argc + argc;
468   // CHECK-NEXT: #pragma omp atomic update relaxed
469   // CHECK-NEXT: a = a + argc;
470   // CHECK-NEXT: #pragma omp atomic relaxed capture
471   // CHECK-NEXT: a = b++;
472   // CHECK-NEXT: #pragma omp atomic capture relaxed
473   // CHECK-NEXT: {
474   // CHECK-NEXT: a = b;
475   // CHECK-NEXT: b++;
476   // CHECK-NEXT: }
477   return foo(a);
478 }
479 
480 #endif
481