Clang Project

clang_source_code/test/OpenMP/atomic_ast_print.cpp
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
13template <class T>
14T 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
113int 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