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 sections 19 { 20 bar(); 21 } 22 #pragma omp parallel 23 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a parallel region}} 24 { 25 bar(); 26 } 27 #pragma omp parallel 28 #pragma omp single 29 bar(); 30 31 #pragma omp parallel 32 #pragma omp master 33 { 34 bar(); 35 } 36 #pragma omp parallel 37 #pragma omp critical 38 { 39 bar(); 40 } 41 #pragma omp parallel 42 #pragma omp parallel for 43 for (int i = 0; i < 10; ++i) 44 ; 45 #pragma omp parallel 46 #pragma omp parallel sections 47 { 48 bar(); 49 } 50 #pragma omp parallel 51 #pragma omp task 52 { 53 bar(); 54 } 55 #pragma omp parallel 56 { 57 #pragma omp taskyield 58 bar(); 59 } 60 #pragma omp parallel 61 { 62 #pragma omp barrier 63 bar(); 64 } 65 #pragma omp parallel 66 { 67 #pragma omp taskwait 68 bar(); 69 } 70 #pragma omp parallel 71 { 72 #pragma omp flush 73 bar(); 74 } 75 #pragma omp parallel 76 { 77 #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?}} 78 bar(); 79 } 80 #pragma omp parallel 81 { 82 #pragma omp atomic 83 ++a; 84 } 85 86 // SIMD DIRECTIVE 87 #pragma omp simd 88 for (int i = 0; i < 10; ++i) { 89 #pragma omp for // expected-error {{OpenMP constructs may not be nested inside a simd region}} 90 for (int i = 0; i < 10; ++i) 91 ; 92 } 93 #pragma omp simd 94 for (int i = 0; i < 10; ++i) { 95 #pragma omp simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} 96 for (int i = 0; i < 10; ++i) 97 ; 98 } 99 #pragma omp simd 100 for (int i = 0; i < 10; ++i) { 101 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}} 102 for (int i = 0; i < 10; ++i) 103 ; 104 } 105 #pragma omp simd 106 for (int i = 0; i < 10; ++i) { 107 #pragma omp sections // expected-error {{OpenMP constructs may not be nested inside a simd region}} 108 { 109 bar(); 110 } 111 } 112 #pragma omp simd 113 for (int i = 0; i < 10; ++i) { 114 #pragma omp section // expected-error {{OpenMP constructs may not be nested inside a simd region}} 115 { 116 bar(); 117 } 118 } 119 #pragma omp simd 120 for (int i = 0; i < 10; ++i) { 121 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}} 122 { 123 bar(); 124 } 125 } 126 #pragma omp simd 127 for (int i = 0; i < 10; ++i) { 128 #pragma omp master // expected-error {{OpenMP constructs may not be nested inside a simd region}} 129 { 130 bar(); 131 } 132 } 133 #pragma omp simd 134 for (int i = 0; i < 10; ++i) { 135 #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}} 136 { 137 bar(); 138 } 139 } 140 #pragma omp simd 141 for (int i = 0; i < 10; ++i) { 142 #pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}} 143 for (int i = 0; i < 10; ++i) 144 ; 145 } 146 #pragma omp simd 147 for (int i = 0; i < 10; ++i) { 148 #pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside a simd region}} 149 { 150 bar(); 151 } 152 } 153 #pragma omp simd 154 for (int i = 0; i < 10; ++i) { 155 #pragma omp task // expected-error {{OpenMP constructs may not be nested inside a simd region}} 156 { 157 bar(); 158 } 159 } 160 #pragma omp simd 161 for (int i = 0; i < 10; ++i) { 162 #pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside a simd region}} 163 bar(); 164 } 165 #pragma omp simd 166 for (int i = 0; i < 10; ++i) { 167 #pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside a simd region}} 168 bar(); 169 } 170 #pragma omp simd 171 for (int i = 0; i < 10; ++i) { 172 #pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}} 173 bar(); 174 } 175 #pragma omp simd 176 for (int i = 0; i < 10; ++i) { 177 #pragma omp flush // expected-error {{OpenMP constructs may not be nested inside a simd region}} 178 bar(); 179 } 180 #pragma omp simd 181 for (int i = 0; i < 10; ++i) { 182 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 183 bar(); 184 } 185 #pragma omp simd 186 for (int i = 0; i < 10; ++i) { 187 #pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside a simd region}} 188 ++a; 189 } 190 191 // FOR DIRECTIVE 192 #pragma omp for 193 for (int i = 0; i < 10; ++i) { 194 #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?}} 195 for (int i = 0; i < 10; ++i) 196 ; 197 } 198 #pragma omp for 199 for (int i = 0; i < 10; ++i) { 200 #pragma omp simd 201 for (int i = 0; i < 10; ++i) 202 ; 203 } 204 #pragma omp for 205 for (int i = 0; i < 10; ++i) { 206 #pragma omp parallel 207 for (int i = 0; i < 10; ++i) 208 ; 209 } 210 #pragma omp for 211 for (int i = 0; i < 10; ++i) { 212 #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?}} 213 { 214 bar(); 215 } 216 } 217 #pragma omp for 218 for (int i = 0; i < 10; ++i) { 219 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a for region}} 220 { 221 bar(); 222 } 223 } 224 #pragma omp for 225 for (int i = 0; i < 10; ++i) { 226 #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?}} 227 { 228 bar(); 229 } 230 } 231 232 #pragma omp for 233 for (int i = 0; i < 10; ++i) { 234 #pragma omp master // expected-error {{region cannot be closely nested inside 'for' region}} 235 { 236 bar(); 237 } 238 } 239 #pragma omp for 240 for (int i = 0; i < 10; ++i) { 241 #pragma omp critical 242 { 243 bar(); 244 } 245 } 246 #pragma omp for 247 for (int i = 0; i < 10; ++i) { 248 #pragma omp parallel 249 { 250 #pragma omp single // OK 251 { 252 bar(); 253 } 254 #pragma omp for // OK 255 for (int i = 0; i < 10; ++i) 256 ; 257 #pragma omp sections // OK 258 { 259 bar(); 260 } 261 } 262 } 263 #pragma omp for 264 for (int i = 0; i < 10; ++i) { 265 #pragma omp parallel for 266 for (int i = 0; i < 10; ++i) 267 ; 268 } 269 #pragma omp for 270 for (int i = 0; i < 10; ++i) { 271 #pragma omp parallel sections 272 { 273 bar(); 274 } 275 } 276 #pragma omp for 277 for (int i = 0; i < 10; ++i) { 278 #pragma omp task 279 { 280 bar(); 281 } 282 } 283 #pragma omp for 284 for (int i = 0; i < 10; ++i) { 285 #pragma omp taskyield 286 bar(); 287 } 288 #pragma omp for 289 for (int i = 0; i < 10; ++i) { 290 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'for' region}} 291 bar(); 292 } 293 #pragma omp for 294 for (int i = 0; i < 10; ++i) { 295 #pragma omp taskwait 296 bar(); 297 } 298 #pragma omp for 299 for (int i = 0; i < 10; ++i) { 300 #pragma omp flush 301 bar(); 302 } 303 #pragma omp for 304 for (int i = 0; i < 10; ++i) { 305 #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?}} 306 bar(); 307 } 308 #pragma omp for ordered 309 for (int i = 0; i < 10; ++i) { 310 #pragma omp ordered // OK 311 bar(); 312 } 313 #pragma omp for 314 for (int i = 0; i < 10; ++i) { 315 #pragma omp atomic 316 ++a; 317 } 318 319 // SECTIONS DIRECTIVE 320 #pragma omp sections 321 { 322 #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?}} 323 for (int i = 0; i < 10; ++i) 324 ; 325 } 326 #pragma omp sections 327 { 328 #pragma omp simd 329 for (int i = 0; i < 10; ++i) 330 ; 331 } 332 #pragma omp sections 333 { 334 #pragma omp parallel 335 for (int i = 0; i < 10; ++i) 336 ; 337 } 338 #pragma omp sections 339 { 340 #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?}} 341 { 342 bar(); 343 } 344 } 345 #pragma omp sections 346 { 347 #pragma omp section 348 { 349 bar(); 350 } 351 } 352 #pragma omp sections 353 { 354 #pragma omp parallel 355 { 356 #pragma omp single // OK 357 { 358 bar(); 359 } 360 #pragma omp for // OK 361 for (int i = 0; i < 10; ++i) 362 ; 363 #pragma omp sections // OK 364 { 365 bar(); 366 } 367 } 368 } 369 #pragma omp sections 370 { 371 #pragma omp parallel 372 { 373 #pragma omp master // OK 374 { 375 bar(); 376 } 377 #pragma omp for // OK 378 for (int i = 0; i < 10; ++i) 379 ; 380 #pragma omp master // OK 381 { 382 bar(); 383 } 384 } 385 #pragma omp master // expected-error {{region cannot be closely nested inside 'sections' region}} 386 bar(); 387 } 388 #pragma omp sections 389 { 390 #pragma omp parallel 391 { 392 #pragma omp critical(A) // OK 393 { 394 bar(); 395 } 396 #pragma omp for // OK 397 for (int i = 0; i < 10; ++i) 398 ; 399 #pragma omp critical // OK 400 { 401 bar(); 402 } 403 } 404 #pragma omp critical(A) // expected-error {{statement in 'omp sections' directive must be enclosed into a section region}} 405 bar(); 406 } 407 #pragma omp sections 408 { 409 #pragma omp parallel for 410 for (int i = 0; i < 10; ++i) 411 ; 412 } 413 #pragma omp sections 414 { 415 #pragma omp parallel sections 416 { 417 bar(); 418 } 419 } 420 #pragma omp sections 421 { 422 #pragma omp task 423 { 424 bar(); 425 } 426 } 427 #pragma omp sections 428 { 429 #pragma omp taskyield 430 } 431 #pragma omp sections 432 { 433 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'sections' region}} 434 } 435 #pragma omp sections 436 { 437 #pragma omp taskwait 438 } 439 #pragma omp sections 440 { 441 #pragma omp flush 442 } 443 #pragma omp sections 444 { 445 #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?}} 446 bar(); 447 } 448 #pragma omp sections 449 { 450 #pragma omp atomic 451 ++a; 452 } 453 454 // SECTION DIRECTIVE 455 #pragma omp section // expected-error {{orphaned 'omp section' directives are prohibited, it must be closely nested to a sections region}} 456 { 457 bar(); 458 } 459 #pragma omp sections 460 { 461 #pragma omp section 462 { 463 #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?}} 464 for (int i = 0; i < 10; ++i) 465 ; 466 } 467 } 468 #pragma omp sections 469 { 470 #pragma omp section 471 { 472 #pragma omp simd 473 for (int i = 0; i < 10; ++i) 474 ; 475 } 476 } 477 #pragma omp sections 478 { 479 #pragma omp section 480 { 481 #pragma omp parallel 482 for (int i = 0; i < 10; ++i) 483 ; 484 } 485 } 486 #pragma omp sections 487 { 488 #pragma omp section 489 { 490 #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?}} 491 { 492 bar(); 493 } 494 } 495 } 496 #pragma omp sections 497 { 498 #pragma omp section 499 { 500 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a section region}} 501 { 502 bar(); 503 } 504 } 505 } 506 #pragma omp sections 507 { 508 #pragma omp section 509 { 510 #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?}} 511 bar(); 512 #pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}} 513 bar(); 514 #pragma omp critical 515 bar(); 516 } 517 } 518 #pragma omp sections 519 { 520 #pragma omp section 521 { 522 #pragma omp parallel 523 { 524 #pragma omp single // OK 525 { 526 bar(); 527 } 528 #pragma omp for // OK 529 for (int i = 0; i < 10; ++i) 530 ; 531 #pragma omp sections // OK 532 { 533 bar(); 534 } 535 } 536 } 537 } 538 #pragma omp sections 539 { 540 #pragma omp section 541 { 542 #pragma omp parallel for 543 for (int i = 0; i < 10; ++i) 544 ; 545 } 546 } 547 #pragma omp sections 548 { 549 #pragma omp section 550 { 551 #pragma omp parallel sections 552 { 553 bar(); 554 } 555 } 556 } 557 #pragma omp sections 558 { 559 #pragma omp section 560 { 561 #pragma omp task 562 { 563 bar(); 564 } 565 } 566 } 567 #pragma omp sections 568 { 569 #pragma omp section 570 { 571 #pragma omp taskyield 572 bar(); 573 } 574 } 575 #pragma omp sections 576 { 577 #pragma omp section 578 { 579 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'section' region}} 580 bar(); 581 } 582 } 583 #pragma omp sections 584 { 585 #pragma omp section 586 { 587 #pragma omp taskwait 588 bar(); 589 } 590 } 591 #pragma omp sections 592 { 593 #pragma omp section 594 { 595 #pragma omp flush 596 bar(); 597 } 598 } 599 #pragma omp sections 600 { 601 #pragma omp section 602 { 603 #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?}} 604 bar(); 605 } 606 } 607 #pragma omp sections 608 { 609 #pragma omp section 610 #pragma omp atomic 611 ++a; 612 } 613 614 // SINGLE DIRECTIVE 615 #pragma omp single 616 { 617 #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?}} 618 for (int i = 0; i < 10; ++i) 619 ; 620 } 621 #pragma omp single 622 { 623 #pragma omp simd 624 for (int i = 0; i < 10; ++i) 625 ; 626 } 627 #pragma omp single 628 { 629 #pragma omp parallel 630 for (int i = 0; i < 10; ++i) 631 ; 632 } 633 #pragma omp single 634 { 635 #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?}} 636 { 637 bar(); 638 } 639 } 640 #pragma omp single 641 { 642 #pragma omp master // expected-error {{region cannot be closely nested inside 'single' region}} 643 { 644 bar(); 645 } 646 } 647 #pragma omp single 648 { 649 #pragma omp critical 650 { 651 bar(); 652 } 653 } 654 #pragma omp single 655 { 656 #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?}} 657 { 658 bar(); 659 } 660 } 661 #pragma omp single 662 { 663 #pragma omp parallel 664 { 665 #pragma omp single // OK 666 { 667 bar(); 668 } 669 #pragma omp for // OK 670 for (int i = 0; i < 10; ++i) 671 ; 672 #pragma omp sections // OK 673 { 674 bar(); 675 } 676 } 677 } 678 #pragma omp single 679 { 680 #pragma omp parallel for 681 for (int i = 0; i < 10; ++i) 682 ; 683 } 684 #pragma omp single 685 { 686 #pragma omp parallel sections 687 { 688 bar(); 689 } 690 } 691 #pragma omp single 692 { 693 #pragma omp task 694 { 695 bar(); 696 } 697 } 698 #pragma omp single 699 { 700 #pragma omp taskyield 701 bar(); 702 } 703 #pragma omp single 704 { 705 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'single' region}} 706 bar(); 707 } 708 #pragma omp single 709 { 710 #pragma omp taskwait 711 bar(); 712 } 713 #pragma omp single 714 { 715 #pragma omp flush 716 bar(); 717 } 718 #pragma omp single 719 { 720 #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?}} 721 bar(); 722 } 723 #pragma omp single 724 { 725 #pragma omp atomic 726 ++a; 727 } 728 729 // MASTER DIRECTIVE 730 #pragma omp master 731 { 732 #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?}} 733 for (int i = 0; i < 10; ++i) 734 ; 735 } 736 #pragma omp master 737 { 738 #pragma omp simd 739 for (int i = 0; i < 10; ++i) 740 ; 741 } 742 #pragma omp master 743 { 744 #pragma omp parallel 745 for (int i = 0; i < 10; ++i) 746 ; 747 } 748 #pragma omp master 749 { 750 #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?}} 751 { 752 bar(); 753 } 754 } 755 #pragma omp master 756 { 757 #pragma omp master // OK, though second 'master' is redundant 758 { 759 bar(); 760 } 761 } 762 #pragma omp master 763 { 764 #pragma omp critical 765 { 766 bar(); 767 } 768 } 769 #pragma omp master 770 { 771 #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?}} 772 { 773 bar(); 774 } 775 } 776 #pragma omp master 777 { 778 #pragma omp parallel 779 { 780 #pragma omp master // OK 781 { 782 bar(); 783 } 784 #pragma omp for // OK 785 for (int i = 0; i < 10; ++i) 786 ; 787 #pragma omp sections // OK 788 { 789 bar(); 790 } 791 } 792 } 793 #pragma omp master 794 { 795 #pragma omp parallel for 796 for (int i = 0; i < 10; ++i) 797 ; 798 } 799 #pragma omp master 800 { 801 #pragma omp parallel sections 802 { 803 bar(); 804 } 805 } 806 #pragma omp master 807 { 808 #pragma omp task 809 { 810 bar(); 811 } 812 } 813 #pragma omp master 814 { 815 #pragma omp taskyield 816 bar(); 817 } 818 #pragma omp master 819 { 820 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'master' region}} 821 bar(); 822 } 823 #pragma omp master 824 { 825 #pragma omp taskwait 826 bar(); 827 } 828 #pragma omp master 829 { 830 #pragma omp flush 831 bar(); 832 } 833 #pragma omp master 834 { 835 #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?}} 836 bar(); 837 } 838 #pragma omp master 839 { 840 #pragma omp atomic 841 ++a; 842 } 843 844 // CRITICAL DIRECTIVE 845 #pragma omp critical 846 { 847 #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?}} 848 for (int i = 0; i < 10; ++i) 849 ; 850 } 851 #pragma omp critical 852 { 853 #pragma omp simd 854 for (int i = 0; i < 10; ++i) 855 ; 856 } 857 #pragma omp critical 858 { 859 #pragma omp parallel 860 for (int i = 0; i < 10; ++i) 861 ; 862 } 863 #pragma omp critical 864 { 865 #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?}} 866 { 867 bar(); 868 } 869 } 870 #pragma omp critical 871 { 872 #pragma omp master // OK, though second 'master' is redundant 873 { 874 bar(); 875 } 876 } 877 #pragma omp critical 878 { 879 #pragma omp critical 880 { 881 bar(); 882 } 883 } 884 #pragma omp critical 885 { 886 #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?}} 887 { 888 bar(); 889 } 890 } 891 #pragma omp critical 892 { 893 #pragma omp parallel 894 { 895 #pragma omp master // OK 896 { 897 bar(); 898 } 899 #pragma omp for // OK 900 for (int i = 0; i < 10; ++i) 901 ; 902 #pragma omp sections // OK 903 { 904 bar(); 905 } 906 } 907 } 908 #pragma omp critical 909 { 910 #pragma omp parallel for 911 for (int i = 0; i < 10; ++i) 912 ; 913 } 914 #pragma omp critical 915 { 916 #pragma omp parallel sections 917 { 918 bar(); 919 } 920 } 921 #pragma omp critical 922 { 923 #pragma omp task 924 { 925 bar(); 926 } 927 } 928 #pragma omp critical 929 { 930 #pragma omp taskyield 931 bar(); 932 } 933 #pragma omp critical 934 { 935 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'critical' region}} 936 bar(); 937 } 938 #pragma omp critical 939 { 940 #pragma omp taskwait 941 bar(); 942 } 943 #pragma omp critical(Tuzik) 944 { 945 #pragma omp critical(grelka) 946 bar(); 947 } 948 #pragma omp critical(Belka) // expected-note {{previous 'critical' region starts here}} 949 { 950 #pragma omp critical(Belka) // expected-error {{cannot nest 'critical' regions having the same name 'Belka'}} 951 { 952 #pragma omp critical(Tuzik) 953 { 954 #pragma omp parallel 955 #pragma omp critical(grelka) 956 { 957 bar(); 958 } 959 } 960 } 961 } 962 #pragma omp critical 963 { 964 #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?}} 965 bar(); 966 } 967 #pragma omp critical 968 { 969 #pragma omp atomic 970 ++a; 971 } 972 973 // PARALLEL FOR DIRECTIVE 974 #pragma omp parallel for 975 for (int i = 0; i < 10; ++i) { 976 #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?}} 977 for (int i = 0; i < 10; ++i) 978 ; 979 } 980 #pragma omp parallel for 981 for (int i = 0; i < 10; ++i) { 982 #pragma omp simd 983 for (int i = 0; i < 10; ++i) 984 ; 985 } 986 #pragma omp parallel for 987 for (int i = 0; i < 10; ++i) { 988 #pragma omp parallel 989 for (int i = 0; i < 10; ++i) 990 ; 991 } 992 #pragma omp parallel for 993 for (int i = 0; i < 10; ++i) { 994 #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?}} 995 { 996 bar(); 997 } 998 } 999 #pragma omp parallel for 1000 for (int i = 0; i < 10; ++i) { 1001 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a parallel for region}} 1002 { 1003 bar(); 1004 } 1005 } 1006 #pragma omp parallel for 1007 for (int i = 0; i < 10; ++i) { 1008 #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?}} 1009 { 1010 bar(); 1011 } 1012 } 1013 1014 #pragma omp parallel for 1015 for (int i = 0; i < 10; ++i) { 1016 #pragma omp master // expected-error {{region cannot be closely nested inside 'parallel for' region}} 1017 { 1018 bar(); 1019 } 1020 } 1021 1022 #pragma omp parallel for 1023 for (int i = 0; i < 10; ++i) { 1024 #pragma omp critical 1025 { 1026 bar(); 1027 } 1028 } 1029 1030 #pragma omp parallel for 1031 for (int i = 0; i < 10; ++i) { 1032 #pragma omp parallel 1033 { 1034 #pragma omp single // OK 1035 { 1036 bar(); 1037 } 1038 #pragma omp for // OK 1039 for (int i = 0; i < 10; ++i) 1040 ; 1041 #pragma omp sections // OK 1042 { 1043 bar(); 1044 } 1045 } 1046 } 1047 #pragma omp parallel for 1048 for (int i = 0; i < 10; ++i) { 1049 #pragma omp parallel for 1050 for (int i = 0; i < 10; ++i) 1051 ; 1052 } 1053 #pragma omp parallel for 1054 for (int i = 0; i < 10; ++i) { 1055 #pragma omp parallel sections 1056 { 1057 bar(); 1058 } 1059 } 1060 #pragma omp parallel for 1061 for (int i = 0; i < 10; ++i) { 1062 #pragma omp task 1063 { 1064 bar(); 1065 } 1066 } 1067 #pragma omp parallel for 1068 for (int i = 0; i < 10; ++i) { 1069 #pragma omp taskyield 1070 bar(); 1071 } 1072 #pragma omp parallel for 1073 for (int i = 0; i < 10; ++i) { 1074 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'parallel for' region}} 1075 bar(); 1076 } 1077 #pragma omp parallel for 1078 for (int i = 0; i < 10; ++i) { 1079 #pragma omp taskwait 1080 bar(); 1081 } 1082 #pragma omp parallel for 1083 for (int i = 0; i < 10; ++i) { 1084 #pragma omp flush 1085 bar(); 1086 } 1087 #pragma omp parallel for 1088 for (int i = 0; i < 10; ++i) { 1089 #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?}} 1090 bar(); 1091 } 1092 #pragma omp parallel for ordered 1093 for (int i = 0; i < 10; ++i) { 1094 #pragma omp ordered // OK 1095 bar(); 1096 } 1097 #pragma omp parallel for 1098 for (int i = 0; i < 10; ++i) { 1099 #pragma omp atomic 1100 ++a; 1101 } 1102 1103 // PARALLEL SECTIONS DIRECTIVE 1104 #pragma omp parallel sections 1105 { 1106 #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?}} 1107 for (int i = 0; i < 10; ++i) 1108 ; 1109 } 1110 #pragma omp parallel sections 1111 { 1112 #pragma omp simd 1113 for (int i = 0; i < 10; ++i) 1114 ; 1115 } 1116 #pragma omp parallel sections 1117 { 1118 #pragma omp parallel 1119 for (int i = 0; i < 10; ++i) 1120 ; 1121 } 1122 #pragma omp parallel sections 1123 { 1124 #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?}} 1125 { 1126 bar(); 1127 } 1128 } 1129 #pragma omp parallel sections 1130 { 1131 #pragma omp section 1132 { 1133 bar(); 1134 } 1135 } 1136 #pragma omp parallel sections 1137 { 1138 #pragma omp section 1139 { 1140 #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?}} 1141 bar(); 1142 } 1143 } 1144 #pragma omp parallel sections 1145 { 1146 #pragma omp section 1147 { 1148 #pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}} 1149 bar(); 1150 } 1151 } 1152 #pragma omp parallel sections 1153 { 1154 #pragma omp section 1155 { 1156 #pragma omp critical 1157 bar(); 1158 } 1159 } 1160 #pragma omp parallel sections 1161 { 1162 #pragma omp parallel 1163 { 1164 #pragma omp single // OK 1165 { 1166 bar(); 1167 } 1168 #pragma omp for // OK 1169 for (int i = 0; i < 10; ++i) 1170 ; 1171 #pragma omp sections // OK 1172 { 1173 bar(); 1174 } 1175 } 1176 } 1177 #pragma omp parallel sections 1178 { 1179 #pragma omp parallel for 1180 for (int i = 0; i < 10; ++i) 1181 ; 1182 } 1183 #pragma omp parallel sections 1184 { 1185 #pragma omp parallel sections 1186 { 1187 bar(); 1188 } 1189 } 1190 #pragma omp parallel sections 1191 { 1192 #pragma omp task 1193 { 1194 bar(); 1195 } 1196 } 1197 #pragma omp parallel sections 1198 { 1199 #pragma omp taskyield 1200 } 1201 #pragma omp parallel sections 1202 { 1203 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'parallel sections' region}} 1204 } 1205 #pragma omp parallel sections 1206 { 1207 #pragma omp taskwait 1208 } 1209 #pragma omp parallel sections 1210 { 1211 #pragma omp flush 1212 } 1213 #pragma omp parallel sections 1214 { 1215 #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?}} 1216 bar(); 1217 } 1218 #pragma omp parallel sections 1219 { 1220 #pragma omp atomic 1221 ++a; 1222 } 1223 1224 // TASK DIRECTIVE 1225 #pragma omp task 1226 #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?}} 1227 for (int i = 0; i < 10; ++i) 1228 ; 1229 #pragma omp task 1230 #pragma omp simd 1231 for (int i = 0; i < 10; ++i) 1232 ; 1233 #pragma omp task 1234 #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?}} 1235 { 1236 bar(); 1237 } 1238 #pragma omp task 1239 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a task region}} 1240 { 1241 bar(); 1242 } 1243 #pragma omp task 1244 #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?}} 1245 bar(); 1246 #pragma omp task 1247 #pragma omp master // expected-error {{region cannot be closely nested inside 'task' region}} 1248 bar(); 1249 #pragma omp task 1250 #pragma omp critical 1251 bar(); 1252 1253 #pragma omp task 1254 #pragma omp parallel for 1255 for (int i = 0; i < 10; ++i) 1256 ; 1257 #pragma omp task 1258 #pragma omp parallel sections 1259 { 1260 bar(); 1261 } 1262 #pragma omp task 1263 #pragma omp task 1264 { 1265 bar(); 1266 } 1267 #pragma omp task 1268 { 1269 #pragma omp taskyield 1270 bar(); 1271 } 1272 #pragma omp task 1273 { 1274 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'task' region}} 1275 bar(); 1276 } 1277 #pragma omp task 1278 { 1279 #pragma omp taskwait 1280 bar(); 1281 } 1282 #pragma omp task 1283 { 1284 #pragma omp flush 1285 bar(); 1286 } 1287 #pragma omp task 1288 { 1289 #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?}} 1290 bar(); 1291 } 1292 #pragma omp task 1293 { 1294 #pragma omp atomic 1295 ++a; 1296 } 1297 1298 // ORDERED DIRECTIVE 1299 #pragma omp ordered 1300 { 1301 #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?}} 1302 for (int i = 0; i < 10; ++i) 1303 ; 1304 } 1305 #pragma omp ordered 1306 { 1307 #pragma omp simd 1308 for (int i = 0; i < 10; ++i) 1309 ; 1310 } 1311 #pragma omp ordered 1312 { 1313 #pragma omp parallel 1314 for (int i = 0; i < 10; ++i) 1315 ; 1316 } 1317 #pragma omp ordered 1318 { 1319 #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?}} 1320 { 1321 bar(); 1322 } 1323 } 1324 #pragma omp ordered 1325 { 1326 #pragma omp master // OK, though second 'ordered' is redundant 1327 { 1328 bar(); 1329 } 1330 } 1331 #pragma omp ordered 1332 { 1333 #pragma omp critical 1334 { 1335 bar(); 1336 } 1337 } 1338 #pragma omp ordered 1339 { 1340 #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?}} 1341 { 1342 bar(); 1343 } 1344 } 1345 #pragma omp ordered 1346 { 1347 #pragma omp parallel for ordered 1348 for (int j = 0; j < 10; ++j) { 1349 #pragma omp ordered // OK 1350 { 1351 bar(); 1352 } 1353 } 1354 } 1355 #pragma omp ordered 1356 { 1357 #pragma omp parallel for 1358 for (int i = 0; i < 10; ++i) 1359 ; 1360 } 1361 #pragma omp ordered 1362 { 1363 #pragma omp parallel sections 1364 { 1365 bar(); 1366 } 1367 } 1368 #pragma omp ordered 1369 { 1370 #pragma omp task 1371 { 1372 bar(); 1373 } 1374 } 1375 #pragma omp ordered 1376 { 1377 #pragma omp taskyield 1378 bar(); 1379 } 1380 #pragma omp ordered 1381 { 1382 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'ordered' region}} 1383 bar(); 1384 } 1385 #pragma omp ordered 1386 { 1387 #pragma omp taskwait 1388 bar(); 1389 } 1390 #pragma omp ordered 1391 { 1392 #pragma omp flush 1393 bar(); 1394 } 1395 #pragma omp ordered 1396 { 1397 #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?}} 1398 bar(); 1399 } 1400 #pragma omp ordered 1401 { 1402 #pragma omp atomic 1403 ++a; 1404 } 1405 1406 // ATOMIC DIRECTIVE 1407 #pragma omp atomic 1408 // 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}} 1409 { 1410 #pragma omp for // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1411 for (int i = 0; i < 10; ++i) 1412 ; 1413 } 1414 #pragma omp atomic 1415 // 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}} 1416 { 1417 #pragma omp simd // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1418 for (int i = 0; i < 10; ++i) 1419 ; 1420 } 1421 #pragma omp atomic 1422 // 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}} 1423 { 1424 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1425 for (int i = 0; i < 10; ++i) 1426 ; 1427 } 1428 #pragma omp atomic 1429 // 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}} 1430 { 1431 #pragma omp sections // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1432 { 1433 bar(); 1434 } 1435 } 1436 #pragma omp atomic 1437 // 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}} 1438 { 1439 #pragma omp section // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1440 { 1441 bar(); 1442 } 1443 } 1444 #pragma omp atomic 1445 // 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}} 1446 { 1447 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1448 { 1449 bar(); 1450 } 1451 } 1452 #pragma omp atomic 1453 // 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}} 1454 { 1455 #pragma omp master // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1456 { 1457 bar(); 1458 } 1459 } 1460 #pragma omp atomic 1461 // 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}} 1462 { 1463 #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1464 { 1465 bar(); 1466 } 1467 } 1468 #pragma omp atomic 1469 // 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}} 1470 { 1471 #pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1472 for (int i = 0; i < 10; ++i) 1473 ; 1474 } 1475 #pragma omp atomic 1476 // 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}} 1477 { 1478 #pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1479 { 1480 bar(); 1481 } 1482 } 1483 #pragma omp atomic 1484 // 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}} 1485 { 1486 #pragma omp task // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1487 { 1488 bar(); 1489 } 1490 } 1491 #pragma omp atomic 1492 // 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}} 1493 { 1494 #pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1495 bar(); 1496 } 1497 #pragma omp atomic 1498 // 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}} 1499 { 1500 #pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1501 bar(); 1502 } 1503 #pragma omp atomic 1504 // 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}} 1505 { 1506 #pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1507 bar(); 1508 } 1509 #pragma omp atomic 1510 // 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}} 1511 { 1512 #pragma omp flush // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1513 bar(); 1514 } 1515 #pragma omp atomic 1516 // 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}} 1517 { 1518 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1519 bar(); 1520 } 1521 #pragma omp atomic 1522 // 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}} 1523 { 1524 #pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 1525 ++a; 1526 } 1527 } 1528 1529 void foo() { 1530 int a = 0; 1531 // PARALLEL DIRECTIVE 1532 #pragma omp parallel 1533 #pragma omp for 1534 for (int i = 0; i < 10; ++i) 1535 ; 1536 #pragma omp parallel 1537 #pragma omp simd 1538 for (int i = 0; i < 10; ++i) 1539 ; 1540 #pragma omp parallel 1541 #pragma omp sections 1542 { 1543 bar(); 1544 } 1545 #pragma omp parallel 1546 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a parallel region}} 1547 { 1548 bar(); 1549 } 1550 #pragma omp parallel 1551 #pragma omp sections 1552 { 1553 bar(); 1554 } 1555 #pragma omp parallel 1556 #pragma omp single 1557 bar(); 1558 #pragma omp parallel 1559 #pragma omp master 1560 bar(); 1561 #pragma omp parallel 1562 #pragma omp critical 1563 bar(); 1564 #pragma omp parallel 1565 #pragma omp parallel for 1566 for (int i = 0; i < 10; ++i) 1567 ; 1568 #pragma omp parallel 1569 #pragma omp parallel sections 1570 { 1571 bar(); 1572 } 1573 #pragma omp parallel 1574 #pragma omp task 1575 { 1576 bar(); 1577 } 1578 #pragma omp parallel 1579 { 1580 #pragma omp taskyield 1581 bar(); 1582 } 1583 #pragma omp parallel 1584 { 1585 #pragma omp barrier 1586 bar(); 1587 } 1588 #pragma omp parallel 1589 { 1590 #pragma omp taskwait 1591 bar(); 1592 } 1593 #pragma omp parallel 1594 { 1595 #pragma omp flush 1596 bar(); 1597 } 1598 #pragma omp parallel 1599 { 1600 #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?}} 1601 bar(); 1602 } 1603 #pragma omp parallel 1604 { 1605 #pragma omp atomic 1606 ++a; 1607 } 1608 1609 // SIMD DIRECTIVE 1610 #pragma omp simd 1611 for (int i = 0; i < 10; ++i) { 1612 #pragma omp for // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1613 for (int i = 0; i < 10; ++i) 1614 ; 1615 } 1616 #pragma omp simd 1617 for (int i = 0; i < 10; ++i) { 1618 #pragma omp simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1619 for (int i = 0; i < 10; ++i) 1620 ; 1621 } 1622 #pragma omp simd 1623 for (int i = 0; i < 10; ++i) { 1624 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1625 for (int i = 0; i < 10; ++i) 1626 ; 1627 } 1628 #pragma omp simd 1629 for (int i = 0; i < 10; ++i) { 1630 #pragma omp sections // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1631 { 1632 bar(); 1633 } 1634 } 1635 #pragma omp simd 1636 for (int i = 0; i < 10; ++i) { 1637 #pragma omp section // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1638 { 1639 bar(); 1640 } 1641 } 1642 #pragma omp simd 1643 for (int i = 0; i < 10; ++i) { 1644 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1645 bar(); 1646 #pragma omp master // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1647 bar(); 1648 } 1649 #pragma omp simd 1650 for (int i = 0; i < 10; ++i) { 1651 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1652 bar(); 1653 #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1654 bar(); 1655 } 1656 #pragma omp simd 1657 for (int i = 0; i < 10; ++i) { 1658 #pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1659 for (int i = 0; i < 10; ++i) 1660 ; 1661 } 1662 #pragma omp simd 1663 for (int i = 0; i < 10; ++i) { 1664 #pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1665 { 1666 bar(); 1667 } 1668 } 1669 #pragma omp simd 1670 for (int i = 0; i < 10; ++i) { 1671 #pragma omp task // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1672 { 1673 bar(); 1674 } 1675 } 1676 #pragma omp simd 1677 for (int i = 0; i < 10; ++i) { 1678 #pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1679 bar(); 1680 } 1681 #pragma omp simd 1682 for (int i = 0; i < 10; ++i) { 1683 #pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1684 bar(); 1685 } 1686 #pragma omp simd 1687 for (int i = 0; i < 10; ++i) { 1688 #pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1689 bar(); 1690 } 1691 #pragma omp simd 1692 for (int i = 0; i < 10; ++i) { 1693 #pragma omp flush // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1694 bar(); 1695 } 1696 #pragma omp simd 1697 for (int i = 0; i < 10; ++i) { 1698 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1699 bar(); 1700 } 1701 #pragma omp simd 1702 for (int i = 0; i < 10; ++i) { 1703 #pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside a simd region}} 1704 ++a; 1705 } 1706 1707 // FOR DIRECTIVE 1708 #pragma omp for 1709 for (int i = 0; i < 10; ++i) { 1710 #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?}} 1711 for (int i = 0; i < 10; ++i) 1712 ; 1713 } 1714 #pragma omp for 1715 for (int i = 0; i < 10; ++i) { 1716 #pragma omp simd 1717 for (int i = 0; i < 10; ++i) 1718 ; 1719 } 1720 #pragma omp for 1721 for (int i = 0; i < 10; ++i) { 1722 #pragma omp parallel 1723 for (int i = 0; i < 10; ++i) 1724 ; 1725 } 1726 #pragma omp for 1727 for (int i = 0; i < 10; ++i) { 1728 #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?}} 1729 { 1730 bar(); 1731 } 1732 } 1733 #pragma omp for 1734 for (int i = 0; i < 10; ++i) { 1735 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a for region}} 1736 { 1737 bar(); 1738 } 1739 } 1740 #pragma omp for 1741 for (int i = 0; i < 10; ++i) { 1742 #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?}} 1743 bar(); 1744 #pragma omp master // expected-error {{region cannot be closely nested inside 'for' region}} 1745 bar(); 1746 #pragma omp critical 1747 bar(); 1748 } 1749 #pragma omp for 1750 for (int i = 0; i < 10; ++i) { 1751 #pragma omp parallel 1752 { 1753 #pragma omp single // OK 1754 { 1755 bar(); 1756 } 1757 #pragma omp for // OK 1758 for (int i = 0; i < 10; ++i) 1759 ; 1760 #pragma omp sections // OK 1761 { 1762 bar(); 1763 } 1764 } 1765 } 1766 #pragma omp for 1767 for (int i = 0; i < 10; ++i) { 1768 #pragma omp parallel for 1769 for (int i = 0; i < 10; ++i) 1770 ; 1771 } 1772 #pragma omp for 1773 for (int i = 0; i < 10; ++i) { 1774 #pragma omp parallel sections 1775 { 1776 bar(); 1777 } 1778 } 1779 #pragma omp for 1780 for (int i = 0; i < 10; ++i) { 1781 #pragma omp task 1782 { 1783 bar(); 1784 } 1785 } 1786 #pragma omp for 1787 for (int i = 0; i < 10; ++i) { 1788 #pragma omp taskyield 1789 bar(); 1790 } 1791 #pragma omp for 1792 for (int i = 0; i < 10; ++i) { 1793 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'for' region}} 1794 bar(); 1795 } 1796 #pragma omp for 1797 for (int i = 0; i < 10; ++i) { 1798 #pragma omp taskwait 1799 bar(); 1800 } 1801 #pragma omp for 1802 for (int i = 0; i < 10; ++i) { 1803 #pragma omp flush 1804 bar(); 1805 } 1806 #pragma omp for 1807 for (int i = 0; i < 10; ++i) { 1808 #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?}} 1809 bar(); 1810 } 1811 #pragma omp for ordered 1812 for (int i = 0; i < 10; ++i) { 1813 #pragma omp ordered // OK 1814 bar(); 1815 } 1816 #pragma omp for 1817 for (int i = 0; i < 10; ++i) { 1818 #pragma omp atomic 1819 ++a; 1820 } 1821 1822 // SECTIONS DIRECTIVE 1823 #pragma omp sections 1824 { 1825 #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?}} 1826 for (int i = 0; i < 10; ++i) 1827 ; 1828 } 1829 #pragma omp sections 1830 { 1831 #pragma omp simd 1832 for (int i = 0; i < 10; ++i) 1833 ; 1834 } 1835 #pragma omp sections 1836 { 1837 #pragma omp parallel 1838 for (int i = 0; i < 10; ++i) 1839 ; 1840 } 1841 #pragma omp sections 1842 { 1843 #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?}} 1844 { 1845 bar(); 1846 } 1847 } 1848 #pragma omp sections 1849 { 1850 #pragma omp section 1851 { 1852 bar(); 1853 } 1854 } 1855 #pragma omp sections 1856 { 1857 #pragma omp critical 1858 bar(); 1859 #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?}} 1860 bar(); 1861 #pragma omp master // expected-error {{region cannot be closely nested inside 'sections' region}} 1862 bar(); 1863 } 1864 #pragma omp sections 1865 { 1866 #pragma omp parallel 1867 { 1868 #pragma omp single // OK 1869 { 1870 bar(); 1871 } 1872 #pragma omp for // OK 1873 for (int i = 0; i < 10; ++i) 1874 ; 1875 #pragma omp sections // OK 1876 { 1877 bar(); 1878 } 1879 } 1880 } 1881 #pragma omp sections 1882 { 1883 #pragma omp parallel for 1884 for (int i = 0; i < 10; ++i) 1885 ; 1886 } 1887 #pragma omp sections 1888 { 1889 #pragma omp parallel sections 1890 { 1891 bar(); 1892 } 1893 } 1894 #pragma omp sections 1895 { 1896 #pragma omp task 1897 { 1898 bar(); 1899 } 1900 } 1901 #pragma omp sections 1902 { 1903 #pragma omp taskyield 1904 } 1905 #pragma omp sections 1906 { 1907 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'sections' region}} 1908 bar(); 1909 } 1910 #pragma omp sections 1911 { 1912 #pragma omp taskwait 1913 } 1914 #pragma omp sections 1915 { 1916 #pragma omp flush 1917 } 1918 #pragma omp sections 1919 { 1920 #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?}} 1921 bar(); 1922 } 1923 #pragma omp sections 1924 { 1925 #pragma omp atomic 1926 ++a; 1927 } 1928 1929 // SECTION DIRECTIVE 1930 #pragma omp section // expected-error {{orphaned 'omp section' directives are prohibited, it must be closely nested to a sections region}} 1931 { 1932 bar(); 1933 } 1934 #pragma omp sections 1935 { 1936 #pragma omp section 1937 { 1938 #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?}} 1939 for (int i = 0; i < 10; ++i) 1940 ; 1941 } 1942 } 1943 #pragma omp sections 1944 { 1945 #pragma omp section 1946 { 1947 #pragma omp simd 1948 for (int i = 0; i < 10; ++i) 1949 ; 1950 } 1951 } 1952 #pragma omp sections 1953 { 1954 #pragma omp section 1955 { 1956 #pragma omp parallel 1957 for (int i = 0; i < 10; ++i) 1958 ; 1959 } 1960 } 1961 #pragma omp sections 1962 { 1963 #pragma omp section 1964 { 1965 #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?}} 1966 { 1967 bar(); 1968 } 1969 } 1970 } 1971 #pragma omp sections 1972 { 1973 #pragma omp section 1974 { 1975 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a section region}} 1976 { 1977 bar(); 1978 } 1979 } 1980 } 1981 #pragma omp sections 1982 { 1983 #pragma omp section 1984 { 1985 #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?}} 1986 bar(); 1987 #pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}} 1988 bar(); 1989 #pragma omp critical 1990 bar(); 1991 } 1992 } 1993 #pragma omp sections 1994 { 1995 #pragma omp section 1996 { 1997 #pragma omp parallel 1998 { 1999 #pragma omp single // OK 2000 { 2001 bar(); 2002 } 2003 #pragma omp for // OK 2004 for (int i = 0; i < 10; ++i) 2005 ; 2006 #pragma omp sections // OK 2007 { 2008 bar(); 2009 } 2010 } 2011 } 2012 } 2013 #pragma omp sections 2014 { 2015 #pragma omp section 2016 { 2017 #pragma omp parallel for 2018 for (int i = 0; i < 10; ++i) 2019 ; 2020 } 2021 } 2022 #pragma omp sections 2023 { 2024 #pragma omp section 2025 { 2026 #pragma omp parallel sections 2027 { 2028 bar(); 2029 } 2030 } 2031 } 2032 #pragma omp sections 2033 { 2034 #pragma omp section 2035 { 2036 #pragma omp task 2037 { 2038 bar(); 2039 } 2040 } 2041 } 2042 #pragma omp sections 2043 { 2044 #pragma omp section 2045 { 2046 #pragma omp taskyield 2047 bar(); 2048 } 2049 } 2050 #pragma omp sections 2051 { 2052 #pragma omp section 2053 { 2054 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'section' region}} 2055 bar(); 2056 } 2057 } 2058 #pragma omp sections 2059 { 2060 #pragma omp section 2061 { 2062 #pragma omp taskwait 2063 bar(); 2064 } 2065 } 2066 #pragma omp sections 2067 { 2068 #pragma omp section 2069 { 2070 #pragma omp flush 2071 bar(); 2072 } 2073 } 2074 #pragma omp sections 2075 { 2076 #pragma omp section 2077 { 2078 #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?}} 2079 bar(); 2080 } 2081 } 2082 #pragma omp sections 2083 { 2084 #pragma omp section 2085 { 2086 #pragma omp atomic 2087 ++a; 2088 } 2089 } 2090 2091 // SINGLE DIRECTIVE 2092 #pragma omp single 2093 { 2094 #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?}} 2095 for (int i = 0; i < 10; ++i) 2096 ; 2097 } 2098 #pragma omp single 2099 { 2100 #pragma omp simd 2101 for (int i = 0; i < 10; ++i) 2102 ; 2103 } 2104 #pragma omp single 2105 { 2106 #pragma omp parallel 2107 for (int i = 0; i < 10; ++i) 2108 ; 2109 } 2110 #pragma omp single 2111 { 2112 #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?}} 2113 { 2114 bar(); 2115 } 2116 #pragma omp master // expected-error {{region cannot be closely nested inside 'single' region}} 2117 bar(); 2118 #pragma omp critical 2119 bar(); 2120 } 2121 #pragma omp single 2122 { 2123 #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?}} 2124 { 2125 bar(); 2126 } 2127 } 2128 #pragma omp single 2129 { 2130 #pragma omp parallel 2131 { 2132 #pragma omp single // OK 2133 { 2134 bar(); 2135 } 2136 #pragma omp for // OK 2137 for (int i = 0; i < 10; ++i) 2138 ; 2139 #pragma omp sections // OK 2140 { 2141 bar(); 2142 } 2143 } 2144 } 2145 #pragma omp single 2146 { 2147 #pragma omp parallel for 2148 for (int i = 0; i < 10; ++i) 2149 ; 2150 } 2151 #pragma omp single 2152 { 2153 #pragma omp parallel sections 2154 { 2155 bar(); 2156 } 2157 } 2158 #pragma omp single 2159 { 2160 #pragma omp task 2161 { 2162 bar(); 2163 } 2164 } 2165 #pragma omp single 2166 { 2167 #pragma omp taskyield 2168 bar(); 2169 } 2170 #pragma omp single 2171 { 2172 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'single' region}} 2173 bar(); 2174 } 2175 #pragma omp single 2176 { 2177 #pragma omp taskwait 2178 bar(); 2179 } 2180 #pragma omp single 2181 { 2182 #pragma omp flush 2183 bar(); 2184 } 2185 #pragma omp single 2186 { 2187 #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?}} 2188 bar(); 2189 } 2190 #pragma omp single 2191 { 2192 #pragma omp atomic 2193 ++a; 2194 } 2195 2196 // MASTER DIRECTIVE 2197 #pragma omp master 2198 { 2199 #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?}} 2200 for (int i = 0; i < 10; ++i) 2201 ; 2202 } 2203 #pragma omp master 2204 { 2205 #pragma omp simd 2206 for (int i = 0; i < 10; ++i) 2207 ; 2208 } 2209 #pragma omp master 2210 { 2211 #pragma omp parallel 2212 for (int i = 0; i < 10; ++i) 2213 ; 2214 } 2215 #pragma omp master 2216 { 2217 #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?}} 2218 { 2219 bar(); 2220 } 2221 } 2222 #pragma omp master 2223 { 2224 #pragma omp master // OK, though second 'master' is redundant 2225 { 2226 bar(); 2227 } 2228 } 2229 #pragma omp master 2230 { 2231 #pragma omp critical 2232 { 2233 bar(); 2234 } 2235 } 2236 #pragma omp master 2237 { 2238 #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?}} 2239 { 2240 bar(); 2241 } 2242 } 2243 #pragma omp master 2244 { 2245 #pragma omp parallel 2246 { 2247 #pragma omp master // OK 2248 { 2249 bar(); 2250 } 2251 #pragma omp for // OK 2252 for (int i = 0; i < 10; ++i) 2253 ; 2254 #pragma omp sections // OK 2255 { 2256 bar(); 2257 } 2258 } 2259 } 2260 #pragma omp master 2261 { 2262 #pragma omp parallel for 2263 for (int i = 0; i < 10; ++i) 2264 ; 2265 } 2266 #pragma omp master 2267 { 2268 #pragma omp parallel sections 2269 { 2270 bar(); 2271 } 2272 } 2273 #pragma omp master 2274 { 2275 #pragma omp task 2276 { 2277 bar(); 2278 } 2279 } 2280 #pragma omp master 2281 { 2282 #pragma omp taskyield 2283 bar(); 2284 } 2285 #pragma omp master 2286 { 2287 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'master' region}} 2288 bar(); 2289 } 2290 #pragma omp master 2291 { 2292 #pragma omp taskwait 2293 bar(); 2294 } 2295 #pragma omp master 2296 { 2297 #pragma omp flush 2298 bar(); 2299 } 2300 #pragma omp master 2301 { 2302 #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?}} 2303 bar(); 2304 } 2305 #pragma omp master 2306 { 2307 #pragma omp atomic 2308 ++a; 2309 } 2310 2311 // CRITICAL DIRECTIVE 2312 #pragma omp critical 2313 { 2314 #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?}} 2315 for (int i = 0; i < 10; ++i) 2316 ; 2317 } 2318 #pragma omp critical 2319 { 2320 #pragma omp simd 2321 for (int i = 0; i < 10; ++i) 2322 ; 2323 } 2324 #pragma omp critical 2325 { 2326 #pragma omp parallel 2327 for (int i = 0; i < 10; ++i) 2328 ; 2329 } 2330 #pragma omp critical 2331 { 2332 #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?}} 2333 { 2334 bar(); 2335 } 2336 } 2337 #pragma omp critical 2338 { 2339 #pragma omp master // OK, though second 'master' is redundant 2340 { 2341 bar(); 2342 } 2343 } 2344 #pragma omp critical 2345 { 2346 #pragma omp critical 2347 { 2348 bar(); 2349 } 2350 } 2351 #pragma omp critical 2352 { 2353 #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?}} 2354 { 2355 bar(); 2356 } 2357 } 2358 #pragma omp critical 2359 { 2360 #pragma omp parallel 2361 { 2362 #pragma omp master // OK 2363 { 2364 bar(); 2365 } 2366 #pragma omp for // OK 2367 for (int i = 0; i < 10; ++i) 2368 ; 2369 #pragma omp sections // OK 2370 { 2371 bar(); 2372 } 2373 } 2374 } 2375 #pragma omp critical 2376 { 2377 #pragma omp parallel for 2378 for (int i = 0; i < 10; ++i) 2379 ; 2380 } 2381 #pragma omp critical 2382 { 2383 #pragma omp parallel sections 2384 { 2385 bar(); 2386 } 2387 } 2388 #pragma omp critical 2389 { 2390 #pragma omp task 2391 { 2392 bar(); 2393 } 2394 } 2395 #pragma omp critical 2396 { 2397 #pragma omp taskyield 2398 bar(); 2399 } 2400 #pragma omp critical 2401 { 2402 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'critical' region}} 2403 bar(); 2404 } 2405 #pragma omp critical 2406 { 2407 #pragma omp taskwait 2408 bar(); 2409 } 2410 #pragma omp critical(Belka) 2411 { 2412 #pragma omp critical(Strelka) 2413 bar(); 2414 } 2415 #pragma omp critical(Tuzik) // expected-note {{previous 'critical' region starts here}} 2416 { 2417 #pragma omp critical(grelka) // expected-note {{previous 'critical' region starts here}} 2418 { 2419 #pragma omp critical(Tuzik) // expected-error {{cannot nest 'critical' regions having the same name 'Tuzik'}} 2420 { 2421 #pragma omp parallel 2422 #pragma omp critical(grelka) // expected-error {{cannot nest 'critical' regions having the same name 'grelka'}} 2423 { 2424 bar(); 2425 } 2426 } 2427 } 2428 } 2429 #pragma omp critical 2430 { 2431 #pragma omp flush 2432 bar(); 2433 } 2434 #pragma omp critical 2435 { 2436 #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?}} 2437 bar(); 2438 } 2439 #pragma omp critical 2440 { 2441 #pragma omp atomic 2442 ++a; 2443 } 2444 2445 // PARALLEL FOR DIRECTIVE 2446 #pragma omp parallel for 2447 for (int i = 0; i < 10; ++i) { 2448 #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?}} 2449 for (int i = 0; i < 10; ++i) 2450 ; 2451 } 2452 #pragma omp parallel for 2453 for (int i = 0; i < 10; ++i) { 2454 #pragma omp simd 2455 for (int i = 0; i < 10; ++i) 2456 ; 2457 } 2458 #pragma omp parallel for 2459 for (int i = 0; i < 10; ++i) { 2460 #pragma omp parallel 2461 for (int i = 0; i < 10; ++i) 2462 ; 2463 } 2464 #pragma omp parallel for 2465 for (int i = 0; i < 10; ++i) { 2466 #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?}} 2467 { 2468 bar(); 2469 } 2470 } 2471 #pragma omp parallel for 2472 for (int i = 0; i < 10; ++i) { 2473 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a parallel for region}} 2474 { 2475 bar(); 2476 } 2477 } 2478 #pragma omp parallel for 2479 for (int i = 0; i < 10; ++i) { 2480 #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?}} 2481 { 2482 bar(); 2483 } 2484 #pragma omp master // expected-error {{region cannot be closely nested inside 'parallel for' region}} 2485 { 2486 bar(); 2487 } 2488 #pragma omp critical 2489 { 2490 bar(); 2491 } 2492 } 2493 #pragma omp parallel for 2494 for (int i = 0; i < 10; ++i) { 2495 #pragma omp parallel 2496 { 2497 #pragma omp single // OK 2498 { 2499 bar(); 2500 } 2501 #pragma omp master // OK 2502 { 2503 bar(); 2504 } 2505 #pragma omp critical // OK 2506 { 2507 bar(); 2508 } 2509 #pragma omp for // OK 2510 for (int i = 0; i < 10; ++i) 2511 ; 2512 #pragma omp sections // OK 2513 { 2514 bar(); 2515 } 2516 } 2517 } 2518 #pragma omp parallel for 2519 for (int i = 0; i < 10; ++i) { 2520 #pragma omp parallel for 2521 for (int i = 0; i < 10; ++i) 2522 ; 2523 } 2524 #pragma omp parallel for 2525 for (int i = 0; i < 10; ++i) { 2526 #pragma omp parallel sections 2527 { 2528 bar(); 2529 } 2530 } 2531 #pragma omp parallel for 2532 for (int i = 0; i < 10; ++i) { 2533 #pragma omp task 2534 { 2535 bar(); 2536 } 2537 } 2538 #pragma omp parallel for 2539 for (int i = 0; i < 10; ++i) { 2540 #pragma omp taskyield 2541 bar(); 2542 } 2543 #pragma omp parallel for 2544 for (int i = 0; i < 10; ++i) { 2545 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'parallel for' region}} 2546 bar(); 2547 } 2548 #pragma omp parallel for 2549 for (int i = 0; i < 10; ++i) { 2550 #pragma omp taskwait 2551 bar(); 2552 } 2553 #pragma omp parallel for 2554 for (int i = 0; i < 10; ++i) { 2555 #pragma omp flush 2556 bar(); 2557 } 2558 #pragma omp parallel for 2559 for (int i = 0; i < 10; ++i) { 2560 #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?}} 2561 bar(); 2562 } 2563 #pragma omp parallel for ordered 2564 for (int i = 0; i < 10; ++i) { 2565 #pragma omp ordered // OK 2566 bar(); 2567 } 2568 #pragma omp parallel for 2569 for (int i = 0; i < 10; ++i) { 2570 #pragma omp atomic 2571 ++a; 2572 } 2573 2574 // PARALLEL SECTIONS DIRECTIVE 2575 #pragma omp parallel sections 2576 { 2577 #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?}} 2578 for (int i = 0; i < 10; ++i) 2579 ; 2580 } 2581 #pragma omp parallel sections 2582 { 2583 #pragma omp simd 2584 for (int i = 0; i < 10; ++i) 2585 ; 2586 } 2587 #pragma omp parallel sections 2588 { 2589 #pragma omp parallel 2590 for (int i = 0; i < 10; ++i) 2591 ; 2592 } 2593 #pragma omp parallel sections 2594 { 2595 #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?}} 2596 { 2597 bar(); 2598 } 2599 } 2600 #pragma omp parallel sections 2601 { 2602 #pragma omp section 2603 { 2604 bar(); 2605 } 2606 } 2607 #pragma omp parallel sections 2608 { 2609 #pragma omp section 2610 { 2611 #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?}} 2612 bar(); 2613 #pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}} 2614 bar(); 2615 #pragma omp critical 2616 bar(); 2617 } 2618 } 2619 #pragma omp parallel sections 2620 { 2621 #pragma omp parallel 2622 { 2623 #pragma omp single // OK 2624 { 2625 bar(); 2626 } 2627 #pragma omp master // OK 2628 { 2629 bar(); 2630 } 2631 #pragma omp critical // OK 2632 { 2633 bar(); 2634 } 2635 #pragma omp for // OK 2636 for (int i = 0; i < 10; ++i) 2637 ; 2638 #pragma omp sections // OK 2639 { 2640 bar(); 2641 } 2642 } 2643 } 2644 #pragma omp parallel sections 2645 { 2646 #pragma omp parallel for 2647 for (int i = 0; i < 10; ++i) 2648 ; 2649 } 2650 #pragma omp parallel sections 2651 { 2652 #pragma omp parallel sections 2653 { 2654 bar(); 2655 } 2656 } 2657 #pragma omp parallel sections 2658 { 2659 #pragma omp task 2660 { 2661 bar(); 2662 } 2663 } 2664 #pragma omp parallel sections 2665 { 2666 #pragma omp taskyield 2667 } 2668 #pragma omp parallel sections 2669 { 2670 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'parallel sections' region}} 2671 } 2672 #pragma omp parallel sections 2673 { 2674 #pragma omp taskwait 2675 } 2676 #pragma omp parallel sections 2677 { 2678 #pragma omp flush 2679 } 2680 #pragma omp parallel sections 2681 { 2682 #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?}} 2683 bar(); 2684 } 2685 #pragma omp parallel sections 2686 { 2687 #pragma omp atomic 2688 ++a; 2689 } 2690 2691 // TASK DIRECTIVE 2692 #pragma omp task 2693 #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?}} 2694 for (int i = 0; i < 10; ++i) 2695 ; 2696 #pragma omp task 2697 #pragma omp simd 2698 for (int i = 0; i < 10; ++i) 2699 ; 2700 #pragma omp task 2701 #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?}} 2702 { 2703 bar(); 2704 } 2705 #pragma omp task 2706 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a task region}} 2707 { 2708 bar(); 2709 } 2710 #pragma omp task 2711 #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?}} 2712 bar(); 2713 #pragma omp task 2714 #pragma omp master // expected-error {{region cannot be closely nested inside 'task' region}} 2715 bar(); 2716 #pragma omp task 2717 #pragma omp critical 2718 bar(); 2719 #pragma omp task 2720 #pragma omp parallel for 2721 for (int i = 0; i < 10; ++i) 2722 ; 2723 #pragma omp task 2724 #pragma omp parallel sections 2725 { 2726 bar(); 2727 } 2728 #pragma omp task 2729 #pragma omp task 2730 { 2731 bar(); 2732 } 2733 #pragma omp task 2734 { 2735 #pragma omp taskyield 2736 bar(); 2737 } 2738 #pragma omp task 2739 { 2740 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'task' region}} 2741 bar(); 2742 } 2743 #pragma omp task 2744 { 2745 #pragma omp taskwait 2746 bar(); 2747 } 2748 #pragma omp task 2749 { 2750 #pragma omp flush 2751 bar(); 2752 } 2753 #pragma omp task 2754 { 2755 #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?}} 2756 bar(); 2757 } 2758 #pragma omp task 2759 { 2760 #pragma omp atomic 2761 ++a; 2762 } 2763 2764 // ATOMIC DIRECTIVE 2765 #pragma omp atomic 2766 // 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}} 2767 { 2768 #pragma omp for // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 2769 for (int i = 0; i < 10; ++i) 2770 ; 2771 } 2772 #pragma omp atomic 2773 // 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}} 2774 { 2775 #pragma omp simd // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 2776 for (int i = 0; i < 10; ++i) 2777 ; 2778 } 2779 #pragma omp atomic 2780 // 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}} 2781 { 2782 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 2783 for (int i = 0; i < 10; ++i) 2784 ; 2785 } 2786 #pragma omp atomic 2787 // 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}} 2788 { 2789 #pragma omp sections // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 2790 { 2791 bar(); 2792 } 2793 } 2794 #pragma omp atomic 2795 // 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}} 2796 { 2797 #pragma omp section // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 2798 { 2799 bar(); 2800 } 2801 } 2802 #pragma omp atomic 2803 // 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}} 2804 { 2805 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 2806 { 2807 bar(); 2808 } 2809 } 2810 #pragma omp atomic 2811 // 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}} 2812 { 2813 #pragma omp master // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 2814 { 2815 bar(); 2816 } 2817 } 2818 #pragma omp atomic 2819 // 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}} 2820 { 2821 #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 2822 { 2823 bar(); 2824 } 2825 } 2826 #pragma omp atomic 2827 // 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}} 2828 { 2829 #pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 2830 for (int i = 0; i < 10; ++i) 2831 ; 2832 } 2833 #pragma omp atomic 2834 // 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}} 2835 { 2836 #pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 2837 { 2838 bar(); 2839 } 2840 } 2841 #pragma omp atomic 2842 // 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}} 2843 { 2844 #pragma omp task // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 2845 { 2846 bar(); 2847 } 2848 } 2849 #pragma omp atomic 2850 // 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}} 2851 { 2852 #pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 2853 bar(); 2854 } 2855 #pragma omp atomic 2856 // 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}} 2857 { 2858 #pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 2859 bar(); 2860 } 2861 #pragma omp atomic 2862 // 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}} 2863 { 2864 #pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 2865 bar(); 2866 } 2867 #pragma omp atomic 2868 // 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}} 2869 { 2870 #pragma omp flush // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 2871 bar(); 2872 } 2873 #pragma omp atomic 2874 // 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}} 2875 { 2876 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 2877 bar(); 2878 } 2879 #pragma omp atomic 2880 // 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}} 2881 { 2882 #pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside an atomic region}} 2883 ++a; 2884 } 2885 return foo<int>(); 2886 } 2887 2888