blob: c66249b708eda3dbbb1b7d957bf6e129b7495a3a [file] [log] [blame]
Alexey Bataevdb390212015-05-20 04:24:19 +00001// 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
Alexey Bataeva8a9153a2017-12-29 18:07:07 +00004
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
Alexey Bataev0162e452014-07-22 10:10:35 +00008// expected-no-diagnostics
9
10#ifndef HEADER
11#define HEADER
12
13template <class T>
Alexey Bataevdea47612014-07-23 07:46:59 +000014T foo(T argc) {
Alexey Bataev459dec02014-07-24 06:46:57 +000015 T b = T();
Alexey Bataevdea47612014-07-23 07:46:59 +000016 T a = T();
Alexey Bataev0162e452014-07-22 10:10:35 +000017#pragma omp atomic
18 a++;
Alexey Bataevf98b00c2014-07-23 02:27:21 +000019#pragma omp atomic read
20 a = argc;
Alexey Bataevdea47612014-07-23 07:46:59 +000021#pragma omp atomic write
22 a = argc + argc;
Alexey Bataev67a4f222014-07-23 10:25:33 +000023#pragma omp atomic update
24 a = a + argc;
Alexey Bataev459dec02014-07-24 06:46:57 +000025#pragma omp atomic capture
26 a = b++;
27#pragma omp atomic capture
28 {
29 a = b;
30 b++;
31 }
Alexey Bataev82bad8b2014-07-24 08:55:34 +000032#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 }
Alexey Bataevdea47612014-07-23 07:46:59 +000047 return T();
48}
49
Serge Pavlova67a4d22016-11-10 08:49:37 +000050// CHECK: T a = T();
Alexey Bataevcbecfdf2018-02-14 17:38:47 +000051// CHECK-NEXT: #pragma omp atomic{{$}}
Alexey Bataevdea47612014-07-23 07:46:59 +000052// 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;
Alexey Bataev67a4f222014-07-23 10:25:33 +000057// CHECK-NEXT: #pragma omp atomic update
58// CHECK-NEXT: a = a + argc;
Alexey Bataev459dec02014-07-24 06:46:57 +000059// 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: }
Alexey Bataev82bad8b2014-07-24 08:55:34 +000066// 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: }
Serge Pavlova67a4d22016-11-10 08:49:37 +000081// CHECK: int a = int();
Alexey Bataevdea47612014-07-23 07:46:59 +000082// 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;
Alexey Bataev67a4f222014-07-23 10:25:33 +000088// CHECK-NEXT: #pragma omp atomic update
89// CHECK-NEXT: a = a + argc;
Alexey Bataev459dec02014-07-24 06:46:57 +000090// 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: }
Alexey Bataev82bad8b2014-07-24 08:55:34 +000097// 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: }
Alexey Bataevdea47612014-07-23 07:46:59 +0000112
113int main(int argc, char **argv) {
Alexey Bataev459dec02014-07-24 06:46:57 +0000114 int b = 0;
Alexey Bataevdea47612014-07-23 07:46:59 +0000115 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;
Alexey Bataev67a4f222014-07-23 10:25:33 +0000123#pragma omp atomic update
124 a = a + argc;
Alexey Bataev459dec02014-07-24 06:46:57 +0000125#pragma omp atomic capture
126 a = b++;
127#pragma omp atomic capture
128 {
129 a = b;
130 b++;
131 }
Alexey Bataev82bad8b2014-07-24 08:55:34 +0000132#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 }
Alexey Bataev0162e452014-07-22 10:10:35 +0000147 // CHECK-NEXT: #pragma omp atomic
148 // CHECK-NEXT: a++;
Alexey Bataevf98b00c2014-07-23 02:27:21 +0000149 // CHECK-NEXT: #pragma omp atomic read
150 // CHECK-NEXT: a = argc;
Alexey Bataevdea47612014-07-23 07:46:59 +0000151 // CHECK-NEXT: #pragma omp atomic write
152 // CHECK-NEXT: a = argc + argc;
Alexey Bataev67a4f222014-07-23 10:25:33 +0000153 // CHECK-NEXT: #pragma omp atomic update
154 // CHECK-NEXT: a = a + argc;
Alexey Bataev459dec02014-07-24 06:46:57 +0000155 // 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: }
Alexey Bataev82bad8b2014-07-24 08:55:34 +0000162 // 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: }
Alexey Bataev0162e452014-07-22 10:10:35 +0000177 return foo(a);
178}
179
180#endif