1 | // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s |
2 | |
3 | // RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 %s |
4 | |
5 | int foo() { |
6 | L1: |
7 | foo(); |
8 | #pragma omp atomic |
9 | // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}} |
10 | // expected-note@+1 {{expected an expression statement}} |
11 | { |
12 | foo(); |
13 | goto L1; // expected-error {{use of undeclared label 'L1'}} |
14 | } |
15 | goto L2; // expected-error {{use of undeclared label 'L2'}} |
16 | #pragma omp atomic |
17 | // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}} |
18 | // expected-note@+1 {{expected an expression statement}} |
19 | { |
20 | foo(); |
21 | L2: |
22 | foo(); |
23 | } |
24 | |
25 | return 0; |
26 | } |
27 | |
28 | struct S { |
29 | int a; |
30 | S &operator=(int v) { |
31 | a = v; |
32 | return *this; |
33 | } |
34 | S &operator+=(const S &s) { |
35 | a += s.a; |
36 | return *this; |
37 | } |
38 | }; |
39 | |
40 | template <class T> |
41 | T read() { |
42 | T a = T(), b = T(); |
43 | // Test for atomic read |
44 | #pragma omp atomic read |
45 | // expected-error@+2 {{the statement for 'atomic read' must be an expression statement of form 'v = x;', where v and x are both lvalue expressions with scalar type}} |
46 | // expected-note@+1 {{expected an expression statement}} |
47 | ; |
48 | #pragma omp atomic read |
49 | // expected-error@+2 {{the statement for 'atomic read' must be an expression statement of form 'v = x;', where v and x are both lvalue expressions with scalar type}} |
50 | // expected-note@+1 {{expected built-in assignment operator}} |
51 | foo(); |
52 | #pragma omp atomic read |
53 | // expected-error@+2 2 {{the statement for 'atomic read' must be an expression statement of form 'v = x;', where v and x are both lvalue expressions with scalar type}} |
54 | // expected-note@+1 2 {{expected built-in assignment operator}} |
55 | a += b; |
56 | #pragma omp atomic read |
57 | // expected-error@+2 {{the statement for 'atomic read' must be an expression statement of form 'v = x;', where v and x are both lvalue expressions with scalar type}} |
58 | // expected-note@+1 {{expected lvalue expression}} |
59 | a = 0; |
60 | #pragma omp atomic read |
61 | // expected-error@+2 {{the statement for 'atomic read' must be an expression statement of form 'v = x;', where v and x are both lvalue expressions with scalar type}} |
62 | // expected-note@+1 {{expected built-in assignment operator}} |
63 | a = b; |
64 | // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'read' clause}} |
65 | #pragma omp atomic read read |
66 | // expected-error@+2 {{the statement for 'atomic read' must be an expression statement of form 'v = x;', where v and x are both lvalue expressions with scalar type}} |
67 | // expected-note@+1 {{expected built-in assignment operator}} |
68 | a = b; |
69 | |
70 | return a; |
71 | } |
72 | |
73 | int read() { |
74 | int a = 0, b = 0; |
75 | // Test for atomic read |
76 | #pragma omp atomic read |
77 | // expected-error@+2 {{the statement for 'atomic read' must be an expression statement of form 'v = x;', where v and x are both lvalue expressions with scalar type}} |
78 | // expected-note@+1 {{expected an expression statement}} |
79 | ; |
80 | #pragma omp atomic read |
81 | // expected-error@+2 {{the statement for 'atomic read' must be an expression statement of form 'v = x;', where v and x are both lvalue expressions with scalar type}} |
82 | // expected-note@+1 {{expected built-in assignment operator}} |
83 | foo(); |
84 | #pragma omp atomic read |
85 | // expected-error@+2 {{the statement for 'atomic read' must be an expression statement of form 'v = x;', where v and x are both lvalue expressions with scalar type}} |
86 | // expected-note@+1 {{expected built-in assignment operator}} |
87 | a += b; |
88 | #pragma omp atomic read |
89 | // expected-error@+2 {{the statement for 'atomic read' must be an expression statement of form 'v = x;', where v and x are both lvalue expressions with scalar type}} |
90 | // expected-note@+1 {{expected lvalue expression}} |
91 | a = 0; |
92 | #pragma omp atomic read |
93 | a = b; |
94 | // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'read' clause}} |
95 | #pragma omp atomic read read |
96 | a = b; |
97 | |
98 | // expected-note@+2 {{in instantiation of function template specialization 'read<S>' requested here}} |
99 | // expected-note@+1 {{in instantiation of function template specialization 'read<int>' requested here}} |
100 | return read<int>() + read<S>().a; |
101 | } |
102 | |
103 | template <class T> |
104 | T write() { |
105 | T a, b = 0; |
106 | // Test for atomic write |
107 | #pragma omp atomic write |
108 | // expected-error@+2 {{the statement for 'atomic write' must be an expression statement of form 'x = expr;', where x is a lvalue expression with scalar type}} |
109 | // expected-note@+1 {{expected an expression statement}} |
110 | ; |
111 | // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'write' clause}} |
112 | #pragma omp atomic write write |
113 | a = b; |
114 | #pragma omp atomic write |
115 | // expected-error@+2 {{the statement for 'atomic write' must be an expression statement of form 'x = expr;', where x is a lvalue expression with scalar type}} |
116 | // expected-note@+1 {{expected built-in assignment operator}} |
117 | foo(); |
118 | #pragma omp atomic write |
119 | // expected-error@+2 {{the statement for 'atomic write' must be an expression statement of form 'x = expr;', where x is a lvalue expression with scalar type}} |
120 | // expected-note@+1 {{expected built-in assignment operator}} |
121 | a += b; |
122 | #pragma omp atomic write |
123 | a = 0; |
124 | #pragma omp atomic write |
125 | a = b; |
126 | |
127 | return T(); |
128 | } |
129 | |
130 | int write() { |
131 | int a, b = 0; |
132 | // Test for atomic write |
133 | #pragma omp atomic write |
134 | // expected-error@+2 {{the statement for 'atomic write' must be an expression statement of form 'x = expr;', where x is a lvalue expression with scalar type}} |
135 | // expected-note@+1 {{expected an expression statement}} |
136 | ; |
137 | // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'write' clause}} |
138 | #pragma omp atomic write write |
139 | a = b; |
140 | #pragma omp atomic write |
141 | // expected-error@+2 {{the statement for 'atomic write' must be an expression statement of form 'x = expr;', where x is a lvalue expression with scalar type}} |
142 | // expected-note@+1 {{expected built-in assignment operator}} |
143 | foo(); |
144 | #pragma omp atomic write |
145 | // expected-error@+2 {{the statement for 'atomic write' must be an expression statement of form 'x = expr;', where x is a lvalue expression with scalar type}} |
146 | // expected-note@+1 {{expected built-in assignment operator}} |
147 | a += b; |
148 | #pragma omp atomic write |
149 | a = 0; |
150 | #pragma omp atomic write |
151 | a = foo(); |
152 | |
153 | // expected-note@+1 {{in instantiation of function template specialization 'write<int>' requested here}} |
154 | return write<int>(); |
155 | } |
156 | |
157 | template <class T> |
158 | T update() { |
159 | T a = 0, b = 0, c = 0; |
160 | // Test for atomic update |
161 | #pragma omp atomic update |
162 | // expected-error@+2 {{the statement for 'atomic update' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}} |
163 | // expected-note@+1 {{expected an expression statement}} |
164 | ; |
165 | // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'update' clause}} |
166 | #pragma omp atomic update update |
167 | a += b; |
168 | #pragma omp atomic |
169 | // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}} |
170 | // expected-note@+1 {{expected built-in binary operator}} |
171 | a = b; |
172 | #pragma omp atomic update |
173 | // expected-error@+2 {{the statement for 'atomic update' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}} |
174 | // expected-note@+1 {{expected one of '+', '*', '-', '/', '&', '^', '|', '<<', or '>>' built-in operations}} |
175 | a = b || a; |
176 | #pragma omp atomic update |
177 | // expected-error@+2 {{the statement for 'atomic update' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}} |
178 | // expected-note@+1 {{expected one of '+', '*', '-', '/', '&', '^', '|', '<<', or '>>' built-in operations}} |
179 | a = a && b; |
180 | #pragma omp atomic update |
181 | // expected-error@+2 {{the statement for 'atomic update' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}} |
182 | // expected-note@+1 {{expected in right hand side of expression}} |
183 | a = float(a) + b; |
184 | #pragma omp atomic |
185 | // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}} |
186 | // expected-note@+1 {{expected in right hand side of expression}} |
187 | a = 2 * b; |
188 | #pragma omp atomic |
189 | // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}} |
190 | // expected-note@+1 {{expected in right hand side of expression}} |
191 | a = b + *&a; |
192 | #pragma omp atomic |
193 | *&a = b * *&a; |
194 | #pragma omp atomic update |
195 | a++; |
196 | #pragma omp atomic |
197 | ++a; |
198 | #pragma omp atomic update |
199 | a--; |
200 | #pragma omp atomic |
201 | --a; |
202 | #pragma omp atomic update |
203 | a += b; |
204 | #pragma omp atomic |
205 | a %= b; |
206 | #pragma omp atomic update |
207 | a *= b; |
208 | #pragma omp atomic |
209 | a -= b; |
210 | #pragma omp atomic update |
211 | a /= b; |
212 | #pragma omp atomic |
213 | a &= b; |
214 | #pragma omp atomic update |
215 | a ^= b; |
216 | #pragma omp atomic |
217 | a |= b; |
218 | #pragma omp atomic update |
219 | a <<= b; |
220 | #pragma omp atomic |
221 | a >>= b; |
222 | #pragma omp atomic update |
223 | a = b + a; |
224 | #pragma omp atomic |
225 | a = a * b; |
226 | #pragma omp atomic update |
227 | a = b - a; |
228 | #pragma omp atomic |
229 | a = a / b; |
230 | #pragma omp atomic update |
231 | a = b & a; |
232 | #pragma omp atomic |
233 | a = a ^ b; |
234 | #pragma omp atomic update |
235 | a = b | a; |
236 | #pragma omp atomic |
237 | a = a << b; |
238 | #pragma omp atomic |
239 | a = b >> a; |
240 | |
241 | #pragma omp atomic |
242 | // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}} |
243 | // expected-note@+1 {{expected an expression statement}} |
244 | ; |
245 | |
246 | return T(); |
247 | } |
248 | |
249 | int update() { |
250 | int a, b = 0; |
251 | // Test for atomic update |
252 | #pragma omp atomic update |
253 | // expected-error@+2 {{the statement for 'atomic update' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}} |
254 | // expected-note@+1 {{expected an expression statement}} |
255 | ; |
256 | // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'update' clause}} |
257 | #pragma omp atomic update update |
258 | a += b; |
259 | #pragma omp atomic |
260 | // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}} |
261 | // expected-note@+1 {{expected built-in binary operator}} |
262 | a = b; |
263 | #pragma omp atomic update |
264 | // expected-error@+2 {{the statement for 'atomic update' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}} |
265 | // expected-note@+1 {{expected one of '+', '*', '-', '/', '&', '^', '|', '<<', or '>>' built-in operations}} |
266 | a = b || a; |
267 | #pragma omp atomic update |
268 | // expected-error@+2 {{the statement for 'atomic update' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}} |
269 | // expected-note@+1 {{expected one of '+', '*', '-', '/', '&', '^', '|', '<<', or '>>' built-in operations}} |
270 | a = a && b; |
271 | #pragma omp atomic update |
272 | // expected-error@+2 {{the statement for 'atomic update' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}} |
273 | // expected-note@+1 {{expected in right hand side of expression}} |
274 | a = float(a) + b; |
275 | #pragma omp atomic |
276 | // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}} |
277 | // expected-note@+1 {{expected in right hand side of expression}} |
278 | a = 2 * b; |
279 | #pragma omp atomic |
280 | // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}} |
281 | // expected-note@+1 {{expected in right hand side of expression}} |
282 | a = b + *&a; |
283 | #pragma omp atomic update |
284 | a++; |
285 | #pragma omp atomic |
286 | ++a; |
287 | #pragma omp atomic update |
288 | a--; |
289 | #pragma omp atomic |
290 | --a; |
291 | #pragma omp atomic update |
292 | a += b; |
293 | #pragma omp atomic |
294 | a %= b; |
295 | #pragma omp atomic update |
296 | a *= b; |
297 | #pragma omp atomic |
298 | a -= b; |
299 | #pragma omp atomic update |
300 | a /= b; |
301 | #pragma omp atomic |
302 | a &= b; |
303 | #pragma omp atomic update |
304 | a ^= b; |
305 | #pragma omp atomic |
306 | a |= b; |
307 | #pragma omp atomic update |
308 | a <<= b; |
309 | #pragma omp atomic |
310 | a >>= b; |
311 | #pragma omp atomic update |
312 | a = b + a; |
313 | #pragma omp atomic |
314 | a = a * b; |
315 | #pragma omp atomic update |
316 | a = b - a; |
317 | #pragma omp atomic |
318 | a = a / b; |
319 | #pragma omp atomic update |
320 | a = b & a; |
321 | #pragma omp atomic |
322 | a = a ^ b; |
323 | #pragma omp atomic update |
324 | a = b | a; |
325 | #pragma omp atomic |
326 | a = a << b; |
327 | #pragma omp atomic |
328 | a = b >> a; |
329 | #pragma omp atomic |
330 | // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}} |
331 | // expected-note@+1 {{expected an expression statement}} |
332 | ; |
333 | |
334 | return update<int>(); |
335 | } |
336 | |
337 | template <class T> |
338 | T capture() { |
339 | T a = 0, b = 0, c = 0; |
340 | // Test for atomic capture |
341 | #pragma omp atomic capture |
342 | // expected-error@+2 {{the statement for 'atomic capture' must be a compound statement of form '{v = x; x binop= expr;}', '{x binop= expr; v = x;}', '{v = x; x = x binop expr;}', '{v = x; x = expr binop x;}', '{x = x binop expr; v = x;}', '{x = expr binop x; v = x;}' or '{v = x; x = expr;}', '{v = x; x++;}', '{v = x; ++x;}', '{++x; v = x;}', '{x++; v = x;}', '{v = x; x--;}', '{v = x; --x;}', '{--x; v = x;}', '{x--; v = x;}' where x is an l-value expression with scalar type}} |
343 | // expected-note@+1 {{expected compound statement}} |
344 | ; |
345 | #pragma omp atomic capture |
346 | // expected-error@+2 {{the statement for 'atomic capture' must be an expression statement of form 'v = ++x;', 'v = --x;', 'v = x++;', 'v = x--;', 'v = x binop= expr;', 'v = x = x binop expr' or 'v = x = expr binop x', where x and v are both l-value expressions with scalar type}} |
347 | // expected-note@+1 {{expected assignment expression}} |
348 | foo(); |
349 | #pragma omp atomic capture |
350 | // expected-error@+2 {{the statement for 'atomic capture' must be an expression statement of form 'v = ++x;', 'v = --x;', 'v = x++;', 'v = x--;', 'v = x binop= expr;', 'v = x = x binop expr' or 'v = x = expr binop x', where x and v are both l-value expressions with scalar type}} |
351 | // expected-note@+1 {{expected built-in binary or unary operator}} |
352 | a = b; |
353 | #pragma omp atomic capture |
354 | // expected-error@+2 {{the statement for 'atomic capture' must be an expression statement of form 'v = ++x;', 'v = --x;', 'v = x++;', 'v = x--;', 'v = x binop= expr;', 'v = x = x binop expr' or 'v = x = expr binop x', where x and v are both l-value expressions with scalar type}} |
355 | // expected-note@+1 {{expected assignment expression}} |
356 | a = b || a; |
357 | #pragma omp atomic capture |
358 | // expected-error@+2 {{the statement for 'atomic capture' must be an expression statement of form 'v = ++x;', 'v = --x;', 'v = x++;', 'v = x--;', 'v = x binop= expr;', 'v = x = x binop expr' or 'v = x = expr binop x', where x and v are both l-value expressions with scalar type}} |
359 | // expected-note@+1 {{expected one of '+', '*', '-', '/', '&', '^', '|', '<<', or '>>' built-in operations}} |
360 | b = a = a && b; |
361 | #pragma omp atomic capture |
362 | // expected-error@+2 {{the statement for 'atomic capture' must be an expression statement of form 'v = ++x;', 'v = --x;', 'v = x++;', 'v = x--;', 'v = x binop= expr;', 'v = x = x binop expr' or 'v = x = expr binop x', where x and v are both l-value expressions with scalar type}} |
363 | // expected-note@+1 {{expected assignment expression}} |
364 | a = (float)a + b; |
365 | #pragma omp atomic capture |
366 | // expected-error@+2 {{the statement for 'atomic capture' must be an expression statement of form 'v = ++x;', 'v = --x;', 'v = x++;', 'v = x--;', 'v = x binop= expr;', 'v = x = x binop expr' or 'v = x = expr binop x', where x and v are both l-value expressions with scalar type}} |
367 | // expected-note@+1 {{expected assignment expression}} |
368 | a = 2 * b; |
369 | #pragma omp atomic capture |
370 | // expected-error@+2 {{the statement for 'atomic capture' must be an expression statement of form 'v = ++x;', 'v = --x;', 'v = x++;', 'v = x--;', 'v = x binop= expr;', 'v = x = x binop expr' or 'v = x = expr binop x', where x and v are both l-value expressions with scalar type}} |
371 | // expected-note@+1 {{expected assignment expression}} |
372 | a = b + *&a; |
373 | #pragma omp atomic capture |
374 | // expected-error@+2 {{the statement for 'atomic capture' must be a compound statement of form '{v = x; x binop= expr;}', '{x binop= expr; v = x;}', '{v = x; x = x binop expr;}', '{v = x; x = expr binop x;}', '{x = x binop expr; v = x;}', '{x = expr binop x; v = x;}' or '{v = x; x = expr;}', '{v = x; x++;}', '{v = x; ++x;}', '{++x; v = x;}', '{x++; v = x;}', '{v = x; x--;}', '{v = x; --x;}', '{--x; v = x;}', '{x--; v = x;}' where x is an l-value expression with scalar type}} |
375 | // expected-note@+1 {{expected exactly two expression statements}} |
376 | { a = b; } |
377 | #pragma omp atomic capture |
378 | // expected-error@+2 {{the statement for 'atomic capture' must be a compound statement of form '{v = x; x binop= expr;}', '{x binop= expr; v = x;}', '{v = x; x = x binop expr;}', '{v = x; x = expr binop x;}', '{x = x binop expr; v = x;}', '{x = expr binop x; v = x;}' or '{v = x; x = expr;}', '{v = x; x++;}', '{v = x; ++x;}', '{++x; v = x;}', '{x++; v = x;}', '{v = x; x--;}', '{v = x; --x;}', '{--x; v = x;}', '{x--; v = x;}' where x is an l-value expression with scalar type}} |
379 | // expected-note@+1 {{expected exactly two expression statements}} |
380 | {} |
381 | #pragma omp atomic capture |
382 | // expected-error@+2 {{the statement for 'atomic capture' must be a compound statement of form '{v = x; x binop= expr;}', '{x binop= expr; v = x;}', '{v = x; x = x binop expr;}', '{v = x; x = expr binop x;}', '{x = x binop expr; v = x;}', '{x = expr binop x; v = x;}' or '{v = x; x = expr;}', '{v = x; x++;}', '{v = x; ++x;}', '{++x; v = x;}', '{x++; v = x;}', '{v = x; x--;}', '{v = x; --x;}', '{--x; v = x;}', '{x--; v = x;}' where x is an l-value expression with scalar type}} |
383 | // expected-note@+1 {{expected in right hand side of the first expression}} |
384 | {a = b;a = b;} |
385 | #pragma omp atomic capture |
386 | // expected-error@+2 {{the statement for 'atomic capture' must be a compound statement of form '{v = x; x binop= expr;}', '{x binop= expr; v = x;}', '{v = x; x = x binop expr;}', '{v = x; x = expr binop x;}', '{x = x binop expr; v = x;}', '{x = expr binop x; v = x;}' or '{v = x; x = expr;}', '{v = x; x++;}', '{v = x; ++x;}', '{++x; v = x;}', '{x++; v = x;}', '{v = x; x--;}', '{v = x; --x;}', '{--x; v = x;}', '{x--; v = x;}' where x is an l-value expression with scalar type}} |
387 | // expected-note@+1 {{expected in right hand side of the first expression}} |
388 | {a = b; a = b || a;} |
389 | #pragma omp atomic capture |
390 | {b = a; a = a && b;} |
391 | #pragma omp atomic capture |
392 | // expected-error@+2 {{the statement for 'atomic capture' must be an expression statement of form 'v = ++x;', 'v = --x;', 'v = x++;', 'v = x--;', 'v = x binop= expr;', 'v = x = x binop expr' or 'v = x = expr binop x', where x and v are both l-value expressions with scalar type}} |
393 | // expected-note@+1 {{expected in right hand side of expression}} |
394 | b = a = (float)a + b; |
395 | #pragma omp atomic capture |
396 | // expected-error@+2 {{the statement for 'atomic capture' must be an expression statement of form 'v = ++x;', 'v = --x;', 'v = x++;', 'v = x--;', 'v = x binop= expr;', 'v = x = x binop expr' or 'v = x = expr binop x', where x and v are both l-value expressions with scalar type}} |
397 | // expected-note@+1 {{expected in right hand side of expression}} |
398 | b = a = 2 * b; |
399 | #pragma omp atomic capture |
400 | // expected-error@+2 {{the statement for 'atomic capture' must be an expression statement of form 'v = ++x;', 'v = --x;', 'v = x++;', 'v = x--;', 'v = x binop= expr;', 'v = x = x binop expr' or 'v = x = expr binop x', where x and v are both l-value expressions with scalar type}} |
401 | // expected-note@+1 {{expected in right hand side of expression}} |
402 | b = a = b + *&a; |
403 | #pragma omp atomic capture |
404 | c = *&a = *&a + 2; |
405 | #pragma omp atomic capture |
406 | c = a++; |
407 | #pragma omp atomic capture |
408 | c = ++a; |
409 | #pragma omp atomic capture |
410 | c = a--; |
411 | #pragma omp atomic capture |
412 | c = --a; |
413 | #pragma omp atomic capture |
414 | c = a += b; |
415 | #pragma omp atomic capture |
416 | c = a %= b; |
417 | #pragma omp atomic capture |
418 | c = a *= b; |
419 | #pragma omp atomic capture |
420 | c = a -= b; |
421 | #pragma omp atomic capture |
422 | c = a /= b; |
423 | #pragma omp atomic capture |
424 | c = a &= b; |
425 | #pragma omp atomic capture |
426 | c = a ^= b; |
427 | #pragma omp atomic capture |
428 | c = a |= b; |
429 | #pragma omp atomic capture |
430 | c = a <<= b; |
431 | #pragma omp atomic capture |
432 | c = a >>= b; |
433 | #pragma omp atomic capture |
434 | c = a = b + a; |
435 | #pragma omp atomic capture |
436 | c = a = a * b; |
437 | #pragma omp atomic capture |
438 | c = a = b - a; |
439 | #pragma omp atomic capture |
440 | c = a = a / b; |
441 | #pragma omp atomic capture |
442 | c = a = b & a; |
443 | #pragma omp atomic capture |
444 | c = a = a ^ b; |
445 | #pragma omp atomic capture |
446 | c = a = b | a; |
447 | #pragma omp atomic capture |
448 | c = a = a << b; |
449 | #pragma omp atomic capture |
450 | c = a = b >> a; |
451 | #pragma omp atomic capture |
452 | { c = *&a; *&a = *&a + 2;} |
453 | #pragma omp atomic capture |
454 | { *&a = *&a + 2; c = *&a;} |
455 | #pragma omp atomic capture |
456 | {c = a; a++;} |
457 | #pragma omp atomic capture |
458 | {c = a; (a)++;} |
459 | #pragma omp atomic capture |
460 | {++a;c = a;} |
461 | #pragma omp atomic capture |
462 | {c = a;a--;} |
463 | #pragma omp atomic capture |
464 | {--a;c = a;} |
465 | #pragma omp atomic capture |
466 | {c = a; a += b;} |
467 | #pragma omp atomic capture |
468 | {c = a; (a) += b;} |
469 | #pragma omp atomic capture |
470 | {a %= b; c = a;} |
471 | #pragma omp atomic capture |
472 | {c = a; a *= b;} |
473 | #pragma omp atomic capture |
474 | {a -= b;c = a;} |
475 | #pragma omp atomic capture |
476 | {c = a; a /= b;} |
477 | #pragma omp atomic capture |
478 | {a &= b; c = a;} |
479 | #pragma omp atomic capture |
480 | {c = a; a ^= b;} |
481 | #pragma omp atomic capture |
482 | {a |= b; c = a;} |
483 | #pragma omp atomic capture |
484 | {c = a; a <<= b;} |
485 | #pragma omp atomic capture |
486 | {a >>= b; c = a;} |
487 | #pragma omp atomic capture |
488 | {c = a; a = b + a;} |
489 | #pragma omp atomic capture |
490 | {a = a * b; c = a;} |
491 | #pragma omp atomic capture |
492 | {c = a; a = b - a;} |
493 | #pragma omp atomic capture |
494 | {a = a / b; c = a;} |
495 | #pragma omp atomic capture |
496 | {c = a; a = b & a;} |
497 | #pragma omp atomic capture |
498 | {a = a ^ b; c = a;} |
499 | #pragma omp atomic capture |
500 | {c = a; a = b | a;} |
501 | #pragma omp atomic capture |
502 | {a = a << b; c = a;} |
503 | #pragma omp atomic capture |
504 | {c = a; a = b >> a;} |
505 | #pragma omp atomic capture |
506 | {c = a; a = foo();} |
507 | // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'capture' clause}} |
508 | #pragma omp atomic capture capture |
509 | b = a /= b; |
510 | |
511 | return T(); |
512 | } |
513 | |
514 | int capture() { |
515 | int a = 0, b = 0, c = 0; |
516 | // Test for atomic capture |
517 | #pragma omp atomic capture |
518 | // expected-error@+2 {{the statement for 'atomic capture' must be a compound statement of form '{v = x; x binop= expr;}', '{x binop= expr; v = x;}', '{v = x; x = x binop expr;}', '{v = x; x = expr binop x;}', '{x = x binop expr; v = x;}', '{x = expr binop x; v = x;}' or '{v = x; x = expr;}', '{v = x; x++;}', '{v = x; ++x;}', '{++x; v = x;}', '{x++; v = x;}', '{v = x; x--;}', '{v = x; --x;}', '{--x; v = x;}', '{x--; v = x;}' where x is an l-value expression with scalar type}} |
519 | // expected-note@+1 {{expected compound statement}} |
520 | ; |
521 | #pragma omp atomic capture |
522 | // expected-error@+2 {{the statement for 'atomic capture' must be an expression statement of form 'v = ++x;', 'v = --x;', 'v = x++;', 'v = x--;', 'v = x binop= expr;', 'v = x = x binop expr' or 'v = x = expr binop x', where x and v are both l-value expressions with scalar type}} |
523 | // expected-note@+1 {{expected assignment expression}} |
524 | foo(); |
525 | #pragma omp atomic capture |
526 | // expected-error@+2 {{the statement for 'atomic capture' must be an expression statement of form 'v = ++x;', 'v = --x;', 'v = x++;', 'v = x--;', 'v = x binop= expr;', 'v = x = x binop expr' or 'v = x = expr binop x', where x and v are both l-value expressions with scalar type}} |
527 | // expected-note@+1 {{expected built-in binary or unary operator}} |
528 | a = b; |
529 | #pragma omp atomic capture |
530 | // expected-error@+2 {{the statement for 'atomic capture' must be an expression statement of form 'v = ++x;', 'v = --x;', 'v = x++;', 'v = x--;', 'v = x binop= expr;', 'v = x = x binop expr' or 'v = x = expr binop x', where x and v are both l-value expressions with scalar type}} |
531 | // expected-note@+1 {{expected assignment expression}} |
532 | a = b || a; |
533 | #pragma omp atomic capture |
534 | // expected-error@+2 {{the statement for 'atomic capture' must be an expression statement of form 'v = ++x;', 'v = --x;', 'v = x++;', 'v = x--;', 'v = x binop= expr;', 'v = x = x binop expr' or 'v = x = expr binop x', where x and v are both l-value expressions with scalar type}} |
535 | // expected-note@+1 {{expected one of '+', '*', '-', '/', '&', '^', '|', '<<', or '>>' built-in operations}} |
536 | b = a = a && b; |
537 | #pragma omp atomic capture |
538 | // expected-error@+2 {{the statement for 'atomic capture' must be an expression statement of form 'v = ++x;', 'v = --x;', 'v = x++;', 'v = x--;', 'v = x binop= expr;', 'v = x = x binop expr' or 'v = x = expr binop x', where x and v are both l-value expressions with scalar type}} |
539 | // expected-note@+1 {{expected assignment expression}} |
540 | a = (float)a + b; |
541 | #pragma omp atomic capture |
542 | // expected-error@+2 {{the statement for 'atomic capture' must be an expression statement of form 'v = ++x;', 'v = --x;', 'v = x++;', 'v = x--;', 'v = x binop= expr;', 'v = x = x binop expr' or 'v = x = expr binop x', where x and v are both l-value expressions with scalar type}} |
543 | // expected-note@+1 {{expected assignment expression}} |
544 | a = 2 * b; |
545 | #pragma omp atomic capture |
546 | // expected-error@+2 {{the statement for 'atomic capture' must be an expression statement of form 'v = ++x;', 'v = --x;', 'v = x++;', 'v = x--;', 'v = x binop= expr;', 'v = x = x binop expr' or 'v = x = expr binop x', where x and v are both l-value expressions with scalar type}} |
547 | // expected-note@+1 {{expected assignment expression}} |
548 | a = b + *&a; |
549 | #pragma omp atomic capture |
550 | // expected-error@+2 {{the statement for 'atomic capture' must be a compound statement of form '{v = x; x binop= expr;}', '{x binop= expr; v = x;}', '{v = x; x = x binop expr;}', '{v = x; x = expr binop x;}', '{x = x binop expr; v = x;}', '{x = expr binop x; v = x;}' or '{v = x; x = expr;}', '{v = x; x++;}', '{v = x; ++x;}', '{++x; v = x;}', '{x++; v = x;}', '{v = x; x--;}', '{v = x; --x;}', '{--x; v = x;}', '{x--; v = x;}' where x is an l-value expression with scalar type}} |
551 | // expected-note@+1 {{expected exactly two expression statements}} |
552 | { a = b; } |
553 | #pragma omp atomic capture |
554 | // expected-error@+2 {{the statement for 'atomic capture' must be a compound statement of form '{v = x; x binop= expr;}', '{x binop= expr; v = x;}', '{v = x; x = x binop expr;}', '{v = x; x = expr binop x;}', '{x = x binop expr; v = x;}', '{x = expr binop x; v = x;}' or '{v = x; x = expr;}', '{v = x; x++;}', '{v = x; ++x;}', '{++x; v = x;}', '{x++; v = x;}', '{v = x; x--;}', '{v = x; --x;}', '{--x; v = x;}', '{x--; v = x;}' where x is an l-value expression with scalar type}} |
555 | // expected-note@+1 {{expected exactly two expression statements}} |
556 | {} |
557 | #pragma omp atomic capture |
558 | // expected-error@+2 {{the statement for 'atomic capture' must be a compound statement of form '{v = x; x binop= expr;}', '{x binop= expr; v = x;}', '{v = x; x = x binop expr;}', '{v = x; x = expr binop x;}', '{x = x binop expr; v = x;}', '{x = expr binop x; v = x;}' or '{v = x; x = expr;}', '{v = x; x++;}', '{v = x; ++x;}', '{++x; v = x;}', '{x++; v = x;}', '{v = x; x--;}', '{v = x; --x;}', '{--x; v = x;}', '{x--; v = x;}' where x is an l-value expression with scalar type}} |
559 | // expected-note@+1 {{expected in right hand side of the first expression}} |
560 | {a = b;a = b;} |
561 | #pragma omp atomic capture |
562 | // expected-error@+2 {{the statement for 'atomic capture' must be a compound statement of form '{v = x; x binop= expr;}', '{x binop= expr; v = x;}', '{v = x; x = x binop expr;}', '{v = x; x = expr binop x;}', '{x = x binop expr; v = x;}', '{x = expr binop x; v = x;}' or '{v = x; x = expr;}', '{v = x; x++;}', '{v = x; ++x;}', '{++x; v = x;}', '{x++; v = x;}', '{v = x; x--;}', '{v = x; --x;}', '{--x; v = x;}', '{x--; v = x;}' where x is an l-value expression with scalar type}} |
563 | // expected-note@+1 {{expected in right hand side of the first expression}} |
564 | {a = b; a = b || a;} |
565 | #pragma omp atomic capture |
566 | {b = a; a = a && b;} |
567 | #pragma omp atomic capture |
568 | // expected-error@+2 {{the statement for 'atomic capture' must be an expression statement of form 'v = ++x;', 'v = --x;', 'v = x++;', 'v = x--;', 'v = x binop= expr;', 'v = x = x binop expr' or 'v = x = expr binop x', where x and v are both l-value expressions with scalar type}} |
569 | // expected-note@+1 {{expected in right hand side of expression}} |
570 | b = a = (float)a + b; |
571 | #pragma omp atomic capture |
572 | // expected-error@+2 {{the statement for 'atomic capture' must be an expression statement of form 'v = ++x;', 'v = --x;', 'v = x++;', 'v = x--;', 'v = x binop= expr;', 'v = x = x binop expr' or 'v = x = expr binop x', where x and v are both l-value expressions with scalar type}} |
573 | // expected-note@+1 {{expected in right hand side of expression}} |
574 | b = a = 2 * b; |
575 | #pragma omp atomic capture |
576 | // expected-error@+2 {{the statement for 'atomic capture' must be an expression statement of form 'v = ++x;', 'v = --x;', 'v = x++;', 'v = x--;', 'v = x binop= expr;', 'v = x = x binop expr' or 'v = x = expr binop x', where x and v are both l-value expressions with scalar type}} |
577 | // expected-note@+1 {{expected in right hand side of expression}} |
578 | b = a = b + *&a; |
579 | #pragma omp atomic capture |
580 | c = *&a = *&a + 2; |
581 | #pragma omp atomic capture |
582 | c = a++; |
583 | #pragma omp atomic capture |
584 | c = ++a; |
585 | #pragma omp atomic capture |
586 | c = a--; |
587 | #pragma omp atomic capture |
588 | c = --a; |
589 | #pragma omp atomic capture |
590 | c = a += b; |
591 | #pragma omp atomic capture |
592 | c = a %= b; |
593 | #pragma omp atomic capture |
594 | c = a *= b; |
595 | #pragma omp atomic capture |
596 | c = a -= b; |
597 | #pragma omp atomic capture |
598 | c = a /= b; |
599 | #pragma omp atomic capture |
600 | c = a &= b; |
601 | #pragma omp atomic capture |
602 | c = a ^= b; |
603 | #pragma omp atomic capture |
604 | c = a |= b; |
605 | #pragma omp atomic capture |
606 | c = a <<= b; |
607 | #pragma omp atomic capture |
608 | c = a >>= b; |
609 | #pragma omp atomic capture |
610 | c = a = b + a; |
611 | #pragma omp atomic capture |
612 | c = a = a * b; |
613 | #pragma omp atomic capture |
614 | c = a = b - a; |
615 | #pragma omp atomic capture |
616 | c = a = a / b; |
617 | #pragma omp atomic capture |
618 | c = a = b & a; |
619 | #pragma omp atomic capture |
620 | c = a = a ^ b; |
621 | #pragma omp atomic capture |
622 | c = a = b | a; |
623 | #pragma omp atomic capture |
624 | c = a = a << b; |
625 | #pragma omp atomic capture |
626 | c = a = b >> a; |
627 | #pragma omp atomic capture |
628 | { c = *&a; *&a = *&a + 2;} |
629 | #pragma omp atomic capture |
630 | { *&a = *&a + 2; c = *&a;} |
631 | #pragma omp atomic capture |
632 | {c = a; a++;} |
633 | #pragma omp atomic capture |
634 | {++a;c = a;} |
635 | #pragma omp atomic capture |
636 | {c = a;a--;} |
637 | #pragma omp atomic capture |
638 | {--a;c = a;} |
639 | #pragma omp atomic capture |
640 | {c = a; a += b;} |
641 | #pragma omp atomic capture |
642 | {a %= b; c = a;} |
643 | #pragma omp atomic capture |
644 | {c = a; a *= b;} |
645 | #pragma omp atomic capture |
646 | {a -= b;c = a;} |
647 | #pragma omp atomic capture |
648 | {c = a; a /= b;} |
649 | #pragma omp atomic capture |
650 | {a &= b; c = a;} |
651 | #pragma omp atomic capture |
652 | {c = a; a ^= b;} |
653 | #pragma omp atomic capture |
654 | {a |= b; c = a;} |
655 | #pragma omp atomic capture |
656 | {c = a; a <<= b;} |
657 | #pragma omp atomic capture |
658 | {a >>= b; c = a;} |
659 | #pragma omp atomic capture |
660 | {c = a; a = b + a;} |
661 | #pragma omp atomic capture |
662 | {a = a * b; c = a;} |
663 | #pragma omp atomic capture |
664 | {c = a; a = b - a;} |
665 | #pragma omp atomic capture |
666 | {a = a / b; c = a;} |
667 | #pragma omp atomic capture |
668 | {c = a; a = b & a;} |
669 | #pragma omp atomic capture |
670 | {a = a ^ b; c = a;} |
671 | #pragma omp atomic capture |
672 | {c = a; a = b | a;} |
673 | #pragma omp atomic capture |
674 | {a = a << b; c = a;} |
675 | #pragma omp atomic capture |
676 | {c = a; a = b >> a;} |
677 | #pragma omp atomic capture |
678 | {c = a; a = foo();} |
679 | // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'capture' clause}} |
680 | #pragma omp atomic capture capture |
681 | b = a /= b; |
682 | |
683 | // expected-note@+1 {{in instantiation of function template specialization 'capture<int>' requested here}} |
684 | return capture<int>(); |
685 | } |
686 | |
687 | template <class T> |
688 | T seq_cst() { |
689 | T a, b = 0; |
690 | // Test for atomic seq_cst |
691 | #pragma omp atomic seq_cst |
692 | // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}} |
693 | // expected-note@+1 {{expected an expression statement}} |
694 | ; |
695 | // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'seq_cst' clause}} |
696 | #pragma omp atomic seq_cst seq_cst |
697 | a += b; |
698 | |
699 | #pragma omp atomic update seq_cst |
700 | // expected-error@+2 {{the statement for 'atomic update' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}} |
701 | // expected-note@+1 {{expected an expression statement}} |
702 | ; |
703 | |
704 | return T(); |
705 | } |
706 | |
707 | int seq_cst() { |
708 | int a, b = 0; |
709 | // Test for atomic seq_cst |
710 | #pragma omp atomic seq_cst |
711 | // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}} |
712 | // expected-note@+1 {{expected an expression statement}} |
713 | ; |
714 | // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'seq_cst' clause}} |
715 | #pragma omp atomic seq_cst seq_cst |
716 | a += b; |
717 | |
718 | #pragma omp atomic update seq_cst |
719 | // expected-error@+2 {{the statement for 'atomic update' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}} |
720 | // expected-note@+1 {{expected an expression statement}} |
721 | ; |
722 | |
723 | return seq_cst<int>(); |
724 | } |
725 | |
726 | template <class T> |
727 | T mixed() { |
728 | T a, b = T(); |
729 | // expected-error@+2 2 {{directive '#pragma omp atomic' cannot contain more than one 'read', 'write', 'update' or 'capture' clause}} |
730 | // expected-note@+1 2 {{'read' clause used here}} |
731 | #pragma omp atomic read write |
732 | a = b; |
733 | // expected-error@+2 2 {{directive '#pragma omp atomic' cannot contain more than one 'read', 'write', 'update' or 'capture' clause}} |
734 | // expected-note@+1 2 {{'write' clause used here}} |
735 | #pragma omp atomic write read |
736 | a = b; |
737 | // expected-error@+2 2 {{directive '#pragma omp atomic' cannot contain more than one 'read', 'write', 'update' or 'capture' clause}} |
738 | // expected-note@+1 2 {{'update' clause used here}} |
739 | #pragma omp atomic update read |
740 | a += b; |
741 | // expected-error@+2 2 {{directive '#pragma omp atomic' cannot contain more than one 'read', 'write', 'update' or 'capture' clause}} |
742 | // expected-note@+1 2 {{'capture' clause used here}} |
743 | #pragma omp atomic capture read |
744 | a = ++b; |
745 | return T(); |
746 | } |
747 | |
748 | int mixed() { |
749 | int a, b = 0; |
750 | // expected-error@+2 {{directive '#pragma omp atomic' cannot contain more than one 'read', 'write', 'update' or 'capture' clause}} |
751 | // expected-note@+1 {{'read' clause used here}} |
752 | #pragma omp atomic read write |
753 | a = b; |
754 | // expected-error@+2 {{directive '#pragma omp atomic' cannot contain more than one 'read', 'write', 'update' or 'capture' clause}} |
755 | // expected-note@+1 {{'write' clause used here}} |
756 | #pragma omp atomic write read |
757 | a = b; |
758 | // expected-error@+2 {{directive '#pragma omp atomic' cannot contain more than one 'read', 'write', 'update' or 'capture' clause}} |
759 | // expected-note@+1 {{'write' clause used here}} |
760 | #pragma omp atomic write update |
761 | a = b; |
762 | // expected-error@+2 {{directive '#pragma omp atomic' cannot contain more than one 'read', 'write', 'update' or 'capture' clause}} |
763 | // expected-note@+1 {{'write' clause used here}} |
764 | #pragma omp atomic write capture |
765 | a = b; |
766 | // expected-note@+1 {{in instantiation of function template specialization 'mixed<int>' requested here}} |
767 | return mixed<int>(); |
768 | } |
769 | |
770 | |