blob: 961c1e69b1fcabf2adab68627e17ca0164a6de6f [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 Bataev0162e452014-07-22 10:10:35 +00004// expected-no-diagnostics
5
6#ifndef HEADER
7#define HEADER
8
9template <class T>
Alexey Bataevdea47612014-07-23 07:46:59 +000010T foo(T argc) {
Alexey Bataev459dec02014-07-24 06:46:57 +000011 T b = T();
Alexey Bataevdea47612014-07-23 07:46:59 +000012 T a = T();
Alexey Bataev0162e452014-07-22 10:10:35 +000013#pragma omp atomic
14 a++;
Alexey Bataevf98b00c2014-07-23 02:27:21 +000015#pragma omp atomic read
16 a = argc;
Alexey Bataevdea47612014-07-23 07:46:59 +000017#pragma omp atomic write
18 a = argc + argc;
Alexey Bataev67a4f222014-07-23 10:25:33 +000019#pragma omp atomic update
20 a = a + argc;
Alexey Bataev459dec02014-07-24 06:46:57 +000021#pragma omp atomic capture
22 a = b++;
23#pragma omp atomic capture
24 {
25 a = b;
26 b++;
27 }
Alexey Bataev82bad8b2014-07-24 08:55:34 +000028#pragma omp atomic seq_cst
29 a++;
30#pragma omp atomic read seq_cst
31 a = argc;
32#pragma omp atomic seq_cst write
33 a = argc + argc;
34#pragma omp atomic update seq_cst
35 a = a + argc;
36#pragma omp atomic seq_cst capture
37 a = b++;
38#pragma omp atomic capture seq_cst
39 {
40 a = b;
41 b++;
42 }
Alexey Bataevdea47612014-07-23 07:46:59 +000043 return T();
44}
45
46// CHECK: int a = int();
47// CHECK-NEXT: #pragma omp atomic
48// CHECK-NEXT: a++;
49// CHECK-NEXT: #pragma omp atomic read
50// CHECK-NEXT: a = argc;
51// CHECK-NEXT: #pragma omp atomic write
52// CHECK-NEXT: a = argc + argc;
Alexey Bataev67a4f222014-07-23 10:25:33 +000053// CHECK-NEXT: #pragma omp atomic update
54// CHECK-NEXT: a = a + argc;
Alexey Bataev459dec02014-07-24 06:46:57 +000055// CHECK-NEXT: #pragma omp atomic capture
56// CHECK-NEXT: a = b++;
57// CHECK-NEXT: #pragma omp atomic capture
58// CHECK-NEXT: {
59// CHECK-NEXT: a = b;
60// CHECK-NEXT: b++;
61// CHECK-NEXT: }
Alexey Bataev82bad8b2014-07-24 08:55:34 +000062// CHECK-NEXT: #pragma omp atomic seq_cst
63// CHECK-NEXT: a++;
64// CHECK-NEXT: #pragma omp atomic read seq_cst
65// CHECK-NEXT: a = argc;
66// CHECK-NEXT: #pragma omp atomic seq_cst write
67// CHECK-NEXT: a = argc + argc;
68// CHECK-NEXT: #pragma omp atomic update seq_cst
69// CHECK-NEXT: a = a + argc;
70// CHECK-NEXT: #pragma omp atomic seq_cst capture
71// CHECK-NEXT: a = b++;
72// CHECK-NEXT: #pragma omp atomic capture seq_cst
73// CHECK-NEXT: {
74// CHECK-NEXT: a = b;
75// CHECK-NEXT: b++;
76// CHECK-NEXT: }
Alexey Bataevdea47612014-07-23 07:46:59 +000077// CHECK: T a = T();
78// CHECK-NEXT: #pragma omp atomic
79// CHECK-NEXT: a++;
80// CHECK-NEXT: #pragma omp atomic read
81// CHECK-NEXT: a = argc;
82// CHECK-NEXT: #pragma omp atomic write
83// CHECK-NEXT: a = argc + argc;
Alexey Bataev67a4f222014-07-23 10:25:33 +000084// CHECK-NEXT: #pragma omp atomic update
85// CHECK-NEXT: a = a + argc;
Alexey Bataev459dec02014-07-24 06:46:57 +000086// CHECK-NEXT: #pragma omp atomic capture
87// CHECK-NEXT: a = b++;
88// CHECK-NEXT: #pragma omp atomic capture
89// CHECK-NEXT: {
90// CHECK-NEXT: a = b;
91// CHECK-NEXT: b++;
92// CHECK-NEXT: }
Alexey Bataev82bad8b2014-07-24 08:55:34 +000093// CHECK-NEXT: #pragma omp atomic seq_cst
94// CHECK-NEXT: a++;
95// CHECK-NEXT: #pragma omp atomic read seq_cst
96// CHECK-NEXT: a = argc;
97// CHECK-NEXT: #pragma omp atomic seq_cst write
98// CHECK-NEXT: a = argc + argc;
99// CHECK-NEXT: #pragma omp atomic update seq_cst
100// CHECK-NEXT: a = a + argc;
101// CHECK-NEXT: #pragma omp atomic seq_cst capture
102// CHECK-NEXT: a = b++;
103// CHECK-NEXT: #pragma omp atomic capture seq_cst
104// CHECK-NEXT: {
105// CHECK-NEXT: a = b;
106// CHECK-NEXT: b++;
107// CHECK-NEXT: }
Alexey Bataevdea47612014-07-23 07:46:59 +0000108
109int main(int argc, char **argv) {
Alexey Bataev459dec02014-07-24 06:46:57 +0000110 int b = 0;
Alexey Bataevdea47612014-07-23 07:46:59 +0000111 int a = 0;
112// CHECK: int a = 0;
113#pragma omp atomic
114 a++;
115#pragma omp atomic read
116 a = argc;
117#pragma omp atomic write
118 a = argc + argc;
Alexey Bataev67a4f222014-07-23 10:25:33 +0000119#pragma omp atomic update
120 a = a + argc;
Alexey Bataev459dec02014-07-24 06:46:57 +0000121#pragma omp atomic capture
122 a = b++;
123#pragma omp atomic capture
124 {
125 a = b;
126 b++;
127 }
Alexey Bataev82bad8b2014-07-24 08:55:34 +0000128#pragma omp atomic seq_cst
129 a++;
130#pragma omp atomic read seq_cst
131 a = argc;
132#pragma omp atomic seq_cst write
133 a = argc + argc;
134#pragma omp atomic update seq_cst
135 a = a + argc;
136#pragma omp atomic seq_cst capture
137 a = b++;
138#pragma omp atomic capture seq_cst
139 {
140 a = b;
141 b++;
142 }
Alexey Bataev0162e452014-07-22 10:10:35 +0000143 // CHECK-NEXT: #pragma omp atomic
144 // CHECK-NEXT: a++;
Alexey Bataevf98b00c2014-07-23 02:27:21 +0000145 // CHECK-NEXT: #pragma omp atomic read
146 // CHECK-NEXT: a = argc;
Alexey Bataevdea47612014-07-23 07:46:59 +0000147 // CHECK-NEXT: #pragma omp atomic write
148 // CHECK-NEXT: a = argc + argc;
Alexey Bataev67a4f222014-07-23 10:25:33 +0000149 // CHECK-NEXT: #pragma omp atomic update
150 // CHECK-NEXT: a = a + argc;
Alexey Bataev459dec02014-07-24 06:46:57 +0000151 // CHECK-NEXT: #pragma omp atomic capture
152 // CHECK-NEXT: a = b++;
153 // CHECK-NEXT: #pragma omp atomic capture
154 // CHECK-NEXT: {
155 // CHECK-NEXT: a = b;
156 // CHECK-NEXT: b++;
157 // CHECK-NEXT: }
Alexey Bataev82bad8b2014-07-24 08:55:34 +0000158 // CHECK-NEXT: #pragma omp atomic seq_cst
159 // CHECK-NEXT: a++;
160 // CHECK-NEXT: #pragma omp atomic read seq_cst
161 // CHECK-NEXT: a = argc;
162 // CHECK-NEXT: #pragma omp atomic seq_cst write
163 // CHECK-NEXT: a = argc + argc;
164 // CHECK-NEXT: #pragma omp atomic update seq_cst
165 // CHECK-NEXT: a = a + argc;
166 // CHECK-NEXT: #pragma omp atomic seq_cst capture
167 // CHECK-NEXT: a = b++;
168 // CHECK-NEXT: #pragma omp atomic capture seq_cst
169 // CHECK-NEXT: {
170 // CHECK-NEXT: a = b;
171 // CHECK-NEXT: b++;
172 // CHECK-NEXT: }
Alexey Bataev0162e452014-07-22 10:10:35 +0000173 return foo(a);
174}
175
176#endif