1 // RUN: %clang_cc1 -fsyntax-only -fopenmp=libiomp5 -verify %s 2 3 void bar(); 4 5 template <class T> 6 void foo() { 7 T a = T(); 8 // PARALLEL DIRECTIVE 9 #pragma omp parallel 10 #pragma omp for 11 for (int i = 0; i < 10; ++i) 12 ; 13 #pragma omp parallel 14 #pragma omp simd 15 for (int i = 0; i < 10; ++i) 16 ; 17 #pragma omp parallel 18 #pragma omp for simd 19 for (int i = 0; i < 10; ++i) 20 ; 21 #pragma omp parallel 22 #pragma omp sections 23 { 24 bar(); 25 } 26 #pragma omp parallel 27 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a parallel region}} 28 { 29 bar(); 30 } 31 #pragma omp parallel 32 #pragma omp single 33 bar(); 34 35 #pragma omp parallel 36 #pragma omp master 37 { 38 bar(); 39 } 40 #pragma omp parallel 41 #pragma omp critical 42 { 43 bar(); 44 } 45 #pragma omp parallel 46 #pragma omp parallel for 47 for (int i = 0; i < 10; ++i) 48 ; 49 #pragma omp parallel 50 #pragma omp parallel for simd 51 for (int i = 0; i < 10; ++i) 52 ; 53 #pragma omp parallel 54 #pragma omp parallel sections 55 { 56 bar(); 57 } 58 #pragma omp parallel 59 #pragma omp task 60 { 61 bar(); 62 } 63 #pragma omp parallel 64 { 65 #pragma omp taskyield 66 bar(); 67 } 68 #pragma omp parallel 69 { 70 #pragma omp barrier 71 bar(); 72 } 73 #pragma omp parallel 74 { 75 #pragma omp taskwait 76 bar(); 77 } 78 #pragma omp parallel 79 { 80 #pragma omp flush 81 bar(); 82 } 83 #pragma omp parallel 84 { 85 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'parallel' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} 86 bar(); 87 } 88 #pragma omp parallel 89 { 90 #pragma omp atomic 91 ++a; 92 } 93 #pragma omp parallel 94 { 95 #pragma omp target 96 ++a; 97 } 98 99 // SIMD DIRECTIVE 100 #pragma omp simd 101 for (int i = 0; i < 10; ++i) { 102 #pragma omp for // expected-error {{OpenMP constructs may not be nested inside a simd region}} 103 for (int i = 0; i < 10; ++i) 104 ; 105 } 106 #pragma omp simd 107 for (int i = 0; i < 10; ++i) { 108 #pragma omp simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} 109 for (int i = 0; i < 10; ++i) 110 ; 111 } 112 #pragma omp simd 113 for (int i = 0; i < 10; ++i) { 114 #pragma omp for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} 115 for (int i = 0; i < 10; ++i) 116 ; 117 } 118 #pragma omp simd 119 for (int i = 0; i < 10; ++i) { 120 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}} 121 for (int i = 0; i < 10; ++i) 122 ; 123 } 124 #pragma omp simd 125 for (int i = 0; i < 10; ++i) { 126 #pragma omp sections // expected-error {{OpenMP constructs may not be nested inside a simd region}} 127 { 128 bar(); 129 } 130 } 131 #pragma omp simd 132 for (int i = 0; i < 10; ++i) { 133 #pragma omp section // expected-error {{OpenMP constructs may not be nested inside a simd region}} 134 { 135 bar(); 136 } 137 } 138 #pragma omp simd 139 for (int i = 0; i < 10; ++i) { 140 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}} 141 { 142 bar(); 143 } 144 } 145 #pragma omp simd 146 for (int i = 0; i < 10; ++i) { 147 #pragma omp master // expected-error {{OpenMP constructs may not be nested inside a simd region}} 148 { 149 bar(); 150 } 151 } 152 #pragma omp simd 153 for (int i = 0; i < 10; ++i) { 154 #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}} 155 { 156 bar(); 157 } 158 } 159 #pragma omp simd 160 for (int i = 0; i < 10; ++i) { 161 #pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}} 162 for (int i = 0; i < 10; ++i) 163 ; 164 } 165 #pragma omp simd 166 for (int i = 0; i < 10; ++i) { 167 #pragma omp parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} 168 for (int i = 0; i < 10; ++i) 169 ; 170 } 171 #pragma omp simd 172 for (int i = 0; i < 10; ++i) { 173 #pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside a simd region}} 174 { 175 bar(); 176 } 177 } 178 #pragma omp simd 179 for (int i = 0; i < 10; ++i) { 180 #pragma omp task // expected-error {{OpenMP constructs may not be nested inside a simd region}} 181 { 182 bar(); 183 } 184 } 185 #pragma omp simd 186 for (int i = 0; i < 10; ++i) { 187 #pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside a simd region}} 188 bar(); 189 } 190 #pragma omp simd 191 for (int i = 0; i < 10; ++i) { 192 #pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside a simd region}} 193 bar(); 194 } 195 #pragma omp simd 196 for (int i = 0; i < 10; ++i) { 197 #pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}} 198 bar(); 199 } 200 #pragma omp simd 201 for (int i = 0; i < 10; ++i) { 202 #pragma omp flush // expected-error {{OpenMP constructs may not be nested inside a simd region}} 203 bar(); 204 } 205 #pragma omp simd 206 for (int i = 0; i < 10; ++i) { 207 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 208 bar(); 209 } 210 #pragma omp simd 211 for (int i = 0; i < 10; ++i) { 212 #pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside a simd region}} 213 ++a; 214 } 215 #pragma omp simd 216 for (int i = 0; i < 10; ++i) { 217 #pragma omp target // expected-error {{OpenMP constructs may not be nested inside a simd region}} 218 ++a; 219 } 220 221 // FOR DIRECTIVE 222 #pragma omp for 223 for (int i = 0; i < 10; ++i) { 224 #pragma omp for // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} 225 for (int i = 0; i < 10; ++i) 226 ; 227 } 228 #pragma omp for 229 for (int i = 0; i < 10; ++i) { 230 #pragma omp simd 231 for (int i = 0; i < 10; ++i) 232 ; 233 } 234 #pragma omp for 235 for (int i = 0; i < 10; ++i) { 236 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} 237 for (int i = 0; i < 10; ++i) 238 ; 239 } 240 #pragma omp for 241 for (int i = 0; i < 10; ++i) { 242 #pragma omp parallel 243 for (int i = 0; i < 10; ++i) 244 ; 245 } 246 #pragma omp for 247 for (int i = 0; i < 10; ++i) { 248 #pragma omp sections // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} 249 { 250 bar(); 251 } 252 } 253 #pragma omp for 254 for (int i = 0; i < 10; ++i) { 255 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a for region}} 256 { 257 bar(); 258 } 259 } 260 #pragma omp for 261 for (int i = 0; i < 10; ++i) { 262 #pragma omp single // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} 263 { 264 bar(); 265 } 266 } 267 268 #pragma omp for 269 for (int i = 0; i < 10; ++i) { 270 #pragma omp master // expected-error {{region cannot be closely nested inside 'for' region}} 271 { 272 bar(); 273 } 274 } 275 #pragma omp for 276 for (int i = 0; i < 10; ++i) { 277 #pragma omp critical 278 { 279 bar(); 280 } 281 } 282 #pragma omp for 283 for (int i = 0; i < 10; ++i) { 284 #pragma omp parallel 285 { 286 #pragma omp single // OK 287 { 288 bar(); 289 } 290 #pragma omp for // OK 291 for (int i = 0; i < 10; ++i) 292 ; 293 #pragma omp sections // OK 294 { 295 bar(); 296 } 297 } 298 } 299 #pragma omp for 300 for (int i = 0; i < 10; ++i) { 301 #pragma omp parallel for 302 for (int i = 0; i < 10; ++i) 303 ; 304 } 305 #pragma omp for 306 for (int i = 0; i < 10; ++i) { 307 #pragma omp parallel for simd 308 for (int i = 0; i < 10; ++i) 309 ; 310 } 311 #pragma omp for 312 for (int i = 0; i < 10; ++i) { 313 #pragma omp parallel sections 314 { 315 bar(); 316 } 317 } 318 #pragma omp for 319 for (int i = 0; i < 10; ++i) { 320 #pragma omp task 321 { 322 bar(); 323 } 324 } 325 #pragma omp for 326 for (int i = 0; i < 10; ++i) { 327 #pragma omp taskyield 328 bar(); 329 } 330 #pragma omp for 331 for (int i = 0; i < 10; ++i) { 332 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'for' region}} 333 bar(); 334 } 335 #pragma omp for 336 for (int i = 0; i < 10; ++i) { 337 #pragma omp taskwait 338 bar(); 339 } 340 #pragma omp for 341 for (int i = 0; i < 10; ++i) { 342 #pragma omp flush 343 bar(); 344 } 345 #pragma omp for 346 for (int i = 0; i < 10; ++i) { 347 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} 348 bar(); 349 } 350 #pragma omp for ordered 351 for (int i = 0; i < 10; ++i) { 352 #pragma omp ordered // OK 353 bar(); 354 } 355 #pragma omp for 356 for (int i = 0; i < 10; ++i) { 357 #pragma omp atomic 358 ++a; 359 } 360 #pragma omp for 361 for (int i = 0; i < 10; ++i) { 362 #pragma omp target 363 ++a; 364 } 365 366 // FOR SIMD DIRECTIVE 367 #pragma omp for simd 368 for (int i = 0; i < 10; ++i) { 369 #pragma omp for // expected-error {{OpenMP constructs may not be nested inside a simd region}} 370 for (int i = 0; i < 10; ++i) 371 ; 372 } 373 #pragma omp for simd 374 for (int i = 0; i < 10; ++i) { 375 #pragma omp simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} 376 for (int i = 0; i < 10; ++i) 377 ; 378 } 379 #pragma omp for simd 380 for (int i = 0; i < 10; ++i) { 381 #pragma omp for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} 382 for (int i = 0; i < 10; ++i) 383 ; 384 } 385 #pragma omp for simd 386 for (int i = 0; i < 10; ++i) { 387 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}} 388 for (int i = 0; i < 10; ++i) 389 ; 390 } 391 #pragma omp for simd 392 for (int i = 0; i < 10; ++i) { 393 #pragma omp sections // expected-error {{OpenMP constructs may not be nested inside a simd region}} 394 { 395 bar(); 396 } 397 } 398 #pragma omp for simd 399 for (int i = 0; i < 10; ++i) { 400 #pragma omp section // expected-error {{OpenMP constructs may not be nested inside a simd region}} 401 { 402 bar(); 403 } 404 } 405 #pragma omp for simd 406 for (int i = 0; i < 10; ++i) { 407 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}} 408 { 409 bar(); 410 } 411 } 412 #pragma omp for simd 413 for (int i = 0; i < 10; ++i) { 414 #pragma omp master // expected-error {{OpenMP constructs may not be nested inside a simd region}} 415 { 416 bar(); 417 } 418 } 419 #pragma omp for simd 420 for (int i = 0; i < 10; ++i) { 421 #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}} 422 { 423 bar(); 424 } 425 } 426 #pragma omp for simd 427 for (int i = 0; i < 10; ++i) { 428 #pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}} 429 for (int i = 0; i < 10; ++i) 430 ; 431 } 432 #pragma omp for simd 433 for (int i = 0; i < 10; ++i) { 434 #pragma omp parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} 435 for (int i = 0; i < 10; ++i) 436 ; 437 } 438 #pragma omp for simd 439 for (int i = 0; i < 10; ++i) { 440 #pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside a simd region}} 441 { 442 bar(); 443 } 444 } 445 #pragma omp for simd 446 for (int i = 0; i < 10; ++i) { 447 #pragma omp task // expected-error {{OpenMP constructs may not be nested inside a simd region}} 448 { 449 bar(); 450 } 451 } 452 #pragma omp for simd 453 for (int i = 0; i < 10; ++i) { 454 #pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside a simd region}} 455 bar(); 456 } 457 #pragma omp for simd 458 for (int i = 0; i < 10; ++i) { 459 #pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside a simd region}} 460 bar(); 461 } 462 #pragma omp for simd 463 for (int i = 0; i < 10; ++i) { 464 #pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}} 465 bar(); 466 } 467 #pragma omp for simd 468 for (int i = 0; i < 10; ++i) { 469 #pragma omp flush // expected-error {{OpenMP constructs may not be nested inside a simd region}} 470 bar(); 471 } 472 #pragma omp for simd 473 for (int i = 0; i < 10; ++i) { 474 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 475 bar(); 476 } 477 #pragma omp for simd 478 for (int i = 0; i < 10; ++i) { 479 #pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside a simd region}} 480 ++a; 481 } 482 #pragma omp for simd 483 for (int i = 0; i < 10; ++i) { 484 #pragma omp target // expected-error {{OpenMP constructs may not be nested inside a simd region}} 485 ++a; 486 } 487 488 // SECTIONS DIRECTIVE 489 #pragma omp sections 490 { 491 #pragma omp for // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} 492 for (int i = 0; i < 10; ++i) 493 ; 494 } 495 #pragma omp sections 496 { 497 #pragma omp simd 498 for (int i = 0; i < 10; ++i) 499 ; 500 } 501 #pragma omp sections 502 { 503 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} 504 for (int i = 0; i < 10; ++i) 505 ; 506 } 507 #pragma omp sections 508 { 509 #pragma omp parallel 510 for (int i = 0; i < 10; ++i) 511 ; 512 } 513 #pragma omp sections 514 { 515 #pragma omp sections // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} 516 { 517 bar(); 518 } 519 } 520 #pragma omp sections 521 { 522 #pragma omp section 523 { 524 bar(); 525 } 526 } 527 #pragma omp sections 528 { 529 #pragma omp parallel 530 { 531 #pragma omp single // OK 532 { 533 bar(); 534 } 535 #pragma omp for // OK 536 for (int i = 0; i < 10; ++i) 537 ; 538 #pragma omp sections // OK 539 { 540 bar(); 541 } 542 } 543 } 544 #pragma omp sections 545 { 546 #pragma omp parallel 547 { 548 #pragma omp master // OK 549 { 550 bar(); 551 } 552 #pragma omp for // OK 553 for (int i = 0; i < 10; ++i) 554 ; 555 #pragma omp master // OK 556 { 557 bar(); 558 } 559 } 560 #pragma omp master // expected-error {{region cannot be closely nested inside 'sections' region}} 561 bar(); 562 } 563 #pragma omp sections 564 { 565 #pragma omp parallel 566 { 567 #pragma omp critical(A) // OK 568 { 569 bar(); 570 } 571 #pragma omp for // OK 572 for (int i = 0; i < 10; ++i) 573 ; 574 #pragma omp critical // OK 575 { 576 bar(); 577 } 578 } 579 #pragma omp critical(A) // expected-error {{statement in 'omp sections' directive must be enclosed into a section region}} 580 bar(); 581 } 582 #pragma omp sections 583 { 584 #pragma omp parallel for 585 for (int i = 0; i < 10; ++i) 586 ; 587 } 588 #pragma omp sections 589 { 590 #pragma omp parallel for simd 591 for (int i = 0; i < 10; ++i) 592 ; 593 } 594 #pragma omp sections 595 { 596 #pragma omp parallel sections 597 { 598 bar(); 599 } 600 } 601 #pragma omp sections 602 { 603 #pragma omp task 604 { 605 bar(); 606 } 607 } 608 #pragma omp sections 609 { 610 #pragma omp taskyield 611 } 612 #pragma omp sections 613 { 614 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'sections' region}} 615 } 616 #pragma omp sections 617 { 618 #pragma omp taskwait 619 } 620 #pragma omp sections 621 { 622 #pragma omp flush 623 } 624 #pragma omp sections 625 { 626 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} 627 bar(); 628 } 629 #pragma omp sections 630 { 631 #pragma omp atomic 632 ++a; 633 } 634 #pragma omp sections 635 { 636 #pragma omp target 637 ++a; 638 } 639 640 // SECTION DIRECTIVE 641 #pragma omp section // expected-error {{orphaned 'omp section' directives are prohibited, it must be closely nested to a sections region}} 642 { 643 bar(); 644 } 645 #pragma omp sections 646 { 647 #pragma omp section 648 { 649 #pragma omp for // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} 650 for (int i = 0; i < 10; ++i) 651 ; 652 } 653 } 654 #pragma omp sections 655 { 656 #pragma omp section 657 { 658 #pragma omp simd 659 for (int i = 0; i < 10; ++i) 660 ; 661 } 662 } 663 #pragma omp sections 664 { 665 #pragma omp section 666 { 667 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} 668 for (int i = 0; i < 10; ++i) 669 ; 670 } 671 } 672 #pragma omp sections 673 { 674 #pragma omp section 675 { 676 #pragma omp parallel 677 for (int i = 0; i < 10; ++i) 678 ; 679 } 680 } 681 #pragma omp sections 682 { 683 #pragma omp section 684 { 685 #pragma omp sections // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} 686 { 687 bar(); 688 } 689 } 690 } 691 #pragma omp sections 692 { 693 #pragma omp section 694 { 695 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a section region}} 696 { 697 bar(); 698 } 699 } 700 } 701 #pragma omp sections 702 { 703 #pragma omp section 704 { 705 #pragma omp single // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} 706 bar(); 707 #pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}} 708 bar(); 709 #pragma omp critical 710 bar(); 711 } 712 } 713 #pragma omp sections 714 { 715 #pragma omp section 716 { 717 #pragma omp parallel 718 { 719 #pragma omp single // OK 720 { 721 bar(); 722 } 723 #pragma omp for // OK 724 for (int i = 0; i < 10; ++i) 725 ; 726 #pragma omp for simd // OK 727 for (int i = 0; i < 10; ++i) 728 ; 729 #pragma omp sections // OK 730 { 731 bar(); 732 } 733 } 734 } 735 } 736 #pragma omp sections 737 { 738 #pragma omp section 739 { 740 #pragma omp parallel for 741 for (int i = 0; i < 10; ++i) 742 ; 743 } 744 } 745 #pragma omp sections 746 { 747 #pragma omp section 748 { 749 #pragma omp parallel for simd 750 for (int i = 0; i < 10; ++i) 751 ; 752 } 753 } 754 #pragma omp sections 755 { 756 #pragma omp section 757 { 758 #pragma omp parallel sections 759 { 760 bar(); 761 } 762 } 763 } 764 #pragma omp sections 765 { 766 #pragma omp section 767 { 768 #pragma omp task 769 { 770 bar(); 771 } 772 } 773 } 774 #pragma omp sections 775 { 776 #pragma omp section 777 { 778 #pragma omp taskyield 779 bar(); 780 } 781 } 782 #pragma omp sections 783 { 784 #pragma omp section 785 { 786 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'section' region}} 787 bar(); 788 } 789 } 790 #pragma omp sections 791 { 792 #pragma omp section 793 { 794 #pragma omp taskwait 795 bar(); 796 } 797 } 798 #pragma omp sections 799 { 800 #pragma omp section 801 { 802 #pragma omp flush 803 bar(); 804 } 805 } 806 #pragma omp sections 807 { 808 #pragma omp section 809 { 810 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} 811 bar(); 812 } 813 } 814 #pragma omp sections 815 { 816 #pragma omp section 817 #pragma omp atomic 818 ++a; 819 } 820 #pragma omp sections 821 { 822 #pragma omp section 823 #pragma omp target 824 ++a; 825 } 826 827 // SINGLE DIRECTIVE 828 #pragma omp single 829 { 830 #pragma omp for // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} 831 for (int i = 0; i < 10; ++i) 832 ; 833 } 834 #pragma omp single 835 { 836 #pragma omp simd 837 for (int i = 0; i < 10; ++i) 838 ; 839 } 840 #pragma omp single 841 { 842 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} 843 for (int i = 0; i < 10; ++i) 844 ; 845 } 846 #pragma omp single 847 { 848 #pragma omp parallel 849 for (int i = 0; i < 10; ++i) 850 ; 851 } 852 #pragma omp single 853 { 854 #pragma omp single // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} 855 { 856 bar(); 857 } 858 } 859 #pragma omp single 860 { 861 #pragma omp master // expected-error {{region cannot be closely nested inside 'single' region}} 862 { 863 bar(); 864 } 865 } 866 #pragma omp single 867 { 868 #pragma omp critical 869 { 870 bar(); 871 } 872 } 873 #pragma omp single 874 { 875 #pragma omp sections // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} 876 { 877 bar(); 878 } 879 } 880 #pragma omp single 881 { 882 #pragma omp parallel 883 { 884 #pragma omp single // OK 885 { 886 bar(); 887 } 888 #pragma omp for // OK 889 for (int i = 0; i < 10; ++i) 890 ; 891 #pragma omp for simd // OK 892 for (int i = 0; i < 10; ++i) 893 ; 894 #pragma omp sections // OK 895 { 896 bar(); 897 } 898 } 899 } 900 #pragma omp single 901 { 902 #pragma omp parallel for 903 for (int i = 0; i < 10; ++i) 904 ; 905 } 906 #pragma omp single 907 { 908 #pragma omp parallel for simd 909 for (int i = 0; i < 10; ++i) 910 ; 911 } 912 #pragma omp single 913 { 914 #pragma omp parallel sections 915 { 916 bar(); 917 } 918 } 919 #pragma omp single 920 { 921 #pragma omp task 922 { 923 bar(); 924 } 925 } 926 #pragma omp single 927 { 928 #pragma omp taskyield 929 bar(); 930 } 931 #pragma omp single 932 { 933 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'single' region}} 934 bar(); 935 } 936 #pragma omp single 937 { 938 #pragma omp taskwait 939 bar(); 940 } 941 #pragma omp single 942 { 943 #pragma omp flush 944 bar(); 945 } 946 #pragma omp single 947 { 948 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} 949 bar(); 950 } 951 #pragma omp single 952 { 953 #pragma omp atomic 954 ++a; 955 } 956 #pragma omp single 957 { 958 #pragma omp target 959 ++a; 960 } 961 962 // MASTER DIRECTIVE 963 #pragma omp master 964 { 965 #pragma omp for // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} 966 for (int i = 0; i < 10; ++i) 967 ; 968 } 969 #pragma omp master 970 { 971 #pragma omp simd 972 for (int i = 0; i < 10; ++i) 973 ; 974 } 975 #pragma omp master 976 { 977 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} 978 for (int i = 0; i < 10; ++i) 979 ; 980 } 981 #pragma omp master 982 { 983 #pragma omp parallel 984 for (int i = 0; i < 10; ++i) 985 ; 986 } 987 #pragma omp master 988 { 989 #pragma omp single // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} 990 { 991 bar(); 992 } 993 } 994 #pragma omp master 995 { 996 #pragma omp master // OK, though second 'master' is redundant 997 { 998 bar(); 999 } 1000 } 1001 #pragma omp master 1002 { 1003 #pragma omp critical 1004 { 1005 bar(); 1006 } 1007 } 1008 #pragma omp master 1009 { 1010 #pragma omp sections // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} 1011 { 1012 bar(); 1013 } 1014 } 1015 #pragma omp master 1016 { 1017 #pragma omp parallel 1018 { 1019 #pragma omp master // OK 1020 { 1021 bar(); 1022 } 1023 #pragma omp for // OK 1024 for (int i = 0; i < 10; ++i) 1025 ; 1026 #pragma omp for simd // OK 1027 for (int i = 0; i < 10; ++i) 1028 ; 1029 #pragma omp sections // OK 1030 { 1031 bar(); 1032 } 1033 } 1034 } 1035 #pragma omp master 1036 { 1037 #pragma omp parallel for 1038 for (int i = 0; i < 10; ++i) 1039 ; 1040 } 1041 #pragma omp master 1042 { 1043 #pragma omp parallel for simd 1044 for (int i = 0; i < 10; ++i) 1045 ; 1046 } 1047 #pragma omp master 1048 { 1049 #pragma omp parallel sections 1050 { 1051 bar(); 1052 } 1053 } 1054 #pragma omp master 1055 { 1056 #pragma omp task 1057 { 1058 bar(); 1059 } 1060 } 1061 #pragma omp master 1062 { 1063 #pragma omp taskyield 1064 bar(); 1065 } 1066 #pragma omp master 1067 { 1068 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'master' region}} 1069 bar(); 1070 } 1071 #pragma omp master 1072 { 1073 #pragma omp taskwait 1074 bar(); 1075 } 1076 #pragma omp master 1077 { 1078 #pragma omp flush 1079 bar(); 1080 } 1081 #pragma omp master 1082 { 1083 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} 1084 bar(); 1085 } 1086 #pragma omp master 1087 { 1088 #pragma omp atomic 1089 ++a; 1090 } 1091 #pragma omp master 1092 { 1093 #pragma omp target 1094 ++a; 1095 } 1096 1097 // CRITICAL DIRECTIVE 1098 #pragma omp critical 1099 { 1100 #pragma omp for // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} 1101 for (int i = 0; i < 10; ++i) 1102 ; 1103 } 1104 #pragma omp critical 1105 { 1106 #pragma omp simd 1107 for (int i = 0; i < 10; ++i) 1108 ; 1109 } 1110 #pragma omp critical 1111 { 1112 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} 1113 for (int i = 0; i < 10; ++i) 1114 ; 1115 } 1116 #pragma omp critical 1117 { 1118 #pragma omp parallel 1119 for (int i = 0; i < 10; ++i) 1120 ; 1121 } 1122 #pragma omp critical 1123 { 1124 #pragma omp single // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} 1125 { 1126 bar(); 1127 } 1128 } 1129 #pragma omp critical 1130 { 1131 #pragma omp master // OK, though second 'master' is redundant 1132 { 1133 bar(); 1134 } 1135 } 1136 #pragma omp critical 1137 { 1138 #pragma omp critical 1139 { 1140 bar(); 1141 } 1142 } 1143 #pragma omp critical 1144 { 1145 #pragma omp sections // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} 1146 { 1147 bar(); 1148 } 1149 } 1150 #pragma omp critical 1151 { 1152 #pragma omp parallel 1153 { 1154 #pragma omp master // OK 1155 { 1156 bar(); 1157 } 1158 #pragma omp for // OK 1159 for (int i = 0; i < 10; ++i) 1160 ; 1161 #pragma omp for simd // OK 1162 for (int i = 0; i < 10; ++i) 1163 ; 1164 #pragma omp sections // OK 1165 { 1166 bar(); 1167 } 1168 } 1169 } 1170 #pragma omp critical 1171 { 1172 #pragma omp parallel for 1173 for (int i = 0; i < 10; ++i) 1174 ; 1175 } 1176 #pragma omp critical 1177 { 1178 #pragma omp parallel for simd 1179 for (int i = 0; i < 10; ++i) 1180 ; 1181 } 1182 #pragma omp critical 1183 { 1184 #pragma omp parallel sections 1185 { 1186 bar(); 1187 } 1188 } 1189 #pragma omp critical 1190 { 1191 #pragma omp task 1192 { 1193 bar(); 1194 } 1195 } 1196 #pragma omp critical 1197 { 1198 #pragma omp taskyield 1199 bar(); 1200 } 1201 #pragma omp critical 1202 { 1203 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'critical' region}} 1204 bar(); 1205 } 1206 #pragma omp critical 1207 { 1208 #pragma omp taskwait 1209 bar(); 1210 } 1211 #pragma omp critical(Tuzik) 1212 { 1213 #pragma omp critical(grelka) 1214 bar(); 1215 } 1216 #pragma omp critical(Belka) // expected-note {{previous 'critical' region starts here}} 1217 { 1218 #pragma omp critical(Belka) // expected-error {{cannot nest 'critical' regions having the same name 'Belka'}} 1219 { 1220 #pragma omp critical(Tuzik) 1221 { 1222 #pragma omp parallel 1223 #pragma omp critical(grelka) 1224 { 1225 bar(); 1226 } 1227 } 1228 } 1229 } 1230 #pragma omp critical 1231 { 1232 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} 1233 bar(); 1234 } 1235 #pragma omp critical 1236 { 1237 #pragma omp atomic 1238 ++a; 1239 } 1240 #pragma omp critical 1241 { 1242 #pragma omp target 1243 ++a; 1244 } 1245 1246 // PARALLEL FOR DIRECTIVE 1247 #pragma omp parallel for 1248 for (int i = 0; i < 10; ++i) { 1249 #pragma omp for // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} 1250 for (int i = 0; i < 10; ++i) 1251 ; 1252 } 1253 #pragma omp parallel for 1254 for (int i = 0; i < 10; ++i) { 1255 #pragma omp simd 1256 for (int i = 0; i < 10; ++i) 1257 ; 1258 } 1259 #pragma omp parallel for 1260 for (int i = 0; i < 10; ++i) { 1261 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} 1262 for (int i = 0; i < 10; ++i) 1263 ; 1264 } 1265 #pragma omp parallel for 1266 for (int i = 0; i < 10; ++i) { 1267 #pragma omp parallel 1268 for (int i = 0; i < 10; ++i) 1269 ; 1270 } 1271 #pragma omp parallel for 1272 for (int i = 0; i < 10; ++i) { 1273 #pragma omp sections // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} 1274 { 1275 bar(); 1276 } 1277 } 1278 #pragma omp parallel for 1279 for (int i = 0; i < 10; ++i) { 1280 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a parallel for region}} 1281 { 1282 bar(); 1283 } 1284 } 1285 #pragma omp parallel for 1286 for (int i = 0; i < 10; ++i) { 1287 #pragma omp single // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} 1288 { 1289 bar(); 1290 } 1291 } 1292 1293 #pragma omp parallel for 1294 for (int i = 0; i < 10; ++i) { 1295 #pragma omp master // expected-error {{region cannot be closely nested inside 'parallel for' region}} 1296 { 1297 bar(); 1298 } 1299 } 1300 1301 #pragma omp parallel for 1302 for (int i = 0; i < 10; ++i) { 1303 #pragma omp critical 1304 { 1305 bar(); 1306 } 1307 } 1308 1309 #pragma omp parallel for 1310 for (int i = 0; i < 10; ++i) { 1311 #pragma omp parallel 1312 { 1313 #pragma omp single // OK 1314 { 1315 bar(); 1316 } 1317 #pragma omp for // OK 1318 for (int i = 0; i < 10; ++i) 1319 ; 1320 #pragma omp for simd // OK 1321 for (int i = 0; i < 10; ++i) 1322 ; 1323 #pragma omp sections // OK 1324 { 1325 bar(); 1326 } 1327 } 1328 } 1329 #pragma omp parallel for 1330 for (int i = 0; i < 10; ++i) { 1331 #pragma omp parallel for 1332 for (int i = 0; i < 10; ++i) 1333 ; 1334 } 1335 #pragma omp parallel for 1336 for (int i = 0; i < 10; ++i) { 1337 #pragma omp parallel for simd 1338 for (int i = 0; i < 10; ++i) 1339 ; 1340 } 1341 #pragma omp parallel for 1342 for (int i = 0; i < 10; ++i) { 1343 #pragma omp parallel sections 1344 { 1345 bar(); 1346 } 1347 } 1348 #pragma omp parallel for 1349 for (int i = 0; i < 10; ++i) { 1350 #pragma omp task 1351 { 1352 bar(); 1353 } 1354 } 1355 #pragma omp parallel for 1356 for (int i = 0; i < 10; ++i) { 1357 #pragma omp taskyield 1358 bar(); 1359 } 1360 #pragma omp parallel for 1361 for (int i = 0; i < 10; ++i) { 1362 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'parallel for' region}} 1363 bar(); 1364 } 1365 #pragma omp parallel for 1366 for (int i = 0; i < 10; ++i) { 1367 #pragma omp taskwait 1368 bar(); 1369 } 1370 #pragma omp parallel for 1371 for (int i = 0; i < 10; ++i) { 1372 #pragma omp flush 1373 bar(); 1374 } 1375 #pragma omp parallel for 1376 for (int i = 0; i < 10; ++i) { 1377 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} 1378 bar(); 1379 } 1380 #pragma omp parallel for ordered 1381 for (int i = 0; i < 10; ++i) { 1382 #pragma omp ordered // OK 1383 bar(); 1384 } 1385 #pragma omp parallel for 1386 for (int i = 0; i < 10; ++i) { 1387 #pragma omp atomic 1388 ++a; 1389 } 1390 #pragma omp parallel for 1391 for (int i = 0; i < 10; ++i) { 1392 #pragma omp target 1393 ++a; 1394 } 1395 1396 // PARALLEL FOR SIMD DIRECTIVE 1397 #pragma omp parallel for simd 1398 for (int i = 0; i < 10; ++i) { 1399 #pragma omp for // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1400 for (int i = 0; i < 10; ++i) 1401 ; 1402 } 1403 #pragma omp parallel for simd 1404 for (int i = 0; i < 10; ++i) { 1405 #pragma omp simd// expected-error {{OpenMP constructs may not be nested inside a simd region}} 1406 for (int i = 0; i < 10; ++i) 1407 ; 1408 } 1409 #pragma omp parallel for simd 1410 for (int i = 0; i < 10; ++i) { 1411 #pragma omp for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1412 for (int i = 0; i < 10; ++i) 1413 ; 1414 } 1415 #pragma omp parallel for simd 1416 for (int i = 0; i < 10; ++i) { 1417 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1418 for (int i = 0; i < 10; ++i) 1419 ; 1420 } 1421 #pragma omp parallel for simd 1422 for (int i = 0; i < 10; ++i) { 1423 #pragma omp sections // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1424 { 1425 bar(); 1426 } 1427 } 1428 #pragma omp parallel for simd 1429 for (int i = 0; i < 10; ++i) { 1430 #pragma omp section // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1431 { 1432 bar(); 1433 } 1434 } 1435 #pragma omp parallel for simd 1436 for (int i = 0; i < 10; ++i) { 1437 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1438 { 1439 bar(); 1440 } 1441 } 1442 1443 #pragma omp parallel for simd 1444 for (int i = 0; i < 10; ++i) { 1445 #pragma omp master // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1446 { 1447 bar(); 1448 } 1449 } 1450 1451 #pragma omp parallel for simd 1452 for (int i = 0; i < 10; ++i) { 1453 #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1454 { 1455 bar(); 1456 } 1457 } 1458 1459 #pragma omp parallel for simd 1460 for (int i = 0; i < 10; ++i) { 1461 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1462 { 1463 #pragma omp single 1464 { 1465 bar(); 1466 } 1467 #pragma omp for 1468 for (int i = 0; i < 10; ++i) 1469 ; 1470 #pragma omp for simd 1471 for (int i = 0; i < 10; ++i) 1472 ; 1473 #pragma omp sections 1474 { 1475 bar(); 1476 } 1477 } 1478 } 1479 #pragma omp parallel for simd 1480 for (int i = 0; i < 10; ++i) { 1481 #pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1482 for (int i = 0; i < 10; ++i) 1483 ; 1484 } 1485 #pragma omp parallel for simd 1486 for (int i = 0; i < 10; ++i) { 1487 #pragma omp parallel for simd// expected-error {{OpenMP constructs may not be nested inside a simd region}} 1488 for (int i = 0; i < 10; ++i) 1489 ; 1490 } 1491 #pragma omp parallel for simd 1492 for (int i = 0; i < 10; ++i) { 1493 #pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1494 { 1495 bar(); 1496 } 1497 } 1498 #pragma omp parallel for simd 1499 for (int i = 0; i < 10; ++i) { 1500 #pragma omp task // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1501 { 1502 bar(); 1503 } 1504 } 1505 #pragma omp parallel for simd 1506 for (int i = 0; i < 10; ++i) { 1507 #pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1508 bar(); 1509 } 1510 #pragma omp parallel for simd 1511 for (int i = 0; i < 10; ++i) { 1512 #pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1513 bar(); 1514 } 1515 #pragma omp parallel for simd 1516 for (int i = 0; i < 10; ++i) { 1517 #pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1518 bar(); 1519 } 1520 #pragma omp parallel for simd 1521 for (int i = 0; i < 10; ++i) { 1522 #pragma omp flush // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1523 bar(); 1524 } 1525 #pragma omp parallel for simd 1526 for (int i = 0; i < 10; ++i) { 1527 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1528 bar(); 1529 } 1530 #pragma omp parallel for simd 1531 for (int i = 0; i < 10; ++i) { 1532 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1533 bar(); 1534 } 1535 #pragma omp parallel for simd 1536 for (int i = 0; i < 10; ++i) { 1537 #pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1538 ++a; 1539 } 1540 #pragma omp parallel for simd 1541 for (int i = 0; i < 10; ++i) { 1542 #pragma omp target // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1543 ++a; 1544 } 1545 1546 // PARALLEL SECTIONS DIRECTIVE 1547 #pragma omp parallel sections 1548 { 1549 #pragma omp for // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} 1550 for (int i = 0; i < 10; ++i) 1551 ; 1552 } 1553 #pragma omp parallel sections 1554 { 1555 #pragma omp simd 1556 for (int i = 0; i < 10; ++i) 1557 ; 1558 } 1559 #pragma omp parallel sections 1560 { 1561 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} 1562 for (int i = 0; i < 10; ++i) 1563 ; 1564 } 1565 #pragma omp parallel sections 1566 { 1567 #pragma omp parallel 1568 for (int i = 0; i < 10; ++i) 1569 ; 1570 } 1571 #pragma omp parallel sections 1572 { 1573 #pragma omp sections // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} 1574 { 1575 bar(); 1576 } 1577 } 1578 #pragma omp parallel sections 1579 { 1580 #pragma omp section 1581 { 1582 bar(); 1583 } 1584 } 1585 #pragma omp parallel sections 1586 { 1587 #pragma omp section 1588 { 1589 #pragma omp single // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} 1590 bar(); 1591 } 1592 } 1593 #pragma omp parallel sections 1594 { 1595 #pragma omp section 1596 { 1597 #pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}} 1598 bar(); 1599 } 1600 } 1601 #pragma omp parallel sections 1602 { 1603 #pragma omp section 1604 { 1605 #pragma omp critical 1606 bar(); 1607 } 1608 } 1609 #pragma omp parallel sections 1610 { 1611 #pragma omp parallel 1612 { 1613 #pragma omp single // OK 1614 { 1615 bar(); 1616 } 1617 #pragma omp for // OK 1618 for (int i = 0; i < 10; ++i) 1619 ; 1620 #pragma omp for simd // OK 1621 for (int i = 0; i < 10; ++i) 1622 ; 1623 #pragma omp sections // OK 1624 { 1625 bar(); 1626 } 1627 } 1628 } 1629 #pragma omp parallel sections 1630 { 1631 #pragma omp parallel for 1632 for (int i = 0; i < 10; ++i) 1633 ; 1634 } 1635 #pragma omp parallel sections 1636 { 1637 #pragma omp parallel for simd 1638 for (int i = 0; i < 10; ++i) 1639 ; 1640 } 1641 #pragma omp parallel sections 1642 { 1643 #pragma omp parallel sections 1644 { 1645 bar(); 1646 } 1647 } 1648 #pragma omp parallel sections 1649 { 1650 #pragma omp task 1651 { 1652 bar(); 1653 } 1654 } 1655 #pragma omp parallel sections 1656 { 1657 #pragma omp taskyield 1658 } 1659 #pragma omp parallel sections 1660 { 1661 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'parallel sections' region}} 1662 } 1663 #pragma omp parallel sections 1664 { 1665 #pragma omp taskwait 1666 } 1667 #pragma omp parallel sections 1668 { 1669 #pragma omp flush 1670 } 1671 #pragma omp parallel sections 1672 { 1673 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} 1674 bar(); 1675 } 1676 #pragma omp parallel sections 1677 { 1678 #pragma omp atomic 1679 ++a; 1680 } 1681 #pragma omp parallel sections 1682 { 1683 #pragma omp target 1684 ++a; 1685 } 1686 1687 // TASK DIRECTIVE 1688 #pragma omp task 1689 #pragma omp for // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} 1690 for (int i = 0; i < 10; ++i) 1691 ; 1692 #pragma omp task 1693 #pragma omp simd 1694 for (int i = 0; i < 10; ++i) 1695 ; 1696 #pragma omp task 1697 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} 1698 for (int i = 0; i < 10; ++i) 1699 ; 1700 #pragma omp task 1701 #pragma omp sections // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} 1702 { 1703 bar(); 1704 } 1705 #pragma omp task 1706 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a task region}} 1707 { 1708 bar(); 1709 } 1710 #pragma omp task 1711 #pragma omp single // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} 1712 bar(); 1713 #pragma omp task 1714 #pragma omp master // expected-error {{region cannot be closely nested inside 'task' region}} 1715 bar(); 1716 #pragma omp task 1717 #pragma omp critical 1718 bar(); 1719 1720 #pragma omp task 1721 #pragma omp parallel for 1722 for (int i = 0; i < 10; ++i) 1723 ; 1724 #pragma omp task 1725 #pragma omp parallel for simd 1726 for (int i = 0; i < 10; ++i) 1727 ; 1728 #pragma omp task 1729 #pragma omp parallel sections 1730 { 1731 bar(); 1732 } 1733 #pragma omp task 1734 #pragma omp task 1735 { 1736 bar(); 1737 } 1738 #pragma omp task 1739 { 1740 #pragma omp taskyield 1741 bar(); 1742 } 1743 #pragma omp task 1744 { 1745 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'task' region}} 1746 bar(); 1747 } 1748 #pragma omp task 1749 { 1750 #pragma omp taskwait 1751 bar(); 1752 } 1753 #pragma omp task 1754 { 1755 #pragma omp flush 1756 bar(); 1757 } 1758 #pragma omp task 1759 { 1760 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} 1761 bar(); 1762 } 1763 #pragma omp task 1764 { 1765 #pragma omp atomic 1766 ++a; 1767 } 1768 #pragma omp task 1769 { 1770 #pragma omp target 1771 ++a; 1772 } 1773 1774 // ORDERED DIRECTIVE 1775 #pragma omp ordered 1776 { 1777 #pragma omp for // expected-error {{region cannot be closely nested inside 'ordered' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} 1778 for (int i = 0; i < 10; ++i) 1779 ; 1780 } 1781 #pragma omp ordered 1782 { 1783 #pragma omp simd 1784 for (int i = 0; i < 10; ++i) 1785 ; 1786 } 1787 #pragma omp ordered 1788 { 1789 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'ordered' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} 1790 for (int i = 0; i < 10; ++i) 1791 ; 1792 } 1793 #pragma omp ordered 1794 { 1795 #pragma omp parallel 1796 for (int i = 0; i < 10; ++i) 1797 ; 1798 } 1799 #pragma omp ordered 1800 { 1801 #pragma omp single // expected-error {{region cannot be closely nested inside 'ordered' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} 1802 { 1803 bar(); 1804 } 1805 } 1806 #pragma omp ordered 1807 { 1808 #pragma omp master // OK, though second 'ordered' is redundant 1809 { 1810 bar(); 1811 } 1812 } 1813 #pragma omp ordered 1814 { 1815 #pragma omp critical 1816 { 1817 bar(); 1818 } 1819 } 1820 #pragma omp ordered 1821 { 1822 #pragma omp sections // expected-error {{region cannot be closely nested inside 'ordered' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} 1823 { 1824 bar(); 1825 } 1826 } 1827 #pragma omp ordered 1828 { 1829 #pragma omp parallel for ordered 1830 for (int j = 0; j < 10; ++j) { 1831 #pragma omp ordered // OK 1832 { 1833 bar(); 1834 } 1835 } 1836 } 1837 #pragma omp ordered 1838 { 1839 #pragma omp parallel for simd ordered //expected-error {{unexpected OpenMP clause 'ordered' in directive '#pragma omp parallel for simd'}} 1840 for (int j = 0; j < 10; ++j) { 1841 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1842 { 1843 bar(); 1844 } 1845 } 1846 } 1847 #pragma omp ordered 1848 { 1849 #pragma omp parallel for 1850 for (int i = 0; i < 10; ++i) 1851 ; 1852 } 1853 #pragma omp ordered 1854 { 1855 #pragma omp parallel for simd 1856 for (int i = 0; i < 10; ++i) 1857 ; 1858 } 1859 #pragma omp ordered 1860 { 1861 #pragma omp parallel sections 1862 { 1863 bar(); 1864 } 1865 } 1866 #pragma omp ordered 1867 { 1868 #pragma omp task 1869 { 1870 bar(); 1871 } 1872 } 1873 #pragma omp ordered 1874 { 1875 #pragma omp taskyield 1876 bar(); 1877 } 1878 #pragma omp ordered 1879 { 1880 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'ordered' region}} 1881 bar(); 1882 } 1883 #pragma omp ordered 1884 { 1885 #pragma omp taskwait 1886 bar(); 1887 } 1888 #pragma omp ordered 1889 { 1890 #pragma omp flush 1891 bar(); 1892 } 1893 #pragma omp ordered 1894 { 1895 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'ordered' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} 1896 bar(); 1897 } 1898 #pragma omp ordered 1899 { 1900 #pragma omp atomic 1901 ++a; 1902 } 1903 #pragma omp ordered 1904 { 1905 #pragma omp target 1906 ++a; 1907 } 1908 1909 // ATOMIC DIRECTIVE 1910 #pragma omp atomic 1911 // expected-error@+1 {{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}} 1912 { 1913 #pragma omp for // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1914 for (int i = 0; i < 10; ++i) 1915 ; 1916 } 1917 #pragma omp atomic 1918 // expected-error@+1 {{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}} 1919 { 1920 #pragma omp simd // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1921 for (int i = 0; i < 10; ++i) 1922 ; 1923 } 1924 #pragma omp atomic 1925 // expected-error@+1 {{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}} 1926 { 1927 #pragma omp for simd // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1928 for (int i = 0; i < 10; ++i) 1929 ; 1930 } 1931 #pragma omp atomic 1932 // expected-error@+1 {{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}} 1933 { 1934 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1935 for (int i = 0; i < 10; ++i) 1936 ; 1937 } 1938 #pragma omp atomic 1939 // expected-error@+1 {{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}} 1940 { 1941 #pragma omp sections // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1942 { 1943 bar(); 1944 } 1945 } 1946 #pragma omp atomic 1947 // expected-error@+1 {{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}} 1948 { 1949 #pragma omp section // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1950 { 1951 bar(); 1952 } 1953 } 1954 #pragma omp atomic 1955 // expected-error@+1 {{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}} 1956 { 1957 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1958 { 1959 bar(); 1960 } 1961 } 1962 #pragma omp atomic 1963 // expected-error@+1 {{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}} 1964 { 1965 #pragma omp master // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1966 { 1967 bar(); 1968 } 1969 } 1970 #pragma omp atomic 1971 // expected-error@+1 {{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}} 1972 { 1973 #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1974 { 1975 bar(); 1976 } 1977 } 1978 #pragma omp atomic 1979 // expected-error@+1 {{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}} 1980 { 1981 #pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1982 for (int i = 0; i < 10; ++i) 1983 ; 1984 } 1985 #pragma omp atomic 1986 // expected-error@+1 {{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}} 1987 { 1988 #pragma omp parallel for simd // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1989 for (int i = 0; i < 10; ++i) 1990 ; 1991 } 1992 #pragma omp atomic 1993 // expected-error@+1 {{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}} 1994 { 1995 #pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1996 { 1997 bar(); 1998 } 1999 } 2000 #pragma omp atomic 2001 // expected-error@+1 {{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}} 2002 { 2003 #pragma omp task // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 2004 { 2005 bar(); 2006 } 2007 } 2008 #pragma omp atomic 2009 // expected-error@+1 {{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}} 2010 { 2011 #pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 2012 bar(); 2013 } 2014 #pragma omp atomic 2015 // expected-error@+1 {{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}} 2016 { 2017 #pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 2018 bar(); 2019 } 2020 #pragma omp atomic 2021 // expected-error@+1 {{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}} 2022 { 2023 #pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 2024 bar(); 2025 } 2026 #pragma omp atomic 2027 // expected-error@+1 {{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}} 2028 { 2029 #pragma omp flush // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 2030 bar(); 2031 } 2032 #pragma omp atomic 2033 // expected-error@+1 {{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}} 2034 { 2035 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 2036 bar(); 2037 } 2038 #pragma omp atomic 2039 // expected-error@+1 {{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}} 2040 { 2041 #pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 2042 ++a; 2043 } 2044 #pragma omp atomic 2045 // expected-error@+1 {{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}} 2046 { 2047 #pragma omp target // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 2048 ++a; 2049 } 2050 2051 // TARGET DIRECTIVE 2052 #pragma omp target 2053 #pragma omp parallel 2054 bar(); 2055 #pragma omp target 2056 #pragma omp for 2057 for (int i = 0; i < 10; ++i) 2058 ; 2059 #pragma omp target 2060 #pragma omp simd 2061 for (int i = 0; i < 10; ++i) 2062 ; 2063 #pragma omp target 2064 #pragma omp for simd 2065 for (int i = 0; i < 10; ++i) 2066 ; 2067 #pragma omp target 2068 #pragma omp sections 2069 { 2070 bar(); 2071 } 2072 #pragma omp target 2073 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a target region}} 2074 { 2075 bar(); 2076 } 2077 #pragma omp target 2078 #pragma omp single 2079 bar(); 2080 2081 #pragma omp target 2082 #pragma omp master 2083 { 2084 bar(); 2085 } 2086 #pragma omp target 2087 #pragma omp critical 2088 { 2089 bar(); 2090 } 2091 #pragma omp target 2092 #pragma omp parallel for 2093 for (int i = 0; i < 10; ++i) 2094 ; 2095 #pragma omp target 2096 #pragma omp parallel for simd 2097 for (int i = 0; i < 10; ++i) 2098 ; 2099 #pragma omp target 2100 #pragma omp parallel sections 2101 { 2102 bar(); 2103 } 2104 #pragma omp target 2105 #pragma omp task 2106 { 2107 bar(); 2108 } 2109 #pragma omp target 2110 { 2111 #pragma omp taskyield 2112 bar(); 2113 } 2114 #pragma omp target 2115 { 2116 #pragma omp barrier 2117 bar(); 2118 } 2119 #pragma omp target 2120 { 2121 #pragma omp taskwait 2122 bar(); 2123 } 2124 #pragma omp target 2125 { 2126 #pragma omp flush 2127 bar(); 2128 } 2129 #pragma omp target 2130 { 2131 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'target' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} 2132 bar(); 2133 } 2134 #pragma omp target 2135 { 2136 #pragma omp atomic 2137 ++a; 2138 } 2139 #pragma omp target 2140 { 2141 #pragma omp target 2142 ++a; 2143 } 2144 } 2145 2146 void foo() { 2147 int a = 0; 2148 // PARALLEL DIRECTIVE 2149 #pragma omp parallel 2150 #pragma omp for 2151 for (int i = 0; i < 10; ++i) 2152 ; 2153 #pragma omp parallel 2154 #pragma omp simd 2155 for (int i = 0; i < 10; ++i) 2156 ; 2157 #pragma omp parallel 2158 #pragma omp for simd 2159 for (int i = 0; i < 10; ++i) 2160 ; 2161 #pragma omp parallel 2162 #pragma omp sections 2163 { 2164 bar(); 2165 } 2166 #pragma omp parallel 2167 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a parallel region}} 2168 { 2169 bar(); 2170 } 2171 #pragma omp parallel 2172 #pragma omp sections 2173 { 2174 bar(); 2175 } 2176 #pragma omp parallel 2177 #pragma omp single 2178 bar(); 2179 #pragma omp parallel 2180 #pragma omp master 2181 bar(); 2182 #pragma omp parallel 2183 #pragma omp critical 2184 bar(); 2185 #pragma omp parallel 2186 #pragma omp parallel for 2187 for (int i = 0; i < 10; ++i) 2188 ; 2189 #pragma omp parallel 2190 #pragma omp parallel for simd 2191 for (int i = 0; i < 10; ++i) 2192 ; 2193 #pragma omp parallel 2194 #pragma omp parallel sections 2195 { 2196 bar(); 2197 } 2198 #pragma omp parallel 2199 #pragma omp task 2200 { 2201 bar(); 2202 } 2203 #pragma omp parallel 2204 { 2205 #pragma omp taskyield 2206 bar(); 2207 } 2208 #pragma omp parallel 2209 { 2210 #pragma omp barrier 2211 bar(); 2212 } 2213 #pragma omp parallel 2214 { 2215 #pragma omp taskwait 2216 bar(); 2217 } 2218 #pragma omp parallel 2219 { 2220 #pragma omp flush 2221 bar(); 2222 } 2223 #pragma omp parallel 2224 { 2225 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'parallel' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} 2226 bar(); 2227 } 2228 #pragma omp parallel 2229 { 2230 #pragma omp atomic 2231 ++a; 2232 } 2233 #pragma omp parallel 2234 { 2235 #pragma omp target 2236 ++a; 2237 } 2238 2239 // SIMD DIRECTIVE 2240 #pragma omp simd 2241 for (int i = 0; i < 10; ++i) { 2242 #pragma omp for // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2243 for (int i = 0; i < 10; ++i) 2244 ; 2245 } 2246 #pragma omp simd 2247 for (int i = 0; i < 10; ++i) { 2248 #pragma omp simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2249 for (int i = 0; i < 10; ++i) 2250 ; 2251 } 2252 #pragma omp simd 2253 for (int i = 0; i < 10; ++i) { 2254 #pragma omp for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2255 for (int i = 0; i < 10; ++i) 2256 ; 2257 } 2258 #pragma omp simd 2259 for (int i = 0; i < 10; ++i) { 2260 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2261 for (int i = 0; i < 10; ++i) 2262 ; 2263 } 2264 #pragma omp simd 2265 for (int i = 0; i < 10; ++i) { 2266 #pragma omp sections // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2267 { 2268 bar(); 2269 } 2270 } 2271 #pragma omp simd 2272 for (int i = 0; i < 10; ++i) { 2273 #pragma omp section // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2274 { 2275 bar(); 2276 } 2277 } 2278 #pragma omp simd 2279 for (int i = 0; i < 10; ++i) { 2280 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2281 bar(); 2282 #pragma omp master // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2283 bar(); 2284 } 2285 #pragma omp simd 2286 for (int i = 0; i < 10; ++i) { 2287 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2288 bar(); 2289 #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2290 bar(); 2291 } 2292 #pragma omp simd 2293 for (int i = 0; i < 10; ++i) { 2294 #pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2295 for (int i = 0; i < 10; ++i) 2296 ; 2297 } 2298 #pragma omp simd 2299 for (int i = 0; i < 10; ++i) { 2300 #pragma omp parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2301 for (int i = 0; i < 10; ++i) 2302 ; 2303 } 2304 #pragma omp simd 2305 for (int i = 0; i < 10; ++i) { 2306 #pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2307 { 2308 bar(); 2309 } 2310 } 2311 #pragma omp simd 2312 for (int i = 0; i < 10; ++i) { 2313 #pragma omp task // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2314 { 2315 bar(); 2316 } 2317 } 2318 #pragma omp simd 2319 for (int i = 0; i < 10; ++i) { 2320 #pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2321 bar(); 2322 } 2323 #pragma omp simd 2324 for (int i = 0; i < 10; ++i) { 2325 #pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2326 bar(); 2327 } 2328 #pragma omp simd 2329 for (int i = 0; i < 10; ++i) { 2330 #pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2331 bar(); 2332 } 2333 #pragma omp simd 2334 for (int i = 0; i < 10; ++i) { 2335 #pragma omp flush // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2336 bar(); 2337 } 2338 #pragma omp simd 2339 for (int i = 0; i < 10; ++i) { 2340 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2341 bar(); 2342 } 2343 #pragma omp simd 2344 for (int i = 0; i < 10; ++i) { 2345 #pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2346 ++a; 2347 } 2348 #pragma omp simd 2349 for (int i = 0; i < 10; ++i) { 2350 #pragma omp target // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2351 ++a; 2352 } 2353 2354 // FOR DIRECTIVE 2355 #pragma omp for 2356 for (int i = 0; i < 10; ++i) { 2357 #pragma omp for // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} 2358 for (int i = 0; i < 10; ++i) 2359 ; 2360 } 2361 #pragma omp for 2362 for (int i = 0; i < 10; ++i) { 2363 #pragma omp simd 2364 for (int i = 0; i < 10; ++i) 2365 ; 2366 } 2367 #pragma omp for 2368 for (int i = 0; i < 10; ++i) { 2369 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} 2370 for (int i = 0; i < 10; ++i) 2371 ; 2372 } 2373 #pragma omp for 2374 for (int i = 0; i < 10; ++i) { 2375 #pragma omp parallel 2376 for (int i = 0; i < 10; ++i) 2377 ; 2378 } 2379 #pragma omp for 2380 for (int i = 0; i < 10; ++i) { 2381 #pragma omp sections // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} 2382 { 2383 bar(); 2384 } 2385 } 2386 #pragma omp for 2387 for (int i = 0; i < 10; ++i) { 2388 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a for region}} 2389 { 2390 bar(); 2391 } 2392 } 2393 #pragma omp for 2394 for (int i = 0; i < 10; ++i) { 2395 #pragma omp single // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} 2396 bar(); 2397 #pragma omp master // expected-error {{region cannot be closely nested inside 'for' region}} 2398 bar(); 2399 #pragma omp critical 2400 bar(); 2401 } 2402 #pragma omp for 2403 for (int i = 0; i < 10; ++i) { 2404 #pragma omp parallel 2405 { 2406 #pragma omp single // OK 2407 { 2408 bar(); 2409 } 2410 #pragma omp for // OK 2411 for (int i = 0; i < 10; ++i) 2412 ; 2413 #pragma omp for simd // OK 2414 for (int i = 0; i < 10; ++i) 2415 ; 2416 #pragma omp sections // OK 2417 { 2418 bar(); 2419 } 2420 } 2421 } 2422 #pragma omp for 2423 for (int i = 0; i < 10; ++i) { 2424 #pragma omp parallel for 2425 for (int i = 0; i < 10; ++i) 2426 ; 2427 } 2428 #pragma omp for 2429 for (int i = 0; i < 10; ++i) { 2430 #pragma omp parallel for simd 2431 for (int i = 0; i < 10; ++i) 2432 ; 2433 } 2434 #pragma omp for 2435 for (int i = 0; i < 10; ++i) { 2436 #pragma omp parallel sections 2437 { 2438 bar(); 2439 } 2440 } 2441 #pragma omp for 2442 for (int i = 0; i < 10; ++i) { 2443 #pragma omp task 2444 { 2445 bar(); 2446 } 2447 } 2448 #pragma omp for 2449 for (int i = 0; i < 10; ++i) { 2450 #pragma omp taskyield 2451 bar(); 2452 } 2453 #pragma omp for 2454 for (int i = 0; i < 10; ++i) { 2455 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'for' region}} 2456 bar(); 2457 } 2458 #pragma omp for 2459 for (int i = 0; i < 10; ++i) { 2460 #pragma omp taskwait 2461 bar(); 2462 } 2463 #pragma omp for 2464 for (int i = 0; i < 10; ++i) { 2465 #pragma omp flush 2466 bar(); 2467 } 2468 #pragma omp for 2469 for (int i = 0; i < 10; ++i) { 2470 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} 2471 bar(); 2472 } 2473 #pragma omp for ordered 2474 for (int i = 0; i < 10; ++i) { 2475 #pragma omp ordered // OK 2476 bar(); 2477 } 2478 #pragma omp for 2479 for (int i = 0; i < 10; ++i) { 2480 #pragma omp atomic 2481 ++a; 2482 } 2483 #pragma omp for 2484 for (int i = 0; i < 10; ++i) { 2485 #pragma omp target 2486 ++a; 2487 } 2488 2489 // FOR SIMD DIRECTIVE 2490 #pragma omp for simd 2491 for (int i = 0; i < 10; ++i) { 2492 #pragma omp for // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2493 for (int i = 0; i < 10; ++i) 2494 ; 2495 } 2496 #pragma omp for simd 2497 for (int i = 0; i < 10; ++i) { 2498 #pragma omp simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2499 for (int i = 0; i < 10; ++i) 2500 ; 2501 } 2502 #pragma omp for simd 2503 for (int i = 0; i < 10; ++i) { 2504 #pragma omp for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2505 for (int i = 0; i < 10; ++i) 2506 ; 2507 } 2508 #pragma omp for simd 2509 for (int i = 0; i < 10; ++i) { 2510 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2511 for (int i = 0; i < 10; ++i) 2512 ; 2513 } 2514 #pragma omp for simd 2515 for (int i = 0; i < 10; ++i) { 2516 #pragma omp sections // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2517 { 2518 bar(); 2519 } 2520 } 2521 #pragma omp for simd 2522 for (int i = 0; i < 10; ++i) { 2523 #pragma omp section // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2524 { 2525 bar(); 2526 } 2527 } 2528 #pragma omp for simd 2529 for (int i = 0; i < 10; ++i) { 2530 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2531 bar(); 2532 #pragma omp master // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2533 bar(); 2534 } 2535 #pragma omp for simd 2536 for (int i = 0; i < 10; ++i) { 2537 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2538 bar(); 2539 #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2540 bar(); 2541 } 2542 #pragma omp for simd 2543 for (int i = 0; i < 10; ++i) { 2544 #pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2545 for (int i = 0; i < 10; ++i) 2546 ; 2547 } 2548 #pragma omp for simd 2549 for (int i = 0; i < 10; ++i) { 2550 #pragma omp parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2551 for (int i = 0; i < 10; ++i) 2552 ; 2553 } 2554 #pragma omp for simd 2555 for (int i = 0; i < 10; ++i) { 2556 #pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2557 { 2558 bar(); 2559 } 2560 } 2561 #pragma omp for simd 2562 for (int i = 0; i < 10; ++i) { 2563 #pragma omp task // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2564 { 2565 bar(); 2566 } 2567 } 2568 #pragma omp for simd 2569 for (int i = 0; i < 10; ++i) { 2570 #pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2571 bar(); 2572 } 2573 #pragma omp for simd 2574 for (int i = 0; i < 10; ++i) { 2575 #pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2576 bar(); 2577 } 2578 #pragma omp for simd 2579 for (int i = 0; i < 10; ++i) { 2580 #pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2581 bar(); 2582 } 2583 #pragma omp for simd 2584 for (int i = 0; i < 10; ++i) { 2585 #pragma omp flush // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2586 bar(); 2587 } 2588 #pragma omp for simd 2589 for (int i = 0; i < 10; ++i) { 2590 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2591 bar(); 2592 } 2593 #pragma omp for simd 2594 for (int i = 0; i < 10; ++i) { 2595 #pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2596 ++a; 2597 } 2598 #pragma omp for simd 2599 for (int i = 0; i < 10; ++i) { 2600 #pragma omp target // expected-error {{OpenMP constructs may not be nested inside a simd region}} 2601 ++a; 2602 } 2603 2604 // SECTIONS DIRECTIVE 2605 #pragma omp sections 2606 { 2607 #pragma omp for // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} 2608 for (int i = 0; i < 10; ++i) 2609 ; 2610 } 2611 #pragma omp sections 2612 { 2613 #pragma omp simd 2614 for (int i = 0; i < 10; ++i) 2615 ; 2616 } 2617 #pragma omp sections 2618 { 2619 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} 2620 for (int i = 0; i < 10; ++i) 2621 ; 2622 } 2623 #pragma omp sections 2624 { 2625 #pragma omp parallel 2626 for (int i = 0; i < 10; ++i) 2627 ; 2628 } 2629 #pragma omp sections 2630 { 2631 #pragma omp sections // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} 2632 { 2633 bar(); 2634 } 2635 } 2636 #pragma omp sections 2637 { 2638 #pragma omp section 2639 { 2640 bar(); 2641 } 2642 } 2643 #pragma omp sections 2644 { 2645 #pragma omp critical 2646 bar(); 2647 #pragma omp single // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} 2648 bar(); 2649 #pragma omp master // expected-error {{region cannot be closely nested inside 'sections' region}} 2650 bar(); 2651 } 2652 #pragma omp sections 2653 { 2654 #pragma omp parallel 2655 { 2656 #pragma omp single // OK 2657 { 2658 bar(); 2659 } 2660 #pragma omp for // OK 2661 for (int i = 0; i < 10; ++i) 2662 ; 2663 #pragma omp for simd // OK 2664 for (int i = 0; i < 10; ++i) 2665 ; 2666 #pragma omp sections // OK 2667 { 2668 bar(); 2669 } 2670 } 2671 } 2672 #pragma omp sections 2673 { 2674 #pragma omp parallel for 2675 for (int i = 0; i < 10; ++i) 2676 ; 2677 } 2678 #pragma omp sections 2679 { 2680 #pragma omp parallel for simd 2681 for (int i = 0; i < 10; ++i) 2682 ; 2683 } 2684 #pragma omp sections 2685 { 2686 #pragma omp parallel sections 2687 { 2688 bar(); 2689 } 2690 } 2691 #pragma omp sections 2692 { 2693 #pragma omp task 2694 { 2695 bar(); 2696 } 2697 } 2698 #pragma omp sections 2699 { 2700 #pragma omp taskyield 2701 } 2702 #pragma omp sections 2703 { 2704 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'sections' region}} 2705 bar(); 2706 } 2707 #pragma omp sections 2708 { 2709 #pragma omp taskwait 2710 } 2711 #pragma omp sections 2712 { 2713 #pragma omp flush 2714 } 2715 #pragma omp sections 2716 { 2717 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} 2718 bar(); 2719 } 2720 #pragma omp sections 2721 { 2722 #pragma omp atomic 2723 ++a; 2724 } 2725 #pragma omp sections 2726 { 2727 #pragma omp target 2728 ++a; 2729 } 2730 2731 // SECTION DIRECTIVE 2732 #pragma omp section // expected-error {{orphaned 'omp section' directives are prohibited, it must be closely nested to a sections region}} 2733 { 2734 bar(); 2735 } 2736 #pragma omp sections 2737 { 2738 #pragma omp section 2739 { 2740 #pragma omp for // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} 2741 for (int i = 0; i < 10; ++i) 2742 ; 2743 } 2744 } 2745 #pragma omp sections 2746 { 2747 #pragma omp section 2748 { 2749 #pragma omp simd 2750 for (int i = 0; i < 10; ++i) 2751 ; 2752 } 2753 } 2754 #pragma omp sections 2755 { 2756 #pragma omp section 2757 { 2758 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} 2759 for (int i = 0; i < 10; ++i) 2760 ; 2761 } 2762 } 2763 #pragma omp sections 2764 { 2765 #pragma omp section 2766 { 2767 #pragma omp parallel 2768 for (int i = 0; i < 10; ++i) 2769 ; 2770 } 2771 } 2772 #pragma omp sections 2773 { 2774 #pragma omp section 2775 { 2776 #pragma omp sections // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} 2777 { 2778 bar(); 2779 } 2780 } 2781 } 2782 #pragma omp sections 2783 { 2784 #pragma omp section 2785 { 2786 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a section region}} 2787 { 2788 bar(); 2789 } 2790 } 2791 } 2792 #pragma omp sections 2793 { 2794 #pragma omp section 2795 { 2796 #pragma omp single // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} 2797 bar(); 2798 #pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}} 2799 bar(); 2800 #pragma omp critical 2801 bar(); 2802 } 2803 } 2804 #pragma omp sections 2805 { 2806 #pragma omp section 2807 { 2808 #pragma omp parallel 2809 { 2810 #pragma omp single // OK 2811 { 2812 bar(); 2813 } 2814 #pragma omp for // OK 2815 for (int i = 0; i < 10; ++i) 2816 ; 2817 #pragma omp for simd // OK 2818 for (int i = 0; i < 10; ++i) 2819 ; 2820 #pragma omp sections // OK 2821 { 2822 bar(); 2823 } 2824 } 2825 } 2826 } 2827 #pragma omp sections 2828 { 2829 #pragma omp section 2830 { 2831 #pragma omp parallel for 2832 for (int i = 0; i < 10; ++i) 2833 ; 2834 } 2835 } 2836 #pragma omp sections 2837 { 2838 #pragma omp section 2839 { 2840 #pragma omp parallel for simd 2841 for (int i = 0; i < 10; ++i) 2842 ; 2843 } 2844 } 2845 #pragma omp sections 2846 { 2847 #pragma omp section 2848 { 2849 #pragma omp parallel sections 2850 { 2851 bar(); 2852 } 2853 } 2854 } 2855 #pragma omp sections 2856 { 2857 #pragma omp section 2858 { 2859 #pragma omp task 2860 { 2861 bar(); 2862 } 2863 } 2864 } 2865 #pragma omp sections 2866 { 2867 #pragma omp section 2868 { 2869 #pragma omp taskyield 2870 bar(); 2871 } 2872 } 2873 #pragma omp sections 2874 { 2875 #pragma omp section 2876 { 2877 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'section' region}} 2878 bar(); 2879 } 2880 } 2881 #pragma omp sections 2882 { 2883 #pragma omp section 2884 { 2885 #pragma omp taskwait 2886 bar(); 2887 } 2888 } 2889 #pragma omp sections 2890 { 2891 #pragma omp section 2892 { 2893 #pragma omp flush 2894 bar(); 2895 } 2896 } 2897 #pragma omp sections 2898 { 2899 #pragma omp section 2900 { 2901 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} 2902 bar(); 2903 } 2904 } 2905 #pragma omp sections 2906 { 2907 #pragma omp section 2908 { 2909 #pragma omp atomic 2910 ++a; 2911 } 2912 } 2913 #pragma omp sections 2914 { 2915 #pragma omp section 2916 { 2917 #pragma omp target 2918 ++a; 2919 } 2920 } 2921 2922 // SINGLE DIRECTIVE 2923 #pragma omp single 2924 { 2925 #pragma omp for // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} 2926 for (int i = 0; i < 10; ++i) 2927 ; 2928 } 2929 #pragma omp single 2930 { 2931 #pragma omp simd 2932 for (int i = 0; i < 10; ++i) 2933 ; 2934 } 2935 #pragma omp single 2936 { 2937 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} 2938 for (int i = 0; i < 10; ++i) 2939 ; 2940 } 2941 #pragma omp single 2942 { 2943 #pragma omp parallel 2944 for (int i = 0; i < 10; ++i) 2945 ; 2946 } 2947 #pragma omp single 2948 { 2949 #pragma omp single // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} 2950 { 2951 bar(); 2952 } 2953 #pragma omp master // expected-error {{region cannot be closely nested inside 'single' region}} 2954 bar(); 2955 #pragma omp critical 2956 bar(); 2957 } 2958 #pragma omp single 2959 { 2960 #pragma omp sections // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} 2961 { 2962 bar(); 2963 } 2964 } 2965 #pragma omp single 2966 { 2967 #pragma omp parallel 2968 { 2969 #pragma omp single // OK 2970 { 2971 bar(); 2972 } 2973 #pragma omp for // OK 2974 for (int i = 0; i < 10; ++i) 2975 ; 2976 #pragma omp for simd // OK 2977 for (int i = 0; i < 10; ++i) 2978 ; 2979 #pragma omp sections // OK 2980 { 2981 bar(); 2982 } 2983 } 2984 } 2985 #pragma omp single 2986 { 2987 #pragma omp parallel for 2988 for (int i = 0; i < 10; ++i) 2989 ; 2990 } 2991 #pragma omp single 2992 { 2993 #pragma omp parallel for simd 2994 for (int i = 0; i < 10; ++i) 2995 ; 2996 } 2997 #pragma omp single 2998 { 2999 #pragma omp parallel sections 3000 { 3001 bar(); 3002 } 3003 } 3004 #pragma omp single 3005 { 3006 #pragma omp task 3007 { 3008 bar(); 3009 } 3010 } 3011 #pragma omp single 3012 { 3013 #pragma omp taskyield 3014 bar(); 3015 } 3016 #pragma omp single 3017 { 3018 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'single' region}} 3019 bar(); 3020 } 3021 #pragma omp single 3022 { 3023 #pragma omp taskwait 3024 bar(); 3025 } 3026 #pragma omp single 3027 { 3028 #pragma omp flush 3029 bar(); 3030 } 3031 #pragma omp single 3032 { 3033 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} 3034 bar(); 3035 } 3036 #pragma omp single 3037 { 3038 #pragma omp atomic 3039 ++a; 3040 } 3041 #pragma omp single 3042 { 3043 #pragma omp target 3044 ++a; 3045 } 3046 3047 // MASTER DIRECTIVE 3048 #pragma omp master 3049 { 3050 #pragma omp for // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} 3051 for (int i = 0; i < 10; ++i) 3052 ; 3053 } 3054 #pragma omp master 3055 { 3056 #pragma omp simd 3057 for (int i = 0; i < 10; ++i) 3058 ; 3059 } 3060 #pragma omp master 3061 { 3062 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} 3063 for (int i = 0; i < 10; ++i) 3064 ; 3065 } 3066 #pragma omp master 3067 { 3068 #pragma omp parallel 3069 for (int i = 0; i < 10; ++i) 3070 ; 3071 } 3072 #pragma omp master 3073 { 3074 #pragma omp single // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} 3075 { 3076 bar(); 3077 } 3078 } 3079 #pragma omp master 3080 { 3081 #pragma omp master // OK, though second 'master' is redundant 3082 { 3083 bar(); 3084 } 3085 } 3086 #pragma omp master 3087 { 3088 #pragma omp critical 3089 { 3090 bar(); 3091 } 3092 } 3093 #pragma omp master 3094 { 3095 #pragma omp sections // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} 3096 { 3097 bar(); 3098 } 3099 } 3100 #pragma omp master 3101 { 3102 #pragma omp parallel 3103 { 3104 #pragma omp master // OK 3105 { 3106 bar(); 3107 } 3108 #pragma omp for // OK 3109 for (int i = 0; i < 10; ++i) 3110 ; 3111 #pragma omp for simd // OK 3112 for (int i = 0; i < 10; ++i) 3113 ; 3114 #pragma omp sections // OK 3115 { 3116 bar(); 3117 } 3118 } 3119 } 3120 #pragma omp master 3121 { 3122 #pragma omp parallel for 3123 for (int i = 0; i < 10; ++i) 3124 ; 3125 } 3126 #pragma omp master 3127 { 3128 #pragma omp parallel for simd 3129 for (int i = 0; i < 10; ++i) 3130 ; 3131 } 3132 #pragma omp master 3133 { 3134 #pragma omp parallel sections 3135 { 3136 bar(); 3137 } 3138 } 3139 #pragma omp master 3140 { 3141 #pragma omp task 3142 { 3143 bar(); 3144 } 3145 } 3146 #pragma omp master 3147 { 3148 #pragma omp taskyield 3149 bar(); 3150 } 3151 #pragma omp master 3152 { 3153 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'master' region}} 3154 bar(); 3155 } 3156 #pragma omp master 3157 { 3158 #pragma omp taskwait 3159 bar(); 3160 } 3161 #pragma omp master 3162 { 3163 #pragma omp flush 3164 bar(); 3165 } 3166 #pragma omp master 3167 { 3168 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} 3169 bar(); 3170 } 3171 #pragma omp master 3172 { 3173 #pragma omp atomic 3174 ++a; 3175 } 3176 #pragma omp master 3177 { 3178 #pragma omp target 3179 ++a; 3180 } 3181 3182 // CRITICAL DIRECTIVE 3183 #pragma omp critical 3184 { 3185 #pragma omp for // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} 3186 for (int i = 0; i < 10; ++i) 3187 ; 3188 } 3189 #pragma omp critical 3190 { 3191 #pragma omp simd 3192 for (int i = 0; i < 10; ++i) 3193 ; 3194 } 3195 #pragma omp critical 3196 { 3197 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} 3198 for (int i = 0; i < 10; ++i) 3199 ; 3200 } 3201 #pragma omp critical 3202 { 3203 #pragma omp parallel 3204 for (int i = 0; i < 10; ++i) 3205 ; 3206 } 3207 #pragma omp critical 3208 { 3209 #pragma omp single // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} 3210 { 3211 bar(); 3212 } 3213 } 3214 #pragma omp critical 3215 { 3216 #pragma omp master // OK, though second 'master' is redundant 3217 { 3218 bar(); 3219 } 3220 } 3221 #pragma omp critical 3222 { 3223 #pragma omp critical 3224 { 3225 bar(); 3226 } 3227 } 3228 #pragma omp critical 3229 { 3230 #pragma omp sections // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} 3231 { 3232 bar(); 3233 } 3234 } 3235 #pragma omp critical 3236 { 3237 #pragma omp parallel 3238 { 3239 #pragma omp master // OK 3240 { 3241 bar(); 3242 } 3243 #pragma omp for // OK 3244 for (int i = 0; i < 10; ++i) 3245 ; 3246 #pragma omp for simd // OK 3247 for (int i = 0; i < 10; ++i) 3248 ; 3249 #pragma omp sections // OK 3250 { 3251 bar(); 3252 } 3253 } 3254 } 3255 #pragma omp critical 3256 { 3257 #pragma omp parallel for 3258 for (int i = 0; i < 10; ++i) 3259 ; 3260 } 3261 #pragma omp critical 3262 { 3263 #pragma omp parallel for simd 3264 for (int i = 0; i < 10; ++i) 3265 ; 3266 } 3267 #pragma omp critical 3268 { 3269 #pragma omp parallel sections 3270 { 3271 bar(); 3272 } 3273 } 3274 #pragma omp critical 3275 { 3276 #pragma omp task 3277 { 3278 bar(); 3279 } 3280 } 3281 #pragma omp critical 3282 { 3283 #pragma omp taskyield 3284 bar(); 3285 } 3286 #pragma omp critical 3287 { 3288 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'critical' region}} 3289 bar(); 3290 } 3291 #pragma omp critical 3292 { 3293 #pragma omp taskwait 3294 bar(); 3295 } 3296 #pragma omp critical(Belka) 3297 { 3298 #pragma omp critical(Strelka) 3299 bar(); 3300 } 3301 #pragma omp critical(Tuzik) // expected-note {{previous 'critical' region starts here}} 3302 { 3303 #pragma omp critical(grelka) // expected-note {{previous 'critical' region starts here}} 3304 { 3305 #pragma omp critical(Tuzik) // expected-error {{cannot nest 'critical' regions having the same name 'Tuzik'}} 3306 { 3307 #pragma omp parallel 3308 #pragma omp critical(grelka) // expected-error {{cannot nest 'critical' regions having the same name 'grelka'}} 3309 { 3310 bar(); 3311 } 3312 } 3313 } 3314 } 3315 #pragma omp critical 3316 { 3317 #pragma omp flush 3318 bar(); 3319 } 3320 #pragma omp critical 3321 { 3322 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} 3323 bar(); 3324 } 3325 #pragma omp critical 3326 { 3327 #pragma omp atomic 3328 ++a; 3329 } 3330 #pragma omp critical 3331 { 3332 #pragma omp target 3333 ++a; 3334 } 3335 3336 // PARALLEL FOR DIRECTIVE 3337 #pragma omp parallel for 3338 for (int i = 0; i < 10; ++i) { 3339 #pragma omp for // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} 3340 for (int i = 0; i < 10; ++i) 3341 ; 3342 } 3343 #pragma omp parallel for 3344 for (int i = 0; i < 10; ++i) { 3345 #pragma omp simd 3346 for (int i = 0; i < 10; ++i) 3347 ; 3348 } 3349 #pragma omp parallel for 3350 for (int i = 0; i < 10; ++i) { 3351 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} 3352 for (int i = 0; i < 10; ++i) 3353 ; 3354 } 3355 3356 #pragma omp parallel for 3357 for (int i = 0; i < 10; ++i) { 3358 #pragma omp parallel 3359 for (int i = 0; i < 10; ++i) 3360 ; 3361 } 3362 #pragma omp parallel for 3363 for (int i = 0; i < 10; ++i) { 3364 #pragma omp sections // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} 3365 { 3366 bar(); 3367 } 3368 } 3369 #pragma omp parallel for 3370 for (int i = 0; i < 10; ++i) { 3371 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a parallel for region}} 3372 { 3373 bar(); 3374 } 3375 } 3376 #pragma omp parallel for 3377 for (int i = 0; i < 10; ++i) { 3378 #pragma omp single // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} 3379 { 3380 bar(); 3381 } 3382 #pragma omp master // expected-error {{region cannot be closely nested inside 'parallel for' region}} 3383 { 3384 bar(); 3385 } 3386 #pragma omp critical 3387 { 3388 bar(); 3389 } 3390 } 3391 #pragma omp parallel for 3392 for (int i = 0; i < 10; ++i) { 3393 #pragma omp parallel 3394 { 3395 #pragma omp single // OK 3396 { 3397 bar(); 3398 } 3399 #pragma omp master // OK 3400 { 3401 bar(); 3402 } 3403 #pragma omp critical // OK 3404 { 3405 bar(); 3406 } 3407 #pragma omp for // OK 3408 for (int i = 0; i < 10; ++i) 3409 ; 3410 #pragma omp for simd // OK 3411 for (int i = 0; i < 10; ++i) 3412 ; 3413 #pragma omp sections // OK 3414 { 3415 bar(); 3416 } 3417 } 3418 } 3419 #pragma omp parallel for 3420 for (int i = 0; i < 10; ++i) { 3421 #pragma omp parallel for 3422 for (int i = 0; i < 10; ++i) 3423 ; 3424 } 3425 #pragma omp parallel for 3426 for (int i = 0; i < 10; ++i) { 3427 #pragma omp parallel for simd 3428 for (int i = 0; i < 10; ++i) 3429 ; 3430 } 3431 #pragma omp parallel for 3432 for (int i = 0; i < 10; ++i) { 3433 #pragma omp parallel sections 3434 { 3435 bar(); 3436 } 3437 } 3438 #pragma omp parallel for 3439 for (int i = 0; i < 10; ++i) { 3440 #pragma omp task 3441 { 3442 bar(); 3443 } 3444 } 3445 #pragma omp parallel for 3446 for (int i = 0; i < 10; ++i) { 3447 #pragma omp taskyield 3448 bar(); 3449 } 3450 #pragma omp parallel for 3451 for (int i = 0; i < 10; ++i) { 3452 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'parallel for' region}} 3453 bar(); 3454 } 3455 #pragma omp parallel for 3456 for (int i = 0; i < 10; ++i) { 3457 #pragma omp taskwait 3458 bar(); 3459 } 3460 #pragma omp parallel for 3461 for (int i = 0; i < 10; ++i) { 3462 #pragma omp flush 3463 bar(); 3464 } 3465 #pragma omp parallel for 3466 for (int i = 0; i < 10; ++i) { 3467 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} 3468 bar(); 3469 } 3470 #pragma omp parallel for ordered 3471 for (int i = 0; i < 10; ++i) { 3472 #pragma omp ordered // OK 3473 bar(); 3474 } 3475 #pragma omp parallel for 3476 for (int i = 0; i < 10; ++i) { 3477 #pragma omp atomic 3478 ++a; 3479 } 3480 #pragma omp parallel for 3481 for (int i = 0; i < 10; ++i) { 3482 #pragma omp target 3483 ++a; 3484 } 3485 3486 // PARALLEL FOR SIMD DIRECTIVE 3487 #pragma omp parallel for simd 3488 for (int i = 0; i < 10; ++i) { 3489 #pragma omp for // expected-error {{OpenMP constructs may not be nested inside a simd region}} 3490 for (int i = 0; i < 10; ++i) 3491 ; 3492 } 3493 #pragma omp parallel for simd 3494 for (int i = 0; i < 10; ++i) { 3495 #pragma omp simd// expected-error {{OpenMP constructs may not be nested inside a simd region}} 3496 for (int i = 0; i < 10; ++i) 3497 ; 3498 } 3499 #pragma omp parallel for simd 3500 for (int i = 0; i < 10; ++i) { 3501 #pragma omp for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} 3502 for (int i = 0; i < 10; ++i) 3503 ; 3504 } 3505 #pragma omp parallel for simd 3506 for (int i = 0; i < 10; ++i) { 3507 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}} 3508 for (int i = 0; i < 10; ++i) 3509 ; 3510 } 3511 #pragma omp parallel for simd 3512 for (int i = 0; i < 10; ++i) { 3513 #pragma omp sections // expected-error {{OpenMP constructs may not be nested inside a simd region}} 3514 { 3515 bar(); 3516 } 3517 } 3518 #pragma omp parallel for simd 3519 for (int i = 0; i < 10; ++i) { 3520 #pragma omp section // expected-error {{OpenMP constructs may not be nested inside a simd region}} 3521 { 3522 bar(); 3523 } 3524 } 3525 #pragma omp parallel for simd 3526 for (int i = 0; i < 10; ++i) { 3527 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}} 3528 { 3529 bar(); 3530 } 3531 } 3532 3533 #pragma omp parallel for simd 3534 for (int i = 0; i < 10; ++i) { 3535 #pragma omp master // expected-error {{OpenMP constructs may not be nested inside a simd region}} 3536 { 3537 bar(); 3538 } 3539 } 3540 3541 #pragma omp parallel for simd 3542 for (int i = 0; i < 10; ++i) { 3543 #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}} 3544 { 3545 bar(); 3546 } 3547 } 3548 3549 #pragma omp parallel for simd 3550 for (int i = 0; i < 10; ++i) { 3551 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}} 3552 { 3553 #pragma omp single 3554 { 3555 bar(); 3556 } 3557 #pragma omp for 3558 for (int i = 0; i < 10; ++i) 3559 ; 3560 #pragma omp for simd 3561 for (int i = 0; i < 10; ++i) 3562 ; 3563 #pragma omp sections 3564 { 3565 bar(); 3566 } 3567 } 3568 } 3569 #pragma omp parallel for simd 3570 for (int i = 0; i < 10; ++i) { 3571 #pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}} 3572 for (int i = 0; i < 10; ++i) 3573 ; 3574 } 3575 #pragma omp parallel for simd 3576 for (int i = 0; i < 10; ++i) { 3577 #pragma omp parallel for simd// expected-error {{OpenMP constructs may not be nested inside a simd region}} 3578 for (int i = 0; i < 10; ++i) 3579 ; 3580 } 3581 #pragma omp parallel for simd 3582 for (int i = 0; i < 10; ++i) { 3583 #pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside a simd region}} 3584 { 3585 bar(); 3586 } 3587 } 3588 #pragma omp parallel for simd 3589 for (int i = 0; i < 10; ++i) { 3590 #pragma omp task // expected-error {{OpenMP constructs may not be nested inside a simd region}} 3591 { 3592 bar(); 3593 } 3594 } 3595 #pragma omp parallel for simd 3596 for (int i = 0; i < 10; ++i) { 3597 #pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside a simd region}} 3598 bar(); 3599 } 3600 #pragma omp parallel for simd 3601 for (int i = 0; i < 10; ++i) { 3602 #pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside a simd region}} 3603 bar(); 3604 } 3605 #pragma omp parallel for simd 3606 for (int i = 0; i < 10; ++i) { 3607 #pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}} 3608 bar(); 3609 } 3610 #pragma omp parallel for simd 3611 for (int i = 0; i < 10; ++i) { 3612 #pragma omp flush // expected-error {{OpenMP constructs may not be nested inside a simd region}} 3613 bar(); 3614 } 3615 #pragma omp parallel for simd 3616 for (int i = 0; i < 10; ++i) { 3617 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 3618 bar(); 3619 } 3620 #pragma omp parallel for simd 3621 for (int i = 0; i < 10; ++i) { 3622 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 3623 bar(); 3624 } 3625 #pragma omp parallel for simd 3626 for (int i = 0; i < 10; ++i) { 3627 #pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside a simd region}} 3628 ++a; 3629 } 3630 #pragma omp parallel for simd 3631 for (int i = 0; i < 10; ++i) { 3632 #pragma omp target // expected-error {{OpenMP constructs may not be nested inside a simd region}} 3633 ++a; 3634 } 3635 3636 // PARALLEL SECTIONS DIRECTIVE 3637 #pragma omp parallel sections 3638 { 3639 #pragma omp for // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} 3640 for (int i = 0; i < 10; ++i) 3641 ; 3642 } 3643 #pragma omp parallel sections 3644 { 3645 #pragma omp simd 3646 for (int i = 0; i < 10; ++i) 3647 ; 3648 } 3649 #pragma omp parallel sections 3650 { 3651 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} 3652 for (int i = 0; i < 10; ++i) 3653 ; 3654 } 3655 #pragma omp parallel sections 3656 { 3657 #pragma omp parallel 3658 for (int i = 0; i < 10; ++i) 3659 ; 3660 } 3661 #pragma omp parallel sections 3662 { 3663 #pragma omp sections // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} 3664 { 3665 bar(); 3666 } 3667 } 3668 #pragma omp parallel sections 3669 { 3670 #pragma omp section 3671 { 3672 bar(); 3673 } 3674 } 3675 #pragma omp parallel sections 3676 { 3677 #pragma omp section 3678 { 3679 #pragma omp single // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} 3680 bar(); 3681 #pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}} 3682 bar(); 3683 #pragma omp critical 3684 bar(); 3685 } 3686 } 3687 #pragma omp parallel sections 3688 { 3689 #pragma omp parallel 3690 { 3691 #pragma omp single // OK 3692 { 3693 bar(); 3694 } 3695 #pragma omp master // OK 3696 { 3697 bar(); 3698 } 3699 #pragma omp critical // OK 3700 { 3701 bar(); 3702 } 3703 #pragma omp for // OK 3704 for (int i = 0; i < 10; ++i) 3705 ; 3706 #pragma omp for simd // OK 3707 for (int i = 0; i < 10; ++i) 3708 ; 3709 #pragma omp sections // OK 3710 { 3711 bar(); 3712 } 3713 } 3714 } 3715 #pragma omp parallel sections 3716 { 3717 #pragma omp parallel for 3718 for (int i = 0; i < 10; ++i) 3719 ; 3720 } 3721 #pragma omp parallel sections 3722 { 3723 #pragma omp parallel for simd 3724 for (int i = 0; i < 10; ++i) 3725 ; 3726 } 3727 #pragma omp parallel sections 3728 { 3729 #pragma omp parallel sections 3730 { 3731 bar(); 3732 } 3733 } 3734 #pragma omp parallel sections 3735 { 3736 #pragma omp task 3737 { 3738 bar(); 3739 } 3740 } 3741 #pragma omp parallel sections 3742 { 3743 #pragma omp taskyield 3744 } 3745 #pragma omp parallel sections 3746 { 3747 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'parallel sections' region}} 3748 } 3749 #pragma omp parallel sections 3750 { 3751 #pragma omp taskwait 3752 } 3753 #pragma omp parallel sections 3754 { 3755 #pragma omp flush 3756 } 3757 #pragma omp parallel sections 3758 { 3759 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} 3760 bar(); 3761 } 3762 #pragma omp parallel sections 3763 { 3764 #pragma omp atomic 3765 ++a; 3766 } 3767 #pragma omp parallel sections 3768 { 3769 #pragma omp target 3770 ++a; 3771 } 3772 3773 // TASK DIRECTIVE 3774 #pragma omp task 3775 #pragma omp for // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} 3776 for (int i = 0; i < 10; ++i) 3777 ; 3778 #pragma omp task 3779 #pragma omp simd 3780 for (int i = 0; i < 10; ++i) 3781 ; 3782 #pragma omp task 3783 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} 3784 for (int i = 0; i < 10; ++i) 3785 ; 3786 #pragma omp task 3787 #pragma omp sections // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} 3788 { 3789 bar(); 3790 } 3791 #pragma omp task 3792 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a task region}} 3793 { 3794 bar(); 3795 } 3796 #pragma omp task 3797 #pragma omp single // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} 3798 bar(); 3799 #pragma omp task 3800 #pragma omp master // expected-error {{region cannot be closely nested inside 'task' region}} 3801 bar(); 3802 #pragma omp task 3803 #pragma omp critical 3804 bar(); 3805 #pragma omp task 3806 #pragma omp parallel for 3807 for (int i = 0; i < 10; ++i) 3808 ; 3809 #pragma omp task 3810 #pragma omp parallel for simd 3811 for (int i = 0; i < 10; ++i) 3812 ; 3813 #pragma omp task 3814 #pragma omp parallel sections 3815 { 3816 bar(); 3817 } 3818 #pragma omp task 3819 #pragma omp task 3820 { 3821 bar(); 3822 } 3823 #pragma omp task 3824 { 3825 #pragma omp taskyield 3826 bar(); 3827 } 3828 #pragma omp task 3829 { 3830 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'task' region}} 3831 bar(); 3832 } 3833 #pragma omp task 3834 { 3835 #pragma omp taskwait 3836 bar(); 3837 } 3838 #pragma omp task 3839 { 3840 #pragma omp flush 3841 bar(); 3842 } 3843 #pragma omp task 3844 { 3845 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} 3846 bar(); 3847 } 3848 #pragma omp task 3849 { 3850 #pragma omp atomic 3851 ++a; 3852 } 3853 #pragma omp task 3854 { 3855 #pragma omp target 3856 ++a; 3857 } 3858 3859 // ATOMIC DIRECTIVE 3860 #pragma omp atomic 3861 // expected-error@+1 {{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}} 3862 { 3863 #pragma omp for // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 3864 for (int i = 0; i < 10; ++i) 3865 ; 3866 } 3867 #pragma omp atomic 3868 // expected-error@+1 {{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}} 3869 { 3870 #pragma omp simd // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 3871 for (int i = 0; i < 10; ++i) 3872 ; 3873 } 3874 #pragma omp atomic 3875 // expected-error@+1 {{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}} 3876 { 3877 #pragma omp for simd // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 3878 for (int i = 0; i < 10; ++i) 3879 ; 3880 } 3881 #pragma omp atomic 3882 // expected-error@+1 {{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}} 3883 { 3884 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 3885 for (int i = 0; i < 10; ++i) 3886 ; 3887 } 3888 #pragma omp atomic 3889 // expected-error@+1 {{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}} 3890 { 3891 #pragma omp sections // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 3892 { 3893 bar(); 3894 } 3895 } 3896 #pragma omp atomic 3897 // expected-error@+1 {{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}} 3898 { 3899 #pragma omp section // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 3900 { 3901 bar(); 3902 } 3903 } 3904 #pragma omp atomic 3905 // expected-error@+1 {{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}} 3906 { 3907 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 3908 { 3909 bar(); 3910 } 3911 } 3912 #pragma omp atomic 3913 // expected-error@+1 {{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}} 3914 { 3915 #pragma omp master // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 3916 { 3917 bar(); 3918 } 3919 } 3920 #pragma omp atomic 3921 // expected-error@+1 {{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}} 3922 { 3923 #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 3924 { 3925 bar(); 3926 } 3927 } 3928 #pragma omp atomic 3929 // expected-error@+1 {{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}} 3930 { 3931 #pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 3932 for (int i = 0; i < 10; ++i) 3933 ; 3934 } 3935 #pragma omp atomic 3936 // expected-error@+1 {{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}} 3937 { 3938 #pragma omp parallel for simd // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 3939 for (int i = 0; i < 10; ++i) 3940 ; 3941 } 3942 #pragma omp atomic 3943 // expected-error@+1 {{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}} 3944 { 3945 #pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 3946 { 3947 bar(); 3948 } 3949 } 3950 #pragma omp atomic 3951 // expected-error@+1 {{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}} 3952 { 3953 #pragma omp task // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 3954 { 3955 bar(); 3956 } 3957 } 3958 #pragma omp atomic 3959 // expected-error@+1 {{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}} 3960 { 3961 #pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 3962 bar(); 3963 } 3964 #pragma omp atomic 3965 // expected-error@+1 {{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}} 3966 { 3967 #pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 3968 bar(); 3969 } 3970 #pragma omp atomic 3971 // expected-error@+1 {{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}} 3972 { 3973 #pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 3974 bar(); 3975 } 3976 #pragma omp atomic 3977 // expected-error@+1 {{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}} 3978 { 3979 #pragma omp flush // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 3980 bar(); 3981 } 3982 #pragma omp atomic 3983 // expected-error@+1 {{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}} 3984 { 3985 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 3986 bar(); 3987 } 3988 #pragma omp atomic 3989 // expected-error@+1 {{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}} 3990 { 3991 #pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 3992 ++a; 3993 } 3994 #pragma omp atomic 3995 // expected-error@+1 {{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}} 3996 { 3997 #pragma omp target // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 3998 ++a; 3999 } 4000 4001 // TARGET DIRECTIVE 4002 #pragma omp target 4003 #pragma omp parallel 4004 bar(); 4005 #pragma omp target 4006 #pragma omp for 4007 for (int i = 0; i < 10; ++i) 4008 ; 4009 #pragma omp target 4010 #pragma omp simd 4011 for (int i = 0; i < 10; ++i) 4012 ; 4013 #pragma omp target 4014 #pragma omp for simd 4015 for (int i = 0; i < 10; ++i) 4016 ; 4017 #pragma omp target 4018 #pragma omp sections 4019 { 4020 bar(); 4021 } 4022 #pragma omp target 4023 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a target region}} 4024 { 4025 bar(); 4026 } 4027 #pragma omp target 4028 #pragma omp single 4029 bar(); 4030 4031 #pragma omp target 4032 #pragma omp master 4033 { 4034 bar(); 4035 } 4036 #pragma omp target 4037 #pragma omp critical 4038 { 4039 bar(); 4040 } 4041 #pragma omp target 4042 #pragma omp parallel for 4043 for (int i = 0; i < 10; ++i) 4044 ; 4045 #pragma omp target 4046 #pragma omp parallel for simd 4047 for (int i = 0; i < 10; ++i) 4048 ; 4049 #pragma omp target 4050 #pragma omp parallel sections 4051 { 4052 bar(); 4053 } 4054 #pragma omp target 4055 #pragma omp task 4056 { 4057 bar(); 4058 } 4059 #pragma omp target 4060 { 4061 #pragma omp taskyield 4062 bar(); 4063 } 4064 #pragma omp target 4065 { 4066 #pragma omp barrier 4067 bar(); 4068 } 4069 #pragma omp target 4070 { 4071 #pragma omp taskwait 4072 bar(); 4073 } 4074 #pragma omp target 4075 { 4076 #pragma omp flush 4077 bar(); 4078 } 4079 #pragma omp target 4080 { 4081 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'target' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} 4082 bar(); 4083 } 4084 #pragma omp target 4085 { 4086 #pragma omp atomic 4087 ++a; 4088 } 4089 #pragma omp target 4090 { 4091 #pragma omp target 4092 ++a; 4093 } 4094 return foo<int>(); 4095 } 4096 4097