1 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -ast-print %s | FileCheck %s 2 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s 3 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s 4 5 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 -ast-print %s | FileCheck %s 6 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s 7 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s 8 // expected-no-diagnostics 9 10 #ifndef HEADER 11 #define HEADER 12 13 template <class T> 14 T foo(T argc) { 15 T b = T(); 16 T a = T(); 17 #pragma omp atomic 18 a++; 19 #pragma omp atomic read 20 a = argc; 21 #pragma omp atomic write 22 a = argc + argc; 23 #pragma omp atomic update 24 a = a + argc; 25 #pragma omp atomic capture 26 a = b++; 27 #pragma omp atomic capture 28 { 29 a = b; 30 b++; 31 } 32 #pragma omp atomic seq_cst 33 a++; 34 #pragma omp atomic read seq_cst 35 a = argc; 36 #pragma omp atomic seq_cst write 37 a = argc + argc; 38 #pragma omp atomic update seq_cst 39 a = a + argc; 40 #pragma omp atomic seq_cst capture 41 a = b++; 42 #pragma omp atomic capture seq_cst 43 { 44 a = b; 45 b++; 46 } 47 #pragma omp atomic 48 a++; 49 #pragma omp atomic read 50 a = argc; 51 #pragma omp atomic write 52 a = argc + argc; 53 #pragma omp atomic update 54 a = a + argc; 55 #pragma omp atomic acq_rel capture 56 a = b++; 57 #pragma omp atomic capture acq_rel 58 { 59 a = b; 60 b++; 61 } 62 #pragma omp atomic 63 a++; 64 #pragma omp atomic read acquire 65 a = argc; 66 #pragma omp atomic write 67 a = argc + argc; 68 #pragma omp atomic update 69 a = a + argc; 70 #pragma omp atomic acquire capture 71 a = b++; 72 #pragma omp atomic capture acquire 73 { 74 a = b; 75 b++; 76 } 77 #pragma omp atomic release 78 a++; 79 #pragma omp atomic read 80 a = argc; 81 #pragma omp atomic release write 82 a = argc + argc; 83 #pragma omp atomic update release 84 a = a + argc; 85 #pragma omp atomic release capture 86 a = b++; 87 #pragma omp atomic capture release 88 { 89 a = b; 90 b++; 91 } 92 #pragma omp atomic relaxed 93 a++; 94 #pragma omp atomic read 95 a = argc; 96 #pragma omp atomic relaxed write 97 a = argc + argc; 98 #pragma omp atomic update relaxed 99 a = a + argc; 100 #pragma omp atomic relaxed capture 101 a = b++; 102 #pragma omp atomic capture relaxed 103 { 104 a = b; 105 b++; 106 } 107 return T(); 108 } 109 110 // CHECK: T a = T(); 111 // CHECK-NEXT: #pragma omp atomic{{$}} 112 // CHECK-NEXT: a++; 113 // CHECK-NEXT: #pragma omp atomic read 114 // CHECK-NEXT: a = argc; 115 // CHECK-NEXT: #pragma omp atomic write 116 // CHECK-NEXT: a = argc + argc; 117 // CHECK-NEXT: #pragma omp atomic update 118 // CHECK-NEXT: a = a + argc; 119 // CHECK-NEXT: #pragma omp atomic capture 120 // CHECK-NEXT: a = b++; 121 // CHECK-NEXT: #pragma omp atomic capture 122 // CHECK-NEXT: { 123 // CHECK-NEXT: a = b; 124 // CHECK-NEXT: b++; 125 // CHECK-NEXT: } 126 // CHECK-NEXT: #pragma omp atomic seq_cst 127 // CHECK-NEXT: a++; 128 // CHECK-NEXT: #pragma omp atomic read seq_cst 129 // CHECK-NEXT: a = argc; 130 // CHECK-NEXT: #pragma omp atomic seq_cst write 131 // CHECK-NEXT: a = argc + argc; 132 // CHECK-NEXT: #pragma omp atomic update seq_cst 133 // CHECK-NEXT: a = a + argc; 134 // CHECK-NEXT: #pragma omp atomic seq_cst capture 135 // CHECK-NEXT: a = b++; 136 // CHECK-NEXT: #pragma omp atomic capture seq_cst 137 // CHECK-NEXT: { 138 // CHECK-NEXT: a = b; 139 // CHECK-NEXT: b++; 140 // CHECK-NEXT: } 141 // CHECK-NEXT: #pragma omp atomic 142 // CHECK-NEXT: a++; 143 // CHECK-NEXT: #pragma omp atomic read 144 // CHECK-NEXT: a = argc; 145 // CHECK-NEXT: #pragma omp atomic write 146 // CHECK-NEXT: a = argc + argc; 147 // CHECK-NEXT: #pragma omp atomic update 148 // CHECK-NEXT: a = a + argc; 149 // CHECK-NEXT: #pragma omp atomic acq_rel capture 150 // CHECK-NEXT: a = b++; 151 // CHECK-NEXT: #pragma omp atomic capture acq_rel 152 // CHECK-NEXT: { 153 // CHECK-NEXT: a = b; 154 // CHECK-NEXT: b++; 155 // CHECK-NEXT: } 156 // CHECK-NEXT: #pragma omp atomic 157 // CHECK-NEXT: a++; 158 // CHECK-NEXT: #pragma omp atomic read acquire 159 // CHECK-NEXT: a = argc; 160 // CHECK-NEXT: #pragma omp atomic write 161 // CHECK-NEXT: a = argc + argc; 162 // CHECK-NEXT: #pragma omp atomic update 163 // CHECK-NEXT: a = a + argc; 164 // CHECK-NEXT: #pragma omp atomic acquire capture 165 // CHECK-NEXT: a = b++; 166 // CHECK-NEXT: #pragma omp atomic capture acquire 167 // CHECK-NEXT: { 168 // CHECK-NEXT: a = b; 169 // CHECK-NEXT: b++; 170 // CHECK-NEXT: } 171 // CHECK-NEXT: #pragma omp atomic release 172 // CHECK-NEXT: a++; 173 // CHECK-NEXT: #pragma omp atomic read 174 // CHECK-NEXT: a = argc; 175 // CHECK-NEXT: #pragma omp atomic release write 176 // CHECK-NEXT: a = argc + argc; 177 // CHECK-NEXT: #pragma omp atomic update release 178 // CHECK-NEXT: a = a + argc; 179 // CHECK-NEXT: #pragma omp atomic release capture 180 // CHECK-NEXT: a = b++; 181 // CHECK-NEXT: #pragma omp atomic capture release 182 // CHECK-NEXT: { 183 // CHECK-NEXT: a = b; 184 // CHECK-NEXT: b++; 185 // CHECK-NEXT: } 186 // CHECK-NEXT: #pragma omp atomic relaxed 187 // CHECK-NEXT: a++; 188 // CHECK-NEXT: #pragma omp atomic read 189 // CHECK-NEXT: a = argc; 190 // CHECK-NEXT: #pragma omp atomic relaxed write 191 // CHECK-NEXT: a = argc + argc; 192 // CHECK-NEXT: #pragma omp atomic update relaxed 193 // CHECK-NEXT: a = a + argc; 194 // CHECK-NEXT: #pragma omp atomic relaxed capture 195 // CHECK-NEXT: a = b++; 196 // CHECK-NEXT: #pragma omp atomic capture relaxed 197 // CHECK-NEXT: { 198 // CHECK-NEXT: a = b; 199 // CHECK-NEXT: b++; 200 // CHECK-NEXT: } 201 // CHECK: int a = int(); 202 // CHECK-NEXT: #pragma omp atomic 203 // CHECK-NEXT: a++; 204 // CHECK-NEXT: #pragma omp atomic read 205 // CHECK-NEXT: a = argc; 206 // CHECK-NEXT: #pragma omp atomic write 207 // CHECK-NEXT: a = argc + argc; 208 // CHECK-NEXT: #pragma omp atomic update 209 // CHECK-NEXT: a = a + argc; 210 // CHECK-NEXT: #pragma omp atomic capture 211 // CHECK-NEXT: a = b++; 212 // CHECK-NEXT: #pragma omp atomic capture 213 // CHECK-NEXT: { 214 // CHECK-NEXT: a = b; 215 // CHECK-NEXT: b++; 216 // CHECK-NEXT: } 217 // CHECK-NEXT: #pragma omp atomic seq_cst 218 // CHECK-NEXT: a++; 219 // CHECK-NEXT: #pragma omp atomic read seq_cst 220 // CHECK-NEXT: a = argc; 221 // CHECK-NEXT: #pragma omp atomic seq_cst write 222 // CHECK-NEXT: a = argc + argc; 223 // CHECK-NEXT: #pragma omp atomic update seq_cst 224 // CHECK-NEXT: a = a + argc; 225 // CHECK-NEXT: #pragma omp atomic seq_cst capture 226 // CHECK-NEXT: a = b++; 227 // CHECK-NEXT: #pragma omp atomic capture seq_cst 228 // CHECK-NEXT: { 229 // CHECK-NEXT: a = b; 230 // CHECK-NEXT: b++; 231 // CHECK-NEXT: } 232 // CHECK-NEXT: #pragma omp atomic 233 // CHECK-NEXT: a++; 234 // CHECK-NEXT: #pragma omp atomic read 235 // CHECK-NEXT: a = argc; 236 // CHECK-NEXT: #pragma omp atomic write 237 // CHECK-NEXT: a = argc + argc; 238 // CHECK-NEXT: #pragma omp atomic update 239 // CHECK-NEXT: a = a + argc; 240 // CHECK-NEXT: #pragma omp atomic acq_rel capture 241 // CHECK-NEXT: a = b++; 242 // CHECK-NEXT: #pragma omp atomic capture acq_rel 243 // CHECK-NEXT: { 244 // CHECK-NEXT: a = b; 245 // CHECK-NEXT: b++; 246 // CHECK-NEXT: } 247 // CHECK-NEXT: #pragma omp atomic 248 // CHECK-NEXT: a++; 249 // CHECK-NEXT: #pragma omp atomic read acquire 250 // CHECK-NEXT: a = argc; 251 // CHECK-NEXT: #pragma omp atomic write 252 // CHECK-NEXT: a = argc + argc; 253 // CHECK-NEXT: #pragma omp atomic update 254 // CHECK-NEXT: a = a + argc; 255 // CHECK-NEXT: #pragma omp atomic acquire capture 256 // CHECK-NEXT: a = b++; 257 // CHECK-NEXT: #pragma omp atomic capture acquire 258 // CHECK-NEXT: { 259 // CHECK-NEXT: a = b; 260 // CHECK-NEXT: b++; 261 // CHECK-NEXT: } 262 // CHECK-NEXT: #pragma omp atomic release 263 // CHECK-NEXT: a++; 264 // CHECK-NEXT: #pragma omp atomic read 265 // CHECK-NEXT: a = argc; 266 // CHECK-NEXT: #pragma omp atomic release write 267 // CHECK-NEXT: a = argc + argc; 268 // CHECK-NEXT: #pragma omp atomic update release 269 // CHECK-NEXT: a = a + argc; 270 // CHECK-NEXT: #pragma omp atomic release capture 271 // CHECK-NEXT: a = b++; 272 // CHECK-NEXT: #pragma omp atomic capture release 273 // CHECK-NEXT: { 274 // CHECK-NEXT: a = b; 275 // CHECK-NEXT: b++; 276 // CHECK-NEXT: } 277 // CHECK-NEXT: #pragma omp atomic relaxed 278 // CHECK-NEXT: a++; 279 // CHECK-NEXT: #pragma omp atomic read 280 // CHECK-NEXT: a = argc; 281 // CHECK-NEXT: #pragma omp atomic relaxed write 282 // CHECK-NEXT: a = argc + argc; 283 // CHECK-NEXT: #pragma omp atomic update relaxed 284 // CHECK-NEXT: a = a + argc; 285 // CHECK-NEXT: #pragma omp atomic relaxed capture 286 // CHECK-NEXT: a = b++; 287 // CHECK-NEXT: #pragma omp atomic capture relaxed 288 // CHECK-NEXT: { 289 // CHECK-NEXT: a = b; 290 // CHECK-NEXT: b++; 291 // CHECK-NEXT: } 292 293 int main(int argc, char **argv) { 294 int b = 0; 295 int a = 0; 296 // CHECK: int a = 0; 297 #pragma omp atomic 298 a++; 299 #pragma omp atomic read 300 a = argc; 301 #pragma omp atomic write 302 a = argc + argc; 303 #pragma omp atomic update 304 a = a + argc; 305 #pragma omp atomic capture 306 a = b++; 307 #pragma omp atomic capture 308 { 309 a = b; 310 b++; 311 } 312 #pragma omp atomic seq_cst 313 a++; 314 #pragma omp atomic read seq_cst 315 a = argc; 316 #pragma omp atomic seq_cst write 317 a = argc + argc; 318 #pragma omp atomic update seq_cst 319 a = a + argc; 320 #pragma omp atomic seq_cst capture 321 a = b++; 322 #pragma omp atomic capture seq_cst 323 { 324 a = b; 325 b++; 326 } 327 #pragma omp atomic 328 a++; 329 #pragma omp atomic read 330 a = argc; 331 #pragma omp atomic write 332 a = argc + argc; 333 #pragma omp atomic update 334 a = a + argc; 335 #pragma omp atomic acq_rel capture 336 a = b++; 337 #pragma omp atomic capture acq_rel 338 { 339 a = b; 340 b++; 341 } 342 #pragma omp atomic 343 a++; 344 #pragma omp atomic read acquire 345 a = argc; 346 #pragma omp atomic write 347 a = argc + argc; 348 #pragma omp atomic update 349 a = a + argc; 350 #pragma omp atomic acquire capture 351 a = b++; 352 #pragma omp atomic capture acquire 353 { 354 a = b; 355 b++; 356 } 357 #pragma omp atomic release 358 a++; 359 #pragma omp atomic read 360 a = argc; 361 #pragma omp atomic release write 362 a = argc + argc; 363 #pragma omp atomic update release 364 a = a + argc; 365 #pragma omp atomic release capture 366 a = b++; 367 #pragma omp atomic capture release 368 { 369 a = b; 370 b++; 371 } 372 #pragma omp atomic relaxed 373 a++; 374 #pragma omp atomic read 375 a = argc; 376 #pragma omp atomic relaxed write 377 a = argc + argc; 378 #pragma omp atomic update relaxed 379 a = a + argc; 380 #pragma omp atomic relaxed capture 381 a = b++; 382 #pragma omp atomic capture relaxed 383 { 384 a = b; 385 b++; 386 } 387 // CHECK-NEXT: #pragma omp atomic 388 // CHECK-NEXT: a++; 389 // CHECK-NEXT: #pragma omp atomic read 390 // CHECK-NEXT: a = argc; 391 // CHECK-NEXT: #pragma omp atomic write 392 // CHECK-NEXT: a = argc + argc; 393 // CHECK-NEXT: #pragma omp atomic update 394 // CHECK-NEXT: a = a + argc; 395 // CHECK-NEXT: #pragma omp atomic capture 396 // CHECK-NEXT: a = b++; 397 // CHECK-NEXT: #pragma omp atomic capture 398 // CHECK-NEXT: { 399 // CHECK-NEXT: a = b; 400 // CHECK-NEXT: b++; 401 // CHECK-NEXT: } 402 // CHECK-NEXT: #pragma omp atomic seq_cst 403 // CHECK-NEXT: a++; 404 // CHECK-NEXT: #pragma omp atomic read seq_cst 405 // CHECK-NEXT: a = argc; 406 // CHECK-NEXT: #pragma omp atomic seq_cst write 407 // CHECK-NEXT: a = argc + argc; 408 // CHECK-NEXT: #pragma omp atomic update seq_cst 409 // CHECK-NEXT: a = a + argc; 410 // CHECK-NEXT: #pragma omp atomic seq_cst capture 411 // CHECK-NEXT: a = b++; 412 // CHECK-NEXT: #pragma omp atomic capture seq_cst 413 // CHECK-NEXT: { 414 // CHECK-NEXT: a = b; 415 // CHECK-NEXT: b++; 416 // CHECK-NEXT: } 417 // CHECK-NEXT: #pragma omp atomic 418 // CHECK-NEXT: a++; 419 // CHECK-NEXT: #pragma omp atomic read 420 // CHECK-NEXT: a = argc; 421 // CHECK-NEXT: #pragma omp atomic write 422 // CHECK-NEXT: a = argc + argc; 423 // CHECK-NEXT: #pragma omp atomic update 424 // CHECK-NEXT: a = a + argc; 425 // CHECK-NEXT: #pragma omp atomic acq_rel capture 426 // CHECK-NEXT: a = b++; 427 // CHECK-NEXT: #pragma omp atomic capture acq_rel 428 // CHECK-NEXT: { 429 // CHECK-NEXT: a = b; 430 // CHECK-NEXT: b++; 431 // CHECK-NEXT: } 432 // CHECK-NEXT: #pragma omp atomic 433 // CHECK-NEXT: a++; 434 // CHECK-NEXT: #pragma omp atomic read acquire 435 // CHECK-NEXT: a = argc; 436 // CHECK-NEXT: #pragma omp atomic write 437 // CHECK-NEXT: a = argc + argc; 438 // CHECK-NEXT: #pragma omp atomic update 439 // CHECK-NEXT: a = a + argc; 440 // CHECK-NEXT: #pragma omp atomic acquire capture 441 // CHECK-NEXT: a = b++; 442 // CHECK-NEXT: #pragma omp atomic capture acquire 443 // CHECK-NEXT: { 444 // CHECK-NEXT: a = b; 445 // CHECK-NEXT: b++; 446 // CHECK-NEXT: } 447 // CHECK-NEXT: #pragma omp atomic release 448 // CHECK-NEXT: a++; 449 // CHECK-NEXT: #pragma omp atomic read 450 // CHECK-NEXT: a = argc; 451 // CHECK-NEXT: #pragma omp atomic release write 452 // CHECK-NEXT: a = argc + argc; 453 // CHECK-NEXT: #pragma omp atomic update release 454 // CHECK-NEXT: a = a + argc; 455 // CHECK-NEXT: #pragma omp atomic release capture 456 // CHECK-NEXT: a = b++; 457 // CHECK-NEXT: #pragma omp atomic capture release 458 // CHECK-NEXT: { 459 // CHECK-NEXT: a = b; 460 // CHECK-NEXT: b++; 461 // CHECK-NEXT: } 462 // CHECK-NEXT: #pragma omp atomic relaxed 463 // CHECK-NEXT: a++; 464 // CHECK-NEXT: #pragma omp atomic read 465 // CHECK-NEXT: a = argc; 466 // CHECK-NEXT: #pragma omp atomic relaxed write 467 // CHECK-NEXT: a = argc + argc; 468 // CHECK-NEXT: #pragma omp atomic update relaxed 469 // CHECK-NEXT: a = a + argc; 470 // CHECK-NEXT: #pragma omp atomic relaxed capture 471 // CHECK-NEXT: a = b++; 472 // CHECK-NEXT: #pragma omp atomic capture relaxed 473 // CHECK-NEXT: { 474 // CHECK-NEXT: a = b; 475 // CHECK-NEXT: b++; 476 // CHECK-NEXT: } 477 return foo(a); 478 } 479 480 #endif 481