blob: 1234e8580c02c9e15af092887e135594e05a8914 [file] [log] [blame]
Alexey Bataevdb390212015-05-20 04:24:19 +00001// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s
Alexey Bataev62cec442014-11-18 10:14:22 +00002
Alexey Bataeva8a9153a2017-12-29 18:07:07 +00003// RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 %s
4
Alexey Bataev62cec442014-11-18 10:14:22 +00005int foo() {
6L1:
7 foo();
8#pragma omp atomic
Alexey Bataev1d160b12015-03-13 12:27:31 +00009 // 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}}
Alexey Bataev62cec442014-11-18 10:14:22 +000011 {
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
Alexey Bataev1d160b12015-03-13 12:27:31 +000017 // 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}}
Alexey Bataev62cec442014-11-18 10:14:22 +000019 {
20 foo();
21 L2:
22 foo();
23 }
24
25 return 0;
26}
27
28struct S {
29 int a;
30};
31
32int readint() {
33 int a = 0, b = 0;
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}}
38 ;
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}}
42 foo();
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}}
46 a += b;
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}}
50 a = 0;
51#pragma omp atomic read
52 a = b;
53 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'read' clause}}
54#pragma omp atomic read read
55 a = b;
56
57 return 0;
58}
59
60int readS() {
61 struct S a, b;
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}}
66 a = b;
67
68 return a.a;
69}
Alexey Bataevf33eba62014-11-28 07:21:40 +000070
71int writeint() {
72 int a = 0, b = 0;
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}}
77 ;
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}}
81 foo();
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}}
85 a += b;
86#pragma omp atomic write
87 a = 0;
88#pragma omp atomic write
89 a = b;
90 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'write' clause}}
91#pragma omp atomic write write
92 a = b;
93
94 return 0;
95}
96
97int writeS() {
98 struct S a, b;
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}}
103 a = b;
104
105 return a.a;
106}
Alexey Bataev1d160b12015-03-13 12:27:31 +0000107
108int updateint() {
109 int a = 0, b = 0;
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}}
114 ;
115#pragma omp atomic
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}}
118 foo();
119#pragma omp atomic
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}}
122 a = b;
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}}
126 a = b || a;
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}}
130 a = a && b;
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}}
134 a = (float)a + b;
135#pragma omp atomic
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}}
138 a = 2 * b;
139#pragma omp atomic
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}}
142 a = b + *&a;
143#pragma omp atomic update
144 *&a = *&a + 2;
145#pragma omp atomic update
146 a++;
147#pragma omp atomic
148 ++a;
149#pragma omp atomic update
150 a--;
151#pragma omp atomic
152 --a;
153#pragma omp atomic update
154 a += b;
155#pragma omp atomic
156 a %= b;
157#pragma omp atomic update
158 a *= b;
159#pragma omp atomic
160 a -= b;
161#pragma omp atomic update
162 a /= b;
163#pragma omp atomic
164 a &= b;
165#pragma omp atomic update
166 a ^= b;
167#pragma omp atomic
168 a |= b;
169#pragma omp atomic update
170 a <<= b;
171#pragma omp atomic
172 a >>= b;
173#pragma omp atomic update
174 a = b + a;
175#pragma omp atomic
176 a = a * b;
177#pragma omp atomic update
178 a = b - a;
179#pragma omp atomic
180 a = a / b;
181#pragma omp atomic update
182 a = b & a;
183#pragma omp atomic
184 a = a ^ b;
185#pragma omp atomic update
186 a = b | a;
187#pragma omp atomic
188 a = a << b;
189#pragma omp atomic
190 a = b >> a;
191 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'update' clause}}
192#pragma omp atomic update update
193 a /= b;
194
195 return 0;
196}
197
Alexey Bataevb78ca832015-04-01 03:33:17 +0000198int captureint() {
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}}
204 ;
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}}
208 foo();
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}}
212 a = b;
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}}
216 a = b || a;
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}}
220 b = a = a && b;
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}}
224 a = (float)a + b;
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}}
228 a = 2 * b;
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}}
232 a = b + *&a;
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}}
236 { a = b; }
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}}
240 {}
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}}
244 {a = b;a = b;}
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}}
248 {a = b; a = b || a;}
249#pragma omp atomic capture
250 {b = a; a = a && b;}
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}}
258 b = a = 2 * b;
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}}
262 b = a = b + *&a;
263#pragma omp atomic capture
264 c = *&a = *&a + 2;
265#pragma omp atomic capture
266 c = a++;
267#pragma omp atomic capture
268 c = ++a;
269#pragma omp atomic capture
270 c = a--;
271#pragma omp atomic capture
272 c = --a;
273#pragma omp atomic capture
274 c = a += b;
275#pragma omp atomic capture
276 c = a %= b;
277#pragma omp atomic capture
278 c = a *= b;
279#pragma omp atomic capture
280 c = a -= b;
281#pragma omp atomic capture
282 c = a /= b;
283#pragma omp atomic capture
284 c = a &= b;
285#pragma omp atomic capture
286 c = a ^= b;
287#pragma omp atomic capture
288 c = a |= b;
289#pragma omp atomic capture
290 c = a <<= b;
291#pragma omp atomic capture
292 c = a >>= b;
293#pragma omp atomic capture
294 c = a = b + a;
295#pragma omp atomic capture
296 c = a = a * b;
297#pragma omp atomic capture
298 c = a = b - a;
299#pragma omp atomic capture
300 c = a = a / b;
301#pragma omp atomic capture
302 c = a = b & a;
303#pragma omp atomic capture
304 c = a = a ^ b;
305#pragma omp atomic capture
306 c = a = b | a;
307#pragma omp atomic capture
308 c = a = a << b;
309#pragma omp atomic capture
310 c = a = b >> a;
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
316 {c = a; a++;}
317#pragma omp atomic capture
Kelvin Li4f161cf2016-07-20 19:41:17 +0000318 {c = a; (a)++;}
319#pragma omp atomic capture
Alexey Bataevb78ca832015-04-01 03:33:17 +0000320 {++a;c = a;}
321#pragma omp atomic capture
322 {c = a;a--;}
323#pragma omp atomic capture
324 {--a;c = a;}
325#pragma omp atomic capture
326 {c = a; a += b;}
327#pragma omp atomic capture
Kelvin Li4f161cf2016-07-20 19:41:17 +0000328 {c = a; (a) += b;}
329#pragma omp atomic capture
Alexey Bataevb78ca832015-04-01 03:33:17 +0000330 {a %= b; c = a;}
331#pragma omp atomic capture
332 {c = a; a *= b;}
333#pragma omp atomic capture
334 {a -= b;c = a;}
335#pragma omp atomic capture
336 {c = a; a /= b;}
337#pragma omp atomic capture
338 {a &= b; c = a;}
339#pragma omp atomic capture
340 {c = a; a ^= b;}
341#pragma omp atomic capture
342 {a |= b; c = a;}
343#pragma omp atomic capture
344 {c = a; a <<= b;}
345#pragma omp atomic capture
346 {a >>= b; c = a;}
347#pragma omp atomic capture
348 {c = a; a = b + a;}
349#pragma omp atomic capture
350 {a = a * b; c = a;}
351#pragma omp atomic capture
352 {c = a; a = b - a;}
353#pragma omp atomic capture
354 {a = a / b; c = a;}
355#pragma omp atomic capture
356 {c = a; a = b & a;}
357#pragma omp atomic capture
358 {a = a ^ b; c = a;}
359#pragma omp atomic capture
360 {c = a; a = b | a;}
361#pragma omp atomic capture
362 {a = a << b; c = a;}
363#pragma omp atomic capture
364 {c = a; a = b >> a;}
365#pragma omp atomic capture
366 {c = a; a = foo();}
367 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'capture' clause}}
368#pragma omp atomic capture capture
369 b = a /= b;
370
371 return 0;
372}
373