1 // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s
3 // RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 %s
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}}
13 goto L1; // expected-error {{use of undeclared label 'L1'}}
15 goto L2; // expected-error {{use of undeclared label 'L2'}}
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}}
34 // Test for atomic read
35 #pragma omp atomic read
36 // 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}}
37 // expected-note@+1 {{expected an expression statement}}
39 #pragma omp atomic read
40 // 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}}
41 // expected-note@+1 {{expected built-in assignment operator}}
43 #pragma omp atomic read
44 // 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}}
45 // expected-note@+1 {{expected built-in assignment operator}}
47 #pragma omp atomic read
48 // 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}}
49 // expected-note@+1 {{expected lvalue expression}}
51 #pragma omp atomic read
53 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'read' clause}}
54 #pragma omp atomic read read
62 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'read' clause}}
63 #pragma omp atomic read read
64 // 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}}
65 // expected-note@+1 {{expected expression of scalar type}}
73 // Test for atomic write
74 #pragma omp atomic write
75 // 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}}
76 // expected-note@+1 {{expected an expression statement}}
78 #pragma omp atomic write
79 // 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}}
80 // expected-note@+1 {{expected built-in assignment operator}}
82 #pragma omp atomic write
83 // 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}}
84 // expected-note@+1 {{expected built-in assignment operator}}
86 #pragma omp atomic write
88 #pragma omp atomic write
90 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'write' clause}}
91 #pragma omp atomic write write
99 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'write' clause}}
100 #pragma omp atomic write write
101 // 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}}
102 // expected-note@+1 {{expected expression of scalar type}}
110 // Test for atomic update
111 #pragma omp atomic update
112 // 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}}
113 // expected-note@+1 {{expected an expression statement}}
116 // 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}}
117 // expected-note@+1 {{expected built-in binary or unary operator}}
120 // 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}}
121 // expected-note@+1 {{expected built-in binary operator}}
123 #pragma omp atomic update
124 // 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}}
125 // expected-note@+1 {{expected one of '+', '*', '-', '/', '&', '^', '|', '<<', or '>>' built-in operations}}
127 #pragma omp atomic update
128 // 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}}
129 // expected-note@+1 {{expected one of '+', '*', '-', '/', '&', '^', '|', '<<', or '>>' built-in operations}}
131 #pragma omp atomic update
132 // 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}}
133 // expected-note@+1 {{expected in right hand side of expression}}
136 // 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}}
137 // expected-note@+1 {{expected in right hand side of expression}}
140 // 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}}
141 // expected-note@+1 {{expected in right hand side of expression}}
143 #pragma omp atomic update
145 #pragma omp atomic update
149 #pragma omp atomic update
153 #pragma omp atomic update
157 #pragma omp atomic update
161 #pragma omp atomic update
165 #pragma omp atomic update
169 #pragma omp atomic update
173 #pragma omp atomic update
177 #pragma omp atomic update
181 #pragma omp atomic update
185 #pragma omp atomic update
191 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'update' clause}}
192 #pragma omp atomic update update
199 int a = 0, b = 0, c = 0;
200 // Test for atomic capture
201 #pragma omp atomic capture
202 // 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}}
203 // expected-note@+1 {{expected compound statement}}
205 #pragma omp atomic capture
206 // 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}}
207 // expected-note@+1 {{expected assignment expression}}
209 #pragma omp atomic capture
210 // 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}}
211 // expected-note@+1 {{expected built-in binary or unary operator}}
213 #pragma omp atomic capture
214 // 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}}
215 // expected-note@+1 {{expected assignment expression}}
217 #pragma omp atomic capture
218 // 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}}
219 // expected-note@+1 {{expected one of '+', '*', '-', '/', '&', '^', '|', '<<', or '>>' built-in operations}}
221 #pragma omp atomic capture
222 // 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}}
223 // expected-note@+1 {{expected assignment expression}}
225 #pragma omp atomic capture
226 // 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}}
227 // expected-note@+1 {{expected assignment expression}}
229 #pragma omp atomic capture
230 // 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}}
231 // expected-note@+1 {{expected assignment expression}}
233 #pragma omp atomic capture
234 // 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}}
235 // expected-note@+1 {{expected exactly two expression statements}}
237 #pragma omp atomic capture
238 // 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}}
239 // expected-note@+1 {{expected exactly two expression statements}}
241 #pragma omp atomic capture
242 // 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}}
243 // expected-note@+1 {{expected in right hand side of the first expression}}
245 #pragma omp atomic capture
246 // 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}}
247 // expected-note@+1 {{expected in right hand side of the first expression}}
249 #pragma omp atomic capture
251 #pragma omp atomic capture
252 // 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}}
253 // expected-note@+1 {{expected in right hand side of expression}}
254 b = a = (float)a + b;
255 #pragma omp atomic capture
256 // 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}}
257 // expected-note@+1 {{expected in right hand side of expression}}
259 #pragma omp atomic capture
260 // 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}}
261 // expected-note@+1 {{expected in right hand side of expression}}
263 #pragma omp atomic capture
265 #pragma omp atomic capture
267 #pragma omp atomic capture
269 #pragma omp atomic capture
271 #pragma omp atomic capture
273 #pragma omp atomic capture
275 #pragma omp atomic capture
277 #pragma omp atomic capture
279 #pragma omp atomic capture
281 #pragma omp atomic capture
283 #pragma omp atomic capture
285 #pragma omp atomic capture
287 #pragma omp atomic capture
289 #pragma omp atomic capture
291 #pragma omp atomic capture
293 #pragma omp atomic capture
295 #pragma omp atomic capture
297 #pragma omp atomic capture
299 #pragma omp atomic capture
301 #pragma omp atomic capture
303 #pragma omp atomic capture
305 #pragma omp atomic capture
307 #pragma omp atomic capture
309 #pragma omp atomic capture
311 #pragma omp atomic capture
312 { c = *&a; *&a = *&a + 2;}
313 #pragma omp atomic capture
314 { *&a = *&a + 2; c = *&a;}
315 #pragma omp atomic capture
317 #pragma omp atomic capture
319 #pragma omp atomic capture
321 #pragma omp atomic capture
323 #pragma omp atomic capture
325 #pragma omp atomic capture
327 #pragma omp atomic capture
329 #pragma omp atomic capture
331 #pragma omp atomic capture
333 #pragma omp atomic capture
335 #pragma omp atomic capture
337 #pragma omp atomic capture
339 #pragma omp atomic capture
341 #pragma omp atomic capture
343 #pragma omp atomic capture
345 #pragma omp atomic capture
347 #pragma omp atomic capture
349 #pragma omp atomic capture
351 #pragma omp atomic capture
353 #pragma omp atomic capture
355 #pragma omp atomic capture
357 #pragma omp atomic capture
359 #pragma omp atomic capture
361 #pragma omp atomic capture
363 #pragma omp atomic capture
365 #pragma omp atomic capture
367 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'capture' clause}}
368 #pragma omp atomic capture capture