1 // RUN: %clang_cc1 -verify=expected,omp45 -fopenmp -fopenmp-version=45 -ferror-limit 150 %s -Wuninitialized 2 // RUN: %clang_cc1 -verify=expected,omp50 -fopenmp -fopenmp-version=50 -ferror-limit 150 %s -Wuninitialized 3 // RUN: %clang_cc1 -DOMP51 -verify=expected,omp50,omp51 -fopenmp -ferror-limit 150 %s -Wuninitialized 4 5 // RUN: %clang_cc1 -verify=expected,omp45 -fopenmp-simd -fopenmp-version=45 -ferror-limit 150 %s -Wuninitialized 6 // RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-simd -fopenmp-version=50 -ferror-limit 150 %s -Wuninitialized 7 // RUN: %clang_cc1 -DOMP51 -verify=expected,omp50,omp51 -fopenmp-simd -ferror-limit 150 %s -Wuninitialized 8 9 int foo() { 10 L1: 11 foo(); 12 #pragma omp atomic 13 // 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 lvalue expression with scalar type}} 14 // expected-note@+1 {{expected an expression statement}} 15 { 16 foo(); 17 goto L1; 18 } 19 goto L2; 20 #pragma omp atomic 21 // 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 lvalue expression with scalar type}} 22 // expected-note@+1 {{expected an expression statement}} 23 { 24 foo(); 25 L2: 26 foo(); 27 } 28 29 return 0; 30 } 31 32 struct S { 33 int a; 34 S &operator=(int v) { 35 a = v; 36 return *this; 37 } 38 S &operator+=(const S &s) { 39 a += s.a; 40 return *this; 41 } 42 }; 43 44 template <class T> 45 T read() { 46 T a = T(), b = T(); 47 // Test for atomic read 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 an expression statement}} 51 ; 52 #pragma omp atomic read 53 // 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}} 54 // expected-note@+1 {{expected built-in assignment operator}} 55 foo(); 56 #pragma omp atomic read 57 // 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}} 58 // expected-note@+1 2 {{expected built-in assignment operator}} 59 a += b; 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 lvalue expression}} 63 a = 0; 64 #pragma omp atomic read 65 // 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}} 66 // expected-note@+1 {{expected built-in assignment operator}} 67 a = b; 68 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'read' clause}} 69 #pragma omp atomic read read 70 // 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}} 71 // expected-note@+1 {{expected built-in assignment operator}} 72 a = b; 73 74 return a; 75 } 76 77 int read() { 78 int a = 0, b = 0; 79 // Test for atomic read 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 an expression statement}} 83 ; 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 foo(); 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 built-in assignment operator}} 91 a += b; 92 #pragma omp atomic read 93 // 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}} 94 // expected-note@+1 {{expected lvalue expression}} 95 a = 0; 96 #pragma omp atomic read 97 a = b; 98 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'read' clause}} 99 #pragma omp atomic read read 100 a = b; 101 102 // expected-note@+2 {{in instantiation of function template specialization 'read<S>' requested here}} 103 // expected-note@+1 {{in instantiation of function template specialization 'read<int>' requested here}} 104 return read<int>() + read<S>().a; 105 } 106 107 template <class T> 108 T write() { 109 T a, b = 0; 110 // Test for atomic write 111 #pragma omp atomic write 112 // 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}} 113 // expected-note@+1 {{expected an expression statement}} 114 ; 115 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'write' clause}} 116 #pragma omp atomic write write 117 a = b; 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 foo(); 122 #pragma omp atomic write 123 // 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}} 124 // expected-note@+1 {{expected built-in assignment operator}} 125 a += b; 126 #pragma omp atomic write 127 a = 0; 128 #pragma omp atomic write 129 a = b; 130 131 return T(); 132 } 133 134 int write() { 135 int a, b = 0; 136 // Test for atomic write 137 #pragma omp atomic write 138 // 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}} 139 // expected-note@+1 {{expected an expression statement}} 140 ; 141 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'write' clause}} 142 #pragma omp atomic write write 143 a = b; 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 foo(); 148 #pragma omp atomic write 149 // 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}} 150 // expected-note@+1 {{expected built-in assignment operator}} 151 a += b; 152 #pragma omp atomic write 153 a = 0; 154 #pragma omp atomic write 155 a = foo(); 156 157 // expected-note@+1 {{in instantiation of function template specialization 'write<int>' requested here}} 158 return write<int>(); 159 } 160 161 template <class T> 162 T update() { 163 T a = 0, b = 0, c = 0; 164 // Test for atomic update 165 #pragma omp atomic update 166 // 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 lvalue expression with scalar type}} 167 // expected-note@+1 {{expected an expression statement}} 168 ; 169 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'update' clause}} 170 #pragma omp atomic update update 171 a += b; 172 #pragma omp atomic 173 // 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 lvalue expression with scalar type}} 174 // expected-note@+1 {{expected built-in binary operator}} 175 a = b; 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 lvalue expression with scalar type}} 178 // expected-note@+1 {{expected one of '+', '*', '-', '/', '&', '^', '|', '<<', or '>>' built-in operations}} 179 a = b || a; 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 lvalue expression with scalar type}} 182 // expected-note@+1 {{expected one of '+', '*', '-', '/', '&', '^', '|', '<<', or '>>' built-in operations}} 183 a = a && b; 184 #pragma omp atomic update 185 // 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 lvalue expression with scalar type}} 186 // expected-note@+1 {{expected in right hand side of expression}} 187 a = float(a) + 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 lvalue expression with scalar type}} 190 // expected-note@+1 {{expected in right hand side of expression}} 191 a = 2 * b; 192 #pragma omp atomic 193 // 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 lvalue expression with scalar type}} 194 // expected-note@+1 {{expected in right hand side of expression}} 195 a = b + *&a; 196 #pragma omp atomic 197 *&a = b * *&a; 198 #pragma omp atomic update 199 a++; 200 #pragma omp atomic 201 ++a; 202 #pragma omp atomic update 203 a--; 204 #pragma omp atomic 205 --a; 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; 224 #pragma omp atomic 225 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 update 239 a = b | a; 240 #pragma omp atomic 241 a = a << b; 242 #pragma omp atomic 243 a = b >> a; 244 245 #pragma omp atomic 246 // 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 lvalue expression with scalar type}} 247 // expected-note@+1 {{expected an expression statement}} 248 ; 249 250 return T(); 251 } 252 253 int update() { 254 int a, b = 0; 255 // Test for atomic update 256 #pragma omp atomic update 257 // 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 lvalue expression with scalar type}} 258 // expected-note@+1 {{expected an expression statement}} 259 ; 260 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'update' clause}} 261 #pragma omp atomic update update 262 a += b; 263 #pragma omp atomic 264 // 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 lvalue expression with scalar type}} 265 // expected-note@+1 {{expected built-in binary operator}} 266 a = b; 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 lvalue expression with scalar type}} 269 // expected-note@+1 {{expected one of '+', '*', '-', '/', '&', '^', '|', '<<', or '>>' built-in operations}} 270 a = b || a; 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 lvalue expression with scalar type}} 273 // expected-note@+1 {{expected one of '+', '*', '-', '/', '&', '^', '|', '<<', or '>>' built-in operations}} 274 a = a && b; 275 #pragma omp atomic update 276 // 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 lvalue expression with scalar type}} 277 // expected-note@+1 {{expected in right hand side of expression}} 278 a = float(a) + 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 lvalue expression with scalar type}} 281 // expected-note@+1 {{expected in right hand side of expression}} 282 a = 2 * b; 283 #pragma omp atomic 284 // 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 lvalue expression with scalar type}} 285 // expected-note@+1 {{expected in right hand side of expression}} 286 a = b + *&a; 287 #pragma omp atomic update 288 a++; 289 #pragma omp atomic 290 ++a; 291 #pragma omp atomic update 292 a--; 293 #pragma omp atomic 294 --a; 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; 313 #pragma omp atomic 314 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 update 328 a = b | a; 329 #pragma omp atomic 330 a = a << b; 331 #pragma omp atomic 332 a = b >> a; 333 #pragma omp atomic 334 // 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 lvalue expression with scalar type}} 335 // expected-note@+1 {{expected an expression statement}} 336 ; 337 338 return update<int>(); 339 } 340 341 template <class T> 342 T capture() { 343 T a = 0, b = 0, c = 0; 344 // Test for atomic capture 345 #pragma omp atomic capture 346 // 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 lvalue expression with scalar type}} 347 // expected-note@+1 {{expected compound statement}} 348 ; 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 lvalue expressions with scalar type}} 351 // expected-note@+1 {{expected assignment expression}} 352 foo(); 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 lvalue expressions with scalar type}} 355 // expected-note@+1 {{expected built-in binary or unary operator}} 356 a = b; 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 lvalue expressions with scalar type}} 359 // expected-note@+1 {{expected assignment expression}} 360 a = b || a; 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 lvalue expressions with scalar type}} 363 // expected-note@+1 {{expected one of '+', '*', '-', '/', '&', '^', '|', '<<', or '>>' built-in operations}} 364 b = a = 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 lvalue expressions with scalar type}} 367 // expected-note@+1 {{expected assignment expression}} 368 a = (float)a + 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 lvalue expressions with scalar type}} 371 // expected-note@+1 {{expected assignment expression}} 372 a = 2 * b; 373 #pragma omp atomic capture 374 // 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 lvalue expressions with scalar type}} 375 // expected-note@+1 {{expected assignment expression}} 376 a = b + *&a; 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 lvalue expression with scalar type}} 379 // expected-note@+1 {{expected exactly two expression statements}} 380 { a = b; } 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 lvalue expression with scalar type}} 383 // expected-note@+1 {{expected exactly two expression statements}} 384 {} 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 lvalue expression with scalar type}} 387 // expected-note@+1 {{expected in right hand side of the first expression}} 388 {a = b;a = b;} 389 #pragma omp atomic capture 390 // 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 lvalue expression with scalar type}} 391 // expected-note@+1 {{expected in right hand side of the first expression}} 392 {a = b; a = b || a;} 393 #pragma omp atomic capture 394 {b = a; a = 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 lvalue expressions with scalar type}} 397 // expected-note@+1 {{expected in right hand side of expression}} 398 b = a = (float)a + 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 lvalue expressions with scalar type}} 401 // expected-note@+1 {{expected in right hand side of expression}} 402 b = a = 2 * b; 403 #pragma omp atomic capture 404 // 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 lvalue expressions with scalar type}} 405 // expected-note@+1 {{expected in right hand side of expression}} 406 b = a = b + *&a; 407 #pragma omp atomic capture 408 c = *&a = *&a + 2; 409 #pragma omp atomic capture 410 c = a++; 411 #pragma omp atomic capture 412 c = ++a; 413 #pragma omp atomic capture 414 c = a--; 415 #pragma omp atomic capture 416 c = --a; 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; 435 #pragma omp atomic capture 436 c = 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 << b; 453 #pragma omp atomic capture 454 c = a = b >> a; 455 #pragma omp atomic capture 456 { c = *&a; *&a = *&a + 2;} 457 #pragma omp atomic capture 458 { *&a = *&a + 2; c = *&a;} 459 #pragma omp atomic capture 460 {c = a; 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--;} 467 #pragma omp atomic capture 468 {--a;c = a;} 469 #pragma omp atomic capture 470 {c = a; a += b;} 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;} 489 #pragma omp atomic capture 490 {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 {a = a << b; c = a;} 507 #pragma omp atomic capture 508 {c = a; a = b >> a;} 509 #pragma omp atomic capture 510 {c = a; a = foo();} 511 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'capture' clause}} 512 #pragma omp atomic capture capture 513 b = a /= b; 514 515 return T(); 516 } 517 518 int capture() { 519 int a = 0, b = 0, c = 0; 520 // Test for atomic capture 521 #pragma omp atomic capture 522 // 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 lvalue expression with scalar type}} 523 // expected-note@+1 {{expected compound statement}} 524 ; 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 lvalue expressions with scalar type}} 527 // expected-note@+1 {{expected assignment expression}} 528 foo(); 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 lvalue expressions with scalar type}} 531 // expected-note@+1 {{expected built-in binary or unary operator}} 532 a = b; 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 lvalue expressions with scalar type}} 535 // expected-note@+1 {{expected assignment expression}} 536 a = b || a; 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 lvalue expressions with scalar type}} 539 // expected-note@+1 {{expected one of '+', '*', '-', '/', '&', '^', '|', '<<', or '>>' built-in operations}} 540 b = a = 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 lvalue expressions with scalar type}} 543 // expected-note@+1 {{expected assignment expression}} 544 a = (float)a + 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 lvalue expressions with scalar type}} 547 // expected-note@+1 {{expected assignment expression}} 548 a = 2 * b; 549 #pragma omp atomic capture 550 // 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 lvalue expressions with scalar type}} 551 // expected-note@+1 {{expected assignment expression}} 552 a = b + *&a; 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 lvalue expression with scalar type}} 555 // expected-note@+1 {{expected exactly two expression statements}} 556 { a = b; } 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 lvalue expression with scalar type}} 559 // expected-note@+1 {{expected exactly two expression statements}} 560 {} 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 lvalue expression with scalar type}} 563 // expected-note@+1 {{expected in right hand side of the first expression}} 564 {a = b;a = b;} 565 #pragma omp atomic capture 566 // 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 lvalue expression with scalar type}} 567 // expected-note@+1 {{expected in right hand side of the first expression}} 568 {a = b; a = b || a;} 569 #pragma omp atomic capture 570 {b = a; a = 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 lvalue expressions with scalar type}} 573 // expected-note@+1 {{expected in right hand side of expression}} 574 b = a = (float)a + 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 lvalue expressions with scalar type}} 577 // expected-note@+1 {{expected in right hand side of expression}} 578 b = a = 2 * b; 579 #pragma omp atomic capture 580 // 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 lvalue expressions with scalar type}} 581 // expected-note@+1 {{expected in right hand side of expression}} 582 b = a = b + *&a; 583 #pragma omp atomic capture 584 c = *&a = *&a + 2; 585 #pragma omp atomic capture 586 c = a++; 587 #pragma omp atomic capture 588 c = ++a; 589 #pragma omp atomic capture 590 c = a--; 591 #pragma omp atomic capture 592 c = --a; 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; 611 #pragma omp atomic capture 612 c = 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 << b; 629 #pragma omp atomic capture 630 c = a = b >> a; 631 #pragma omp atomic capture 632 { c = *&a; *&a = *&a + 2;} 633 #pragma omp atomic capture 634 { *&a = *&a + 2; 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--;} 641 #pragma omp atomic capture 642 {--a;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;} 661 #pragma omp atomic capture 662 {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 {a = a << b; c = a;} 679 #pragma omp atomic capture 680 {c = a; a = b >> a;} 681 #pragma omp atomic capture 682 {c = a; a = foo();} 683 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'capture' clause}} 684 #pragma omp atomic capture capture 685 b = a /= b; 686 687 // expected-note@+1 {{in instantiation of function template specialization 'capture<int>' requested here}} 688 return capture<int>(); 689 } 690 691 template <class T> 692 T seq_cst() { 693 T a, b = 0; 694 // Test for atomic seq_cst 695 #pragma omp atomic seq_cst 696 // 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 lvalue expression with scalar type}} 697 // expected-note@+1 {{expected an expression statement}} 698 ; 699 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'seq_cst' clause}} 700 #pragma omp atomic seq_cst seq_cst 701 a += b; 702 703 #pragma omp atomic update seq_cst 704 // 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 lvalue expression with scalar type}} 705 // expected-note@+1 {{expected an expression statement}} 706 ; 707 708 return T(); 709 } 710 711 int seq_cst() { 712 int a, b = 0; 713 // Test for atomic seq_cst 714 #pragma omp atomic seq_cst 715 // 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 lvalue expression with scalar type}} 716 // expected-note@+1 {{expected an expression statement}} 717 ; 718 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'seq_cst' clause}} 719 #pragma omp atomic seq_cst seq_cst 720 a += b; 721 722 #pragma omp atomic update seq_cst 723 // 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 lvalue expression with scalar type}} 724 // expected-note@+1 {{expected an expression statement}} 725 ; 726 727 return seq_cst<int>(); 728 } 729 730 template <class T> 731 T acq_rel() { 732 T a = 0, b = 0; 733 // omp45-error@+1 {{unexpected OpenMP clause 'acq_rel' in directive '#pragma omp atomic'}} omp50-error@+1 {{directive '#pragma omp atomic' cannot be used with 'acq_rel' clause}} omp50-note@+1 {{'acq_rel' clause used here}} 734 #pragma omp atomic acq_rel 735 // 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 lvalue expression with scalar type}} 736 // expected-note@+1 {{expected an expression statement}} 737 ; 738 // omp50-error@+1 2 {{directive '#pragma omp atomic' cannot contain more than one 'seq_cst', 'relaxed', 'acq_rel', 'acquire' or 'release' clause}} omp50-note@+1 2 {{'acq_rel' clause used here}} omp45-error@+1 {{unexpected OpenMP clause 'acq_rel' in directive '#pragma omp atomic'}} omp50-error@+1 2 {{directive '#pragma omp atomic read' cannot be used with 'acq_rel' clause}} omp50-note@+1 2 {{'acq_rel' clause used here}} 739 #pragma omp atomic read acq_rel seq_cst 740 a = b; 741 742 // omp45-error@+1 {{unexpected OpenMP clause 'acq_rel' in directive '#pragma omp atomic'}} omp50-error@+1 {{directive '#pragma omp atomic update' cannot be used with 'acq_rel' clause}} omp50-note@+1 {{'acq_rel' clause used here}} 743 #pragma omp atomic update acq_rel 744 // 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 lvalue expression with scalar type}} 745 // expected-note@+1 {{expected an expression statement}} 746 ; 747 748 return T(); 749 } 750 751 int acq_rel() { 752 int a = 0, b = 0; 753 // Test for atomic acq_rel 754 // omp45-error@+1 {{unexpected OpenMP clause 'acq_rel' in directive '#pragma omp atomic'}} omp50-error@+1 {{directive '#pragma omp atomic write' cannot be used with 'acq_rel' clause}} omp50-note@+1 {{'acq_rel' clause used here}} 755 #pragma omp atomic acq_rel write 756 // 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}} 757 // expected-note@+1 {{expected an expression statement}} 758 ; 759 // omp50-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'seq_cst', 'relaxed', 'acq_rel', 'acquire' or 'release' clause}} omp50-note@+1 {{'seq_cst' clause used here}} omp45-error@+1 {{unexpected OpenMP clause 'acq_rel' in directive '#pragma omp atomic'}} 760 #pragma omp atomic seq_cst acq_rel 761 a += b; 762 763 // omp45-error@+1 {{unexpected OpenMP clause 'acq_rel' in directive '#pragma omp atomic'}} omp50-error@+1 {{directive '#pragma omp atomic update' cannot be used with 'acq_rel' clause}} omp50-note@+1 {{'acq_rel' clause used here}} 764 #pragma omp atomic update acq_rel 765 // 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 lvalue expression with scalar type}} 766 // expected-note@+1 {{expected an expression statement}} 767 ; 768 769 return acq_rel<int>(); // omp50-note {{in instantiation of function template specialization 'acq_rel<int>' requested here}} 770 } 771 772 template <class T> 773 T acquire() { 774 T a = 0, b = 0; 775 // omp45-error@+1 {{unexpected OpenMP clause 'acquire' in directive '#pragma omp atomic'}} omp50-error@+1 {{directive '#pragma omp atomic' cannot be used with 'acquire' clause}} omp50-note@+1 {{'acquire' clause used here}} 776 #pragma omp atomic acquire 777 // 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 lvalue expression with scalar type}} 778 // expected-note@+1 {{expected an expression statement}} 779 ; 780 // omp50-error@+1 2 {{directive '#pragma omp atomic' cannot contain more than one 'seq_cst', 'relaxed', 'acq_rel', 'acquire' or 'release' clause}} omp50-note@+1 2 {{'acquire' clause used here}} omp45-error@+1 {{unexpected OpenMP clause 'acquire' in directive '#pragma omp atomic'}} omp50-error@+1 2 {{directive '#pragma omp atomic' cannot be used with 'acquire' clause}} omp50-note@+1 2 {{'acquire' clause used here}} 781 #pragma omp atomic acquire seq_cst 782 a += b; 783 784 // omp45-error@+1 {{unexpected OpenMP clause 'acquire' in directive '#pragma omp atomic'}} omp50-error@+1 {{directive '#pragma omp atomic update' cannot be used with 'acquire' clause}} omp50-note@+1 {{'acquire' clause used here}} 785 #pragma omp atomic update acquire 786 // 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 lvalue expression with scalar type}} 787 // expected-note@+1 {{expected an expression statement}} 788 ; 789 790 return T(); 791 } 792 793 int acquire() { 794 int a = 0, b = 0; 795 // Test for atomic acquire 796 // omp45-error@+1 {{unexpected OpenMP clause 'acquire' in directive '#pragma omp atomic'}} omp50-error@+1 {{directive '#pragma omp atomic write' cannot be used with 'acquire' clause}} omp50-note@+1 {{'acquire' clause used here}} 797 #pragma omp atomic write acquire 798 // 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}} 799 // expected-note@+1 {{expected an expression statement}} 800 ; 801 // omp50-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'seq_cst', 'relaxed', 'acq_rel', 'acquire' or 'release' clause}} omp50-note@+1 {{'seq_cst' clause used here}} omp45-error@+1 {{unexpected OpenMP clause 'acquire' in directive '#pragma omp atomic'}} 802 #pragma omp atomic seq_cst acquire 803 a += b; 804 805 // omp45-error@+1 {{unexpected OpenMP clause 'acquire' in directive '#pragma omp atomic'}} omp50-error@+1 {{directive '#pragma omp atomic update' cannot be used with 'acquire' clause}} omp50-note@+1 {{'acquire' clause used here}} 806 #pragma omp atomic update acquire 807 // 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 lvalue expression with scalar type}} 808 // expected-note@+1 {{expected an expression statement}} 809 ; 810 811 return acquire<int>(); // omp50-note {{in instantiation of function template specialization 'acquire<int>' requested here}} 812 } 813 814 template <class T> 815 T release() { 816 T a = 0, b = 0; 817 // omp45-error@+1 {{unexpected OpenMP clause 'release' in directive '#pragma omp atomic'}} 818 #pragma omp atomic release 819 // 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 lvalue expression with scalar type}} 820 // expected-note@+1 {{expected an expression statement}} 821 ; 822 // omp50-error@+1 2 {{directive '#pragma omp atomic' cannot contain more than one 'seq_cst', 'relaxed', 'acq_rel', 'acquire' or 'release' clause}} omp50-note@+1 2 {{'release' clause used here}} omp45-error@+1 {{unexpected OpenMP clause 'release' in directive '#pragma omp atomic'}} 823 #pragma omp atomic release seq_cst 824 a += b; 825 826 // omp45-error@+1 {{unexpected OpenMP clause 'release' in directive '#pragma omp atomic'}} 827 #pragma omp atomic update release 828 // 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 lvalue expression with scalar type}} 829 // expected-note@+1 {{expected an expression statement}} 830 ; 831 832 return T(); 833 } 834 835 int release() { 836 int a = 0, b = 0; 837 // Test for atomic release 838 // omp45-error@+1 {{unexpected OpenMP clause 'release' in directive '#pragma omp atomic'}} omp50-error@+1 {{directive '#pragma omp atomic read' cannot be used with 'release' clause}} omp50-note@+1 {{'release' clause used here}} 839 #pragma omp atomic read release 840 // 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}} 841 // expected-note@+1 {{expected an expression statement}} 842 ; 843 // omp50-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'seq_cst', 'relaxed', 'acq_rel', 'acquire' or 'release' clause}} omp50-note@+1 {{'seq_cst' clause used here}} omp45-error@+1 {{unexpected OpenMP clause 'release' in directive '#pragma omp atomic'}} 844 #pragma omp atomic seq_cst release 845 a += b; 846 847 // omp45-error@+1 {{unexpected OpenMP clause 'release' in directive '#pragma omp atomic'}} 848 #pragma omp atomic update release 849 // 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 lvalue expression with scalar type}} 850 // expected-note@+1 {{expected an expression statement}} 851 ; 852 853 return release<int>(); // omp50-note {{in instantiation of function template specialization 'release<int>' requested here}} 854 } 855 856 template <class T> 857 T relaxed() { 858 T a = 0, b = 0; 859 // omp45-error@+1 {{unexpected OpenMP clause 'relaxed' in directive '#pragma omp atomic'}} 860 #pragma omp atomic relaxed 861 // 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 lvalue expression with scalar type}} 862 // expected-note@+1 {{expected an expression statement}} 863 ; 864 // omp50-error@+1 2 {{directive '#pragma omp atomic' cannot contain more than one 'seq_cst', 'relaxed', 'acq_rel', 'acquire' or 'release' clause}} omp50-note@+1 2 {{'relaxed' clause used here}} omp45-error@+1 {{unexpected OpenMP clause 'relaxed' in directive '#pragma omp atomic'}} 865 #pragma omp atomic relaxed seq_cst 866 a += b; 867 868 // omp45-error@+1 {{unexpected OpenMP clause 'relaxed' in directive '#pragma omp atomic'}} 869 #pragma omp atomic update relaxed 870 // 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 lvalue expression with scalar type}} 871 // expected-note@+1 {{expected an expression statement}} 872 ; 873 874 return T(); 875 } 876 877 int relaxed() { 878 int a = 0, b = 0; 879 // Test for atomic relaxed 880 // omp45-error@+1 {{unexpected OpenMP clause 'relaxed' in directive '#pragma omp atomic'}} 881 #pragma omp atomic read relaxed 882 // 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}} 883 // expected-note@+1 {{expected an expression statement}} 884 ; 885 // omp50-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'seq_cst', 'relaxed', 'acq_rel', 'acquire' or 'release' clause}} omp50-note@+1 {{'seq_cst' clause used here}} omp45-error@+1 {{unexpected OpenMP clause 'relaxed' in directive '#pragma omp atomic'}} 886 #pragma omp atomic seq_cst relaxed 887 a += b; 888 889 // omp45-error@+1 {{unexpected OpenMP clause 'relaxed' in directive '#pragma omp atomic'}} 890 #pragma omp atomic update relaxed 891 // 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 lvalue expression with scalar type}} 892 // expected-note@+1 {{expected an expression statement}} 893 ; 894 895 return relaxed<int>(); // omp50-note {{in instantiation of function template specialization 'relaxed<int>' requested here}} 896 } 897 898 template <class T> 899 T mixed() { 900 T a, b = T(); 901 // expected-error@+2 2 {{directive '#pragma omp atomic' cannot contain more than one 'read', 'write', 'update', 'capture', or 'compare' clause}} 902 // expected-note@+1 2 {{'read' clause used here}} 903 #pragma omp atomic read write 904 a = b; 905 // expected-error@+2 2 {{directive '#pragma omp atomic' cannot contain more than one 'read', 'write', 'update', 'capture', or 'compare' clause}} 906 // expected-note@+1 2 {{'write' clause used here}} 907 #pragma omp atomic write read 908 a = b; 909 // expected-error@+2 2 {{directive '#pragma omp atomic' cannot contain more than one 'read', 'write', 'update', 'capture', or 'compare' clause}} 910 // expected-note@+1 2 {{'update' clause used here}} 911 #pragma omp atomic update read 912 a += b; 913 // expected-error@+2 2 {{directive '#pragma omp atomic' cannot contain more than one 'read', 'write', 'update', 'capture', or 'compare' clause}} 914 // expected-note@+1 2 {{'capture' clause used here}} 915 #pragma omp atomic capture read 916 a = ++b; 917 #ifdef OMP51 918 // expected-error@+2 2 {{directive '#pragma omp atomic' cannot contain more than one 'read', 'write', 'update', 'capture', or 'compare' clause}} 919 // expected-note@+1 2 {{'write' clause used here}} 920 #pragma omp atomic write compare 921 a = b; 922 // expected-error@+2 2 {{directive '#pragma omp atomic' cannot contain more than one 'read', 'write', 'update', 'capture', or 'compare' clause}} 923 // expected-note@+1 2 {{'read' clause used here}} 924 #pragma omp atomic read compare 925 a = b; 926 #endif 927 return T(); 928 } 929 930 int mixed() { 931 int a, v, b = 0; 932 // expected-error@+2 {{directive '#pragma omp atomic' cannot contain more than one 'read', 'write', 'update', 'capture', or 'compare' clause}} 933 // expected-note@+1 {{'read' clause used here}} 934 #pragma omp atomic read write 935 a = b; 936 // expected-error@+2 {{directive '#pragma omp atomic' cannot contain more than one 'read', 'write', 'update', 'capture', or 'compare' clause}} 937 // expected-note@+1 {{'write' clause used here}} 938 #pragma omp atomic write read 939 a = b; 940 // expected-error@+2 {{directive '#pragma omp atomic' cannot contain more than one 'read', 'write', 'update', 'capture', or 'compare' clause}} 941 // expected-note@+1 {{'write' clause used here}} 942 #pragma omp atomic write update 943 a = b; 944 // expected-error@+2 {{directive '#pragma omp atomic' cannot contain more than one 'read', 'write', 'update', 'capture', or 'compare' clause}} 945 // expected-note@+1 {{'write' clause used here}} 946 #pragma omp atomic write capture 947 a = b; 948 #ifdef OMP51 949 // expected-error@+2 {{directive '#pragma omp atomic' cannot contain more than one 'read', 'write', 'update', 'capture', or 'compare' clause}} 950 // expected-note@+1 {{'write' clause used here}} 951 #pragma omp atomic write compare 952 a = b; 953 // expected-error@+2 {{directive '#pragma omp atomic' cannot contain more than one 'read', 'write', 'update', 'capture', or 'compare' clause}} 954 // expected-note@+1 {{'read' clause used here}} 955 #pragma omp atomic read compare 956 a = b; 957 // expected-error@+2 {{directive '#pragma omp atomic' cannot contain more than one 'compare' clause}} 958 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'capture' clause}} 959 #pragma omp atomic compare compare capture capture 960 { v = a; if (a > b) a = b; } 961 // expected-error@+1 {{expected 'compare' clause with the 'fail' modifier}} 962 #pragma omp atomic fail(seq_cst) 963 if(v == a) { v = a; } 964 // expected-error@+1 {{expected '(' after 'fail'}} 965 #pragma omp atomic compare fail 966 if(v < a) { v = a; } 967 // expected-error@+1 {{expected a memory order clause}} 968 #pragma omp atomic compare fail(capture) 969 if(v < a) { v = a; } 970 // expected-error@+2 {{expected ')'}} 971 // expected-note@+1 {{to match this '('}} 972 #pragma omp atomic compare fail(seq_cst | acquire) 973 if(v < a) { v = a; } 974 // expected-error@+1 {{directive '#pragma omp atomic' cannot contain more than one 'fail' clause}} 975 #pragma omp atomic compare fail(relaxed) fail(seq_cst) 976 if(v < a) { v = a; } 977 978 979 #endif 980 // expected-note@+1 {{in instantiation of function template specialization 'mixed<int>' requested here}} 981 return mixed<int>(); 982 } 983