1 // RUN: %clang_cc1 -verify -fopenmp -ast-print %s | FileCheck %s
2 // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s
3 // RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
4 
5 // RUN: %clang_cc1 -verify -fopenmp-simd -ast-print %s | FileCheck %s
6 // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -emit-pch -o %t %s
7 // RUN: %clang_cc1 -fopenmp-simd -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   return T();
48 }
49 
50 // CHECK: T a = T();
51 // CHECK-NEXT: #pragma omp atomic{{$}}
52 // CHECK-NEXT: a++;
53 // CHECK-NEXT: #pragma omp atomic read
54 // CHECK-NEXT: a = argc;
55 // CHECK-NEXT: #pragma omp atomic write
56 // CHECK-NEXT: a = argc + argc;
57 // CHECK-NEXT: #pragma omp atomic update
58 // CHECK-NEXT: a = a + argc;
59 // CHECK-NEXT: #pragma omp atomic capture
60 // CHECK-NEXT: a = b++;
61 // CHECK-NEXT: #pragma omp atomic capture
62 // CHECK-NEXT: {
63 // CHECK-NEXT: a = b;
64 // CHECK-NEXT: b++;
65 // CHECK-NEXT: }
66 // CHECK-NEXT: #pragma omp atomic seq_cst
67 // CHECK-NEXT: a++;
68 // CHECK-NEXT: #pragma omp atomic read seq_cst
69 // CHECK-NEXT: a = argc;
70 // CHECK-NEXT: #pragma omp atomic seq_cst write
71 // CHECK-NEXT: a = argc + argc;
72 // CHECK-NEXT: #pragma omp atomic update seq_cst
73 // CHECK-NEXT: a = a + argc;
74 // CHECK-NEXT: #pragma omp atomic seq_cst capture
75 // CHECK-NEXT: a = b++;
76 // CHECK-NEXT: #pragma omp atomic capture seq_cst
77 // CHECK-NEXT: {
78 // CHECK-NEXT: a = b;
79 // CHECK-NEXT: b++;
80 // CHECK-NEXT: }
81 // CHECK: int a = int();
82 // CHECK-NEXT: #pragma omp atomic
83 // CHECK-NEXT: a++;
84 // CHECK-NEXT: #pragma omp atomic read
85 // CHECK-NEXT: a = argc;
86 // CHECK-NEXT: #pragma omp atomic write
87 // CHECK-NEXT: a = argc + argc;
88 // CHECK-NEXT: #pragma omp atomic update
89 // CHECK-NEXT: a = a + argc;
90 // CHECK-NEXT: #pragma omp atomic capture
91 // CHECK-NEXT: a = b++;
92 // CHECK-NEXT: #pragma omp atomic capture
93 // CHECK-NEXT: {
94 // CHECK-NEXT: a = b;
95 // CHECK-NEXT: b++;
96 // CHECK-NEXT: }
97 // CHECK-NEXT: #pragma omp atomic seq_cst
98 // CHECK-NEXT: a++;
99 // CHECK-NEXT: #pragma omp atomic read seq_cst
100 // CHECK-NEXT: a = argc;
101 // CHECK-NEXT: #pragma omp atomic seq_cst write
102 // CHECK-NEXT: a = argc + argc;
103 // CHECK-NEXT: #pragma omp atomic update seq_cst
104 // CHECK-NEXT: a = a + argc;
105 // CHECK-NEXT: #pragma omp atomic seq_cst capture
106 // CHECK-NEXT: a = b++;
107 // CHECK-NEXT: #pragma omp atomic capture seq_cst
108 // CHECK-NEXT: {
109 // CHECK-NEXT: a = b;
110 // CHECK-NEXT: b++;
111 // CHECK-NEXT: }
112 
113 int main(int argc, char **argv) {
114   int b = 0;
115   int a = 0;
116 // CHECK: int a = 0;
117 #pragma omp atomic
118   a++;
119 #pragma omp atomic read
120   a = argc;
121 #pragma omp atomic write
122   a = argc + argc;
123 #pragma omp atomic update
124   a = a + argc;
125 #pragma omp atomic capture
126   a = b++;
127 #pragma omp atomic capture
128   {
129     a = b;
130     b++;
131   }
132 #pragma omp atomic seq_cst
133   a++;
134 #pragma omp atomic read seq_cst
135   a = argc;
136 #pragma omp atomic seq_cst write
137   a = argc + argc;
138 #pragma omp atomic update seq_cst
139   a = a + argc;
140 #pragma omp atomic seq_cst capture
141   a = b++;
142 #pragma omp atomic capture seq_cst
143   {
144     a = b;
145     b++;
146   }
147   // CHECK-NEXT: #pragma omp atomic
148   // CHECK-NEXT: a++;
149   // CHECK-NEXT: #pragma omp atomic read
150   // CHECK-NEXT: a = argc;
151   // CHECK-NEXT: #pragma omp atomic write
152   // CHECK-NEXT: a = argc + argc;
153   // CHECK-NEXT: #pragma omp atomic update
154   // CHECK-NEXT: a = a + argc;
155   // CHECK-NEXT: #pragma omp atomic capture
156   // CHECK-NEXT: a = b++;
157   // CHECK-NEXT: #pragma omp atomic capture
158   // CHECK-NEXT: {
159   // CHECK-NEXT: a = b;
160   // CHECK-NEXT: b++;
161   // CHECK-NEXT: }
162   // CHECK-NEXT: #pragma omp atomic seq_cst
163   // CHECK-NEXT: a++;
164   // CHECK-NEXT: #pragma omp atomic read seq_cst
165   // CHECK-NEXT: a = argc;
166   // CHECK-NEXT: #pragma omp atomic seq_cst write
167   // CHECK-NEXT: a = argc + argc;
168   // CHECK-NEXT: #pragma omp atomic update seq_cst
169   // CHECK-NEXT: a = a + argc;
170   // CHECK-NEXT: #pragma omp atomic seq_cst capture
171   // CHECK-NEXT: a = b++;
172   // CHECK-NEXT: #pragma omp atomic capture seq_cst
173   // CHECK-NEXT: {
174   // CHECK-NEXT: a = b;
175   // CHECK-NEXT: b++;
176   // CHECK-NEXT: }
177   return foo(a);
178 }
179 
180 #endif
181