xref: /aosp_15_r20/external/clang/test/OpenMP/atomic_ast_print.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -verify -fopenmp -ast-print %s | FileCheck %s
2*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s
3*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
4*67e74705SXin Li // expected-no-diagnostics
5*67e74705SXin Li 
6*67e74705SXin Li #ifndef HEADER
7*67e74705SXin Li #define HEADER
8*67e74705SXin Li 
9*67e74705SXin Li template <class T>
foo(T argc)10*67e74705SXin Li T foo(T argc) {
11*67e74705SXin Li   T b = T();
12*67e74705SXin Li   T a = T();
13*67e74705SXin Li #pragma omp atomic
14*67e74705SXin Li   a++;
15*67e74705SXin Li #pragma omp atomic read
16*67e74705SXin Li   a = argc;
17*67e74705SXin Li #pragma omp atomic write
18*67e74705SXin Li   a = argc + argc;
19*67e74705SXin Li #pragma omp atomic update
20*67e74705SXin Li   a = a + argc;
21*67e74705SXin Li #pragma omp atomic capture
22*67e74705SXin Li   a = b++;
23*67e74705SXin Li #pragma omp atomic capture
24*67e74705SXin Li   {
25*67e74705SXin Li     a = b;
26*67e74705SXin Li     b++;
27*67e74705SXin Li   }
28*67e74705SXin Li #pragma omp atomic seq_cst
29*67e74705SXin Li   a++;
30*67e74705SXin Li #pragma omp atomic read seq_cst
31*67e74705SXin Li   a = argc;
32*67e74705SXin Li #pragma omp atomic seq_cst write
33*67e74705SXin Li   a = argc + argc;
34*67e74705SXin Li #pragma omp atomic update seq_cst
35*67e74705SXin Li   a = a + argc;
36*67e74705SXin Li #pragma omp atomic seq_cst capture
37*67e74705SXin Li   a = b++;
38*67e74705SXin Li #pragma omp atomic capture seq_cst
39*67e74705SXin Li   {
40*67e74705SXin Li     a = b;
41*67e74705SXin Li     b++;
42*67e74705SXin Li   }
43*67e74705SXin Li   return T();
44*67e74705SXin Li }
45*67e74705SXin Li 
46*67e74705SXin Li // CHECK: int a = int();
47*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic
48*67e74705SXin Li // CHECK-NEXT: a++;
49*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic read
50*67e74705SXin Li // CHECK-NEXT: a = argc;
51*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic write
52*67e74705SXin Li // CHECK-NEXT: a = argc + argc;
53*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic update
54*67e74705SXin Li // CHECK-NEXT: a = a + argc;
55*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic capture
56*67e74705SXin Li // CHECK-NEXT: a = b++;
57*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic capture
58*67e74705SXin Li // CHECK-NEXT: {
59*67e74705SXin Li // CHECK-NEXT: a = b;
60*67e74705SXin Li // CHECK-NEXT: b++;
61*67e74705SXin Li // CHECK-NEXT: }
62*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic seq_cst
63*67e74705SXin Li // CHECK-NEXT: a++;
64*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic read seq_cst
65*67e74705SXin Li // CHECK-NEXT: a = argc;
66*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic seq_cst write
67*67e74705SXin Li // CHECK-NEXT: a = argc + argc;
68*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic update seq_cst
69*67e74705SXin Li // CHECK-NEXT: a = a + argc;
70*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic seq_cst capture
71*67e74705SXin Li // CHECK-NEXT: a = b++;
72*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic capture seq_cst
73*67e74705SXin Li // CHECK-NEXT: {
74*67e74705SXin Li // CHECK-NEXT: a = b;
75*67e74705SXin Li // CHECK-NEXT: b++;
76*67e74705SXin Li // CHECK-NEXT: }
77*67e74705SXin Li // CHECK: T a = T();
78*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic
79*67e74705SXin Li // CHECK-NEXT: a++;
80*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic read
81*67e74705SXin Li // CHECK-NEXT: a = argc;
82*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic write
83*67e74705SXin Li // CHECK-NEXT: a = argc + argc;
84*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic update
85*67e74705SXin Li // CHECK-NEXT: a = a + argc;
86*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic capture
87*67e74705SXin Li // CHECK-NEXT: a = b++;
88*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic capture
89*67e74705SXin Li // CHECK-NEXT: {
90*67e74705SXin Li // CHECK-NEXT: a = b;
91*67e74705SXin Li // CHECK-NEXT: b++;
92*67e74705SXin Li // CHECK-NEXT: }
93*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic seq_cst
94*67e74705SXin Li // CHECK-NEXT: a++;
95*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic read seq_cst
96*67e74705SXin Li // CHECK-NEXT: a = argc;
97*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic seq_cst write
98*67e74705SXin Li // CHECK-NEXT: a = argc + argc;
99*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic update seq_cst
100*67e74705SXin Li // CHECK-NEXT: a = a + argc;
101*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic seq_cst capture
102*67e74705SXin Li // CHECK-NEXT: a = b++;
103*67e74705SXin Li // CHECK-NEXT: #pragma omp atomic capture seq_cst
104*67e74705SXin Li // CHECK-NEXT: {
105*67e74705SXin Li // CHECK-NEXT: a = b;
106*67e74705SXin Li // CHECK-NEXT: b++;
107*67e74705SXin Li // CHECK-NEXT: }
108*67e74705SXin Li 
main(int argc,char ** argv)109*67e74705SXin Li int main(int argc, char **argv) {
110*67e74705SXin Li   int b = 0;
111*67e74705SXin Li   int a = 0;
112*67e74705SXin Li // CHECK: int a = 0;
113*67e74705SXin Li #pragma omp atomic
114*67e74705SXin Li   a++;
115*67e74705SXin Li #pragma omp atomic read
116*67e74705SXin Li   a = argc;
117*67e74705SXin Li #pragma omp atomic write
118*67e74705SXin Li   a = argc + argc;
119*67e74705SXin Li #pragma omp atomic update
120*67e74705SXin Li   a = a + argc;
121*67e74705SXin Li #pragma omp atomic capture
122*67e74705SXin Li   a = b++;
123*67e74705SXin Li #pragma omp atomic capture
124*67e74705SXin Li   {
125*67e74705SXin Li     a = b;
126*67e74705SXin Li     b++;
127*67e74705SXin Li   }
128*67e74705SXin Li #pragma omp atomic seq_cst
129*67e74705SXin Li   a++;
130*67e74705SXin Li #pragma omp atomic read seq_cst
131*67e74705SXin Li   a = argc;
132*67e74705SXin Li #pragma omp atomic seq_cst write
133*67e74705SXin Li   a = argc + argc;
134*67e74705SXin Li #pragma omp atomic update seq_cst
135*67e74705SXin Li   a = a + argc;
136*67e74705SXin Li #pragma omp atomic seq_cst capture
137*67e74705SXin Li   a = b++;
138*67e74705SXin Li #pragma omp atomic capture seq_cst
139*67e74705SXin Li   {
140*67e74705SXin Li     a = b;
141*67e74705SXin Li     b++;
142*67e74705SXin Li   }
143*67e74705SXin Li   // CHECK-NEXT: #pragma omp atomic
144*67e74705SXin Li   // CHECK-NEXT: a++;
145*67e74705SXin Li   // CHECK-NEXT: #pragma omp atomic read
146*67e74705SXin Li   // CHECK-NEXT: a = argc;
147*67e74705SXin Li   // CHECK-NEXT: #pragma omp atomic write
148*67e74705SXin Li   // CHECK-NEXT: a = argc + argc;
149*67e74705SXin Li   // CHECK-NEXT: #pragma omp atomic update
150*67e74705SXin Li   // CHECK-NEXT: a = a + argc;
151*67e74705SXin Li   // CHECK-NEXT: #pragma omp atomic capture
152*67e74705SXin Li   // CHECK-NEXT: a = b++;
153*67e74705SXin Li   // CHECK-NEXT: #pragma omp atomic capture
154*67e74705SXin Li   // CHECK-NEXT: {
155*67e74705SXin Li   // CHECK-NEXT: a = b;
156*67e74705SXin Li   // CHECK-NEXT: b++;
157*67e74705SXin Li   // CHECK-NEXT: }
158*67e74705SXin Li   // CHECK-NEXT: #pragma omp atomic seq_cst
159*67e74705SXin Li   // CHECK-NEXT: a++;
160*67e74705SXin Li   // CHECK-NEXT: #pragma omp atomic read seq_cst
161*67e74705SXin Li   // CHECK-NEXT: a = argc;
162*67e74705SXin Li   // CHECK-NEXT: #pragma omp atomic seq_cst write
163*67e74705SXin Li   // CHECK-NEXT: a = argc + argc;
164*67e74705SXin Li   // CHECK-NEXT: #pragma omp atomic update seq_cst
165*67e74705SXin Li   // CHECK-NEXT: a = a + argc;
166*67e74705SXin Li   // CHECK-NEXT: #pragma omp atomic seq_cst capture
167*67e74705SXin Li   // CHECK-NEXT: a = b++;
168*67e74705SXin Li   // CHECK-NEXT: #pragma omp atomic capture seq_cst
169*67e74705SXin Li   // CHECK-NEXT: {
170*67e74705SXin Li   // CHECK-NEXT: a = b;
171*67e74705SXin Li   // CHECK-NEXT: b++;
172*67e74705SXin Li   // CHECK-NEXT: }
173*67e74705SXin Li   return foo(a);
174*67e74705SXin Li }
175*67e74705SXin Li 
176*67e74705SXin Li #endif
177