1*2bfce22aSSaiyedul Islam // RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp4 %s -Wuninitialized 25bbceadfSAlexey Bataev // RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp5 %s -Wuninitialized 35bbceadfSAlexey Bataev 4*2bfce22aSSaiyedul Islam // RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp4 %s -Wuninitialized 55bbceadfSAlexey Bataev // RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp5 %s -Wuninitialized 65bbceadfSAlexey Bataev 75bbceadfSAlexey Bataev class S { 85bbceadfSAlexey Bataev int a; 95bbceadfSAlexey Bataev S() : a(0) {} 105bbceadfSAlexey Bataev 115bbceadfSAlexey Bataev public: 125bbceadfSAlexey Bataev S(int v) : a(v) {} 135bbceadfSAlexey Bataev S(const S &s) : a(s.a) {} 145bbceadfSAlexey Bataev }; 155bbceadfSAlexey Bataev 165bbceadfSAlexey Bataev static int sii; 175bbceadfSAlexey Bataev // expected-note@+1 {{defined as threadprivate or thread local}} 185bbceadfSAlexey Bataev #pragma omp threadprivate(sii) 195bbceadfSAlexey Bataev static int globalii; 205bbceadfSAlexey Bataev 215bbceadfSAlexey Bataev // Currently, we cannot use "0" for global register variables. 225bbceadfSAlexey Bataev // register int reg0 __asm__("0"); 235bbceadfSAlexey Bataev int reg0; 245bbceadfSAlexey Bataev 255bbceadfSAlexey Bataev int test_iteration_spaces() { 265bbceadfSAlexey Bataev const int N = 100; 275bbceadfSAlexey Bataev float a[N], b[N], c[N]; 285bbceadfSAlexey Bataev int ii, jj, kk; 295bbceadfSAlexey Bataev float fii; 305bbceadfSAlexey Bataev double dii; 315bbceadfSAlexey Bataev register int reg; // expected-warning {{'register' storage class specifier is deprecated}} 325bbceadfSAlexey Bataev #pragma omp parallel 335bbceadfSAlexey Bataev #pragma omp parallel master taskloop 345bbceadfSAlexey Bataev for (int i = 0; i < 10; i += 1) { 355bbceadfSAlexey Bataev c[i] = a[i] + b[i]; 365bbceadfSAlexey Bataev } 375bbceadfSAlexey Bataev #pragma omp parallel 385bbceadfSAlexey Bataev #pragma omp parallel master taskloop 395bbceadfSAlexey Bataev for (char i = 0; i < 10; i++) { 405bbceadfSAlexey Bataev c[i] = a[i] + b[i]; 415bbceadfSAlexey Bataev } 425bbceadfSAlexey Bataev #pragma omp parallel 435bbceadfSAlexey Bataev #pragma omp parallel master taskloop 445bbceadfSAlexey Bataev for (char i = 0; i < 10; i += '\1') { 455bbceadfSAlexey Bataev c[i] = a[i] + b[i]; 465bbceadfSAlexey Bataev } 475bbceadfSAlexey Bataev #pragma omp parallel 485bbceadfSAlexey Bataev #pragma omp parallel master taskloop 495bbceadfSAlexey Bataev for (long long i = 0; i < 10; i++) { 505bbceadfSAlexey Bataev c[i] = a[i] + b[i]; 515bbceadfSAlexey Bataev } 525bbceadfSAlexey Bataev #pragma omp parallel 535bbceadfSAlexey Bataev // expected-error@+2 {{expression must have integral or unscoped enumeration type, not 'double'}} 545bbceadfSAlexey Bataev #pragma omp parallel master taskloop 555bbceadfSAlexey Bataev for (long long i = 0; i < 10; i += 1.5) { 565bbceadfSAlexey Bataev c[i] = a[i] + b[i]; 575bbceadfSAlexey Bataev } 585bbceadfSAlexey Bataev #pragma omp parallel 595bbceadfSAlexey Bataev #pragma omp parallel master taskloop 605bbceadfSAlexey Bataev for (long long i = 0; i < 'z'; i += 1u) { 615bbceadfSAlexey Bataev c[i] = a[i] + b[i]; 625bbceadfSAlexey Bataev } 635bbceadfSAlexey Bataev #pragma omp parallel 645bbceadfSAlexey Bataev // expected-error@+2 {{variable must be of integer or random access iterator type}} 655bbceadfSAlexey Bataev #pragma omp parallel master taskloop 665bbceadfSAlexey Bataev for (float fi = 0; fi < 10.0; fi++) { 675bbceadfSAlexey Bataev c[(int)fi] = a[(int)fi] + b[(int)fi]; 685bbceadfSAlexey Bataev } 695bbceadfSAlexey Bataev #pragma omp parallel 705bbceadfSAlexey Bataev // expected-error@+2 {{variable must be of integer or random access iterator type}} 715bbceadfSAlexey Bataev #pragma omp parallel master taskloop 725bbceadfSAlexey Bataev for (double fi = 0; fi < 10.0; fi++) { 735bbceadfSAlexey Bataev c[(int)fi] = a[(int)fi] + b[(int)fi]; 745bbceadfSAlexey Bataev } 755bbceadfSAlexey Bataev #pragma omp parallel 765bbceadfSAlexey Bataev // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 775bbceadfSAlexey Bataev #pragma omp parallel master taskloop 785bbceadfSAlexey Bataev for (int &ref = ii; ref < 10; ref++) { 795bbceadfSAlexey Bataev } 805bbceadfSAlexey Bataev #pragma omp parallel 815bbceadfSAlexey Bataev // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 825bbceadfSAlexey Bataev #pragma omp parallel master taskloop 835bbceadfSAlexey Bataev for (int i; i < 10; i++) 845bbceadfSAlexey Bataev c[i] = a[i]; 855bbceadfSAlexey Bataev 865bbceadfSAlexey Bataev #pragma omp parallel 875bbceadfSAlexey Bataev // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 885bbceadfSAlexey Bataev #pragma omp parallel master taskloop 895bbceadfSAlexey Bataev for (int i = 0, j = 0; i < 10; ++i) 905bbceadfSAlexey Bataev c[i] = a[i]; 915bbceadfSAlexey Bataev 925bbceadfSAlexey Bataev #pragma omp parallel 935bbceadfSAlexey Bataev // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 945bbceadfSAlexey Bataev #pragma omp parallel master taskloop 955bbceadfSAlexey Bataev for (; ii < 10; ++ii) 965bbceadfSAlexey Bataev c[ii] = a[ii]; 975bbceadfSAlexey Bataev 985bbceadfSAlexey Bataev #pragma omp parallel 995bbceadfSAlexey Bataev // expected-warning@+3 {{expression result unused}} 1005bbceadfSAlexey Bataev // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 1015bbceadfSAlexey Bataev #pragma omp parallel master taskloop 1025bbceadfSAlexey Bataev for (ii + 1; ii < 10; ++ii) 1035bbceadfSAlexey Bataev c[ii] = a[ii]; 1045bbceadfSAlexey Bataev 1055bbceadfSAlexey Bataev #pragma omp parallel 1065bbceadfSAlexey Bataev // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 1075bbceadfSAlexey Bataev #pragma omp parallel master taskloop 1085bbceadfSAlexey Bataev for (c[ii] = 0; ii < 10; ++ii) 1095bbceadfSAlexey Bataev c[ii] = a[ii]; 1105bbceadfSAlexey Bataev 1115bbceadfSAlexey Bataev #pragma omp parallel 1125bbceadfSAlexey Bataev // Ok to skip parenthesises. 1135bbceadfSAlexey Bataev #pragma omp parallel master taskloop 1145bbceadfSAlexey Bataev for (((ii)) = 0; ii < 10; ++ii) 1155bbceadfSAlexey Bataev c[ii] = a[ii]; 1165bbceadfSAlexey Bataev 1175bbceadfSAlexey Bataev #pragma omp parallel 1185bbceadfSAlexey Bataev // omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp5-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}} 1195bbceadfSAlexey Bataev #pragma omp parallel master taskloop 1205bbceadfSAlexey Bataev for (int i = 0; i; i++) 1215bbceadfSAlexey Bataev c[i] = a[i]; 1225bbceadfSAlexey Bataev 1235bbceadfSAlexey Bataev #pragma omp parallel 1245bbceadfSAlexey Bataev // omp4-error@+3 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp5-error@+3 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}} 1255bbceadfSAlexey Bataev // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'i'}} 1265bbceadfSAlexey Bataev #pragma omp parallel master taskloop 1275bbceadfSAlexey Bataev for (int i = 0; jj < kk; ii++) 1285bbceadfSAlexey Bataev c[i] = a[i]; 1295bbceadfSAlexey Bataev 1305bbceadfSAlexey Bataev #pragma omp parallel 1315bbceadfSAlexey Bataev // omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp5-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}} 1325bbceadfSAlexey Bataev #pragma omp parallel master taskloop 1335bbceadfSAlexey Bataev for (int i = 0; !!i; i++) 1345bbceadfSAlexey Bataev c[i] = a[i]; 1355bbceadfSAlexey Bataev 1365bbceadfSAlexey Bataev // Ok 1375bbceadfSAlexey Bataev #pragma omp parallel 1385bbceadfSAlexey Bataev // omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} 1395bbceadfSAlexey Bataev #pragma omp parallel master taskloop 1405bbceadfSAlexey Bataev for (int i = 0; i != 1; i++) 1415bbceadfSAlexey Bataev c[i] = a[i]; 1425bbceadfSAlexey Bataev 1435bbceadfSAlexey Bataev #pragma omp parallel 1445bbceadfSAlexey Bataev // omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp5-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}} 1455bbceadfSAlexey Bataev #pragma omp parallel master taskloop 1465bbceadfSAlexey Bataev for (int i = 0;; i++) 1475bbceadfSAlexey Bataev c[i] = a[i]; 1485bbceadfSAlexey Bataev 1495bbceadfSAlexey Bataev #pragma omp parallel 1505bbceadfSAlexey Bataev // Ok. 1515bbceadfSAlexey Bataev #pragma omp parallel master taskloop 1525bbceadfSAlexey Bataev for (int i = 11; i > 10; i--) 1535bbceadfSAlexey Bataev c[i] = a[i]; 1545bbceadfSAlexey Bataev 1555bbceadfSAlexey Bataev #pragma omp parallel 1565bbceadfSAlexey Bataev // Ok. 1575bbceadfSAlexey Bataev #pragma omp parallel master taskloop 1585bbceadfSAlexey Bataev for (int i = 0; i < 10; ++i) 1595bbceadfSAlexey Bataev c[i] = a[i]; 1605bbceadfSAlexey Bataev 1615bbceadfSAlexey Bataev #pragma omp parallel 1625bbceadfSAlexey Bataev // Ok. 1635bbceadfSAlexey Bataev #pragma omp parallel master taskloop 1645bbceadfSAlexey Bataev for (ii = 0; ii < 10; ++ii) 1655bbceadfSAlexey Bataev c[ii] = a[ii]; 1665bbceadfSAlexey Bataev 1675bbceadfSAlexey Bataev #pragma omp parallel 1685bbceadfSAlexey Bataev // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}} 1695bbceadfSAlexey Bataev #pragma omp parallel master taskloop 1705bbceadfSAlexey Bataev for (ii = 0; ii < 10; ++jj) 1715bbceadfSAlexey Bataev c[ii] = a[jj]; 1725bbceadfSAlexey Bataev 1735bbceadfSAlexey Bataev #pragma omp parallel 1745bbceadfSAlexey Bataev // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}} 1755bbceadfSAlexey Bataev #pragma omp parallel master taskloop 1765bbceadfSAlexey Bataev for (ii = 0; ii < 10; ++++ii) 1775bbceadfSAlexey Bataev c[ii] = a[ii]; 1785bbceadfSAlexey Bataev 1795bbceadfSAlexey Bataev #pragma omp parallel 1805bbceadfSAlexey Bataev // Ok but undefined behavior (in general, cannot check that incr 1815bbceadfSAlexey Bataev // is really loop-invariant). 1825bbceadfSAlexey Bataev #pragma omp parallel master taskloop 1835bbceadfSAlexey Bataev for (ii = 0; ii < 10; ii = ii + ii) 1845bbceadfSAlexey Bataev c[ii] = a[ii]; 1855bbceadfSAlexey Bataev 1865bbceadfSAlexey Bataev #pragma omp parallel 1875bbceadfSAlexey Bataev // expected-error@+2 {{expression must have integral or unscoped enumeration type, not 'float'}} 1885bbceadfSAlexey Bataev #pragma omp parallel master taskloop 1895bbceadfSAlexey Bataev for (ii = 0; ii < 10; ii = ii + 1.0f) 1905bbceadfSAlexey Bataev c[ii] = a[ii]; 1915bbceadfSAlexey Bataev 1925bbceadfSAlexey Bataev #pragma omp parallel 1935bbceadfSAlexey Bataev // Ok - step was converted to integer type. 1945bbceadfSAlexey Bataev #pragma omp parallel master taskloop 1955bbceadfSAlexey Bataev for (ii = 0; ii < 10; ii = ii + (int)1.1f) 1965bbceadfSAlexey Bataev c[ii] = a[ii]; 1975bbceadfSAlexey Bataev 1985bbceadfSAlexey Bataev #pragma omp parallel 1995bbceadfSAlexey Bataev // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}} 2005bbceadfSAlexey Bataev #pragma omp parallel master taskloop 2015bbceadfSAlexey Bataev for (ii = 0; ii < 10; jj = ii + 2) 2025bbceadfSAlexey Bataev c[ii] = a[ii]; 2035bbceadfSAlexey Bataev 2045bbceadfSAlexey Bataev #pragma omp parallel 2055bbceadfSAlexey Bataev // expected-warning@+3 {{relational comparison result unused}} 2065bbceadfSAlexey Bataev // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}} 2075bbceadfSAlexey Bataev #pragma omp parallel master taskloop 2085bbceadfSAlexey Bataev for (ii = 0; ii<10; jj> kk + 2) 2095bbceadfSAlexey Bataev c[ii] = a[ii]; 2105bbceadfSAlexey Bataev 2115bbceadfSAlexey Bataev #pragma omp parallel 2125bbceadfSAlexey Bataev // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}} 2135bbceadfSAlexey Bataev #pragma omp parallel master taskloop 2145bbceadfSAlexey Bataev for (ii = 0; ii < 10;) 2155bbceadfSAlexey Bataev c[ii] = a[ii]; 2165bbceadfSAlexey Bataev 2175bbceadfSAlexey Bataev #pragma omp parallel 2185bbceadfSAlexey Bataev // expected-warning@+3 {{expression result unused}} 2195bbceadfSAlexey Bataev // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}} 2205bbceadfSAlexey Bataev #pragma omp parallel master taskloop 2215bbceadfSAlexey Bataev for (ii = 0; ii < 10; !ii) 2225bbceadfSAlexey Bataev c[ii] = a[ii]; 2235bbceadfSAlexey Bataev 2245bbceadfSAlexey Bataev #pragma omp parallel 2255bbceadfSAlexey Bataev // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}} 2265bbceadfSAlexey Bataev #pragma omp parallel master taskloop 2275bbceadfSAlexey Bataev for (ii = 0; ii < 10; ii ? ++ii : ++jj) 2285bbceadfSAlexey Bataev c[ii] = a[ii]; 2295bbceadfSAlexey Bataev 2305bbceadfSAlexey Bataev #pragma omp parallel 2315bbceadfSAlexey Bataev // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}} 2325bbceadfSAlexey Bataev #pragma omp parallel master taskloop 2335bbceadfSAlexey Bataev for (ii = 0; ii < 10; ii = ii < 10) 2345bbceadfSAlexey Bataev c[ii] = a[ii]; 2355bbceadfSAlexey Bataev 2365bbceadfSAlexey Bataev #pragma omp parallel 2375bbceadfSAlexey Bataev // expected-note@+3 {{loop step is expected to be positive due to this condition}} 2385bbceadfSAlexey Bataev // expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}} 2395bbceadfSAlexey Bataev #pragma omp parallel master taskloop 2405bbceadfSAlexey Bataev for (ii = 0; ii < 10; ii = ii + 0) 2415bbceadfSAlexey Bataev c[ii] = a[ii]; 2425bbceadfSAlexey Bataev 2435bbceadfSAlexey Bataev #pragma omp parallel 2445bbceadfSAlexey Bataev // expected-note@+3 {{loop step is expected to be positive due to this condition}} 2455bbceadfSAlexey Bataev // expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}} 2465bbceadfSAlexey Bataev #pragma omp parallel master taskloop 2475bbceadfSAlexey Bataev for (ii = 0; ii < 10; ii = ii + (int)(0.8 - 0.45)) 2485bbceadfSAlexey Bataev c[ii] = a[ii]; 2495bbceadfSAlexey Bataev 2505bbceadfSAlexey Bataev #pragma omp parallel 2515bbceadfSAlexey Bataev // expected-note@+3 {{loop step is expected to be positive due to this condition}} 2525bbceadfSAlexey Bataev // expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}} 2535bbceadfSAlexey Bataev #pragma omp parallel master taskloop 2545bbceadfSAlexey Bataev for (ii = 0; (ii) < 10; ii -= 25) 2555bbceadfSAlexey Bataev c[ii] = a[ii]; 2565bbceadfSAlexey Bataev 2575bbceadfSAlexey Bataev #pragma omp parallel 2585bbceadfSAlexey Bataev // expected-note@+3 {{loop step is expected to be positive due to this condition}} 2595bbceadfSAlexey Bataev // expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}} 2605bbceadfSAlexey Bataev #pragma omp parallel master taskloop 2615bbceadfSAlexey Bataev for (ii = 0; (ii < 10); ii -= 0) 2625bbceadfSAlexey Bataev c[ii] = a[ii]; 2635bbceadfSAlexey Bataev 2645bbceadfSAlexey Bataev #pragma omp parallel 2655bbceadfSAlexey Bataev // expected-note@+3 {{loop step is expected to be negative due to this condition}} 2665bbceadfSAlexey Bataev // expected-error@+2 {{increment expression must cause 'ii' to decrease on each iteration of OpenMP for loop}} 2675bbceadfSAlexey Bataev #pragma omp parallel master taskloop 2685bbceadfSAlexey Bataev for (ii = 0; ii > 10; (ii += 0)) 2695bbceadfSAlexey Bataev c[ii] = a[ii]; 2705bbceadfSAlexey Bataev 2715bbceadfSAlexey Bataev #pragma omp parallel 2725bbceadfSAlexey Bataev // expected-note@+3 {{loop step is expected to be positive due to this condition}} 2735bbceadfSAlexey Bataev // expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}} 2745bbceadfSAlexey Bataev #pragma omp parallel master taskloop 2755bbceadfSAlexey Bataev for (ii = 0; ii < 10; (ii) = (1 - 1) + (ii)) 2765bbceadfSAlexey Bataev c[ii] = a[ii]; 2775bbceadfSAlexey Bataev 2785bbceadfSAlexey Bataev #pragma omp parallel 2795bbceadfSAlexey Bataev // expected-note@+3 {{loop step is expected to be negative due to this condition}} 2805bbceadfSAlexey Bataev // expected-error@+2 {{increment expression must cause 'ii' to decrease on each iteration of OpenMP for loop}} 2815bbceadfSAlexey Bataev #pragma omp parallel master taskloop 2825bbceadfSAlexey Bataev for ((ii = 0); ii > 10; (ii -= 0)) 2835bbceadfSAlexey Bataev c[ii] = a[ii]; 2845bbceadfSAlexey Bataev 2855bbceadfSAlexey Bataev #pragma omp parallel 2865bbceadfSAlexey Bataev // expected-note@+3 {{loop step is expected to be positive due to this condition}} 2875bbceadfSAlexey Bataev // expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}} 2885bbceadfSAlexey Bataev #pragma omp parallel master taskloop 2895bbceadfSAlexey Bataev for (ii = 0; (ii < 10); (ii -= 0)) 2905bbceadfSAlexey Bataev c[ii] = a[ii]; 2915bbceadfSAlexey Bataev 2925bbceadfSAlexey Bataev #pragma omp parallel 2935bbceadfSAlexey Bataev // expected-note@+2 {{defined as firstprivate}} 2945bbceadfSAlexey Bataev // expected-error@+2 {{loop iteration variable in the associated loop of 'omp parallel master taskloop' directive may not be firstprivate, predetermined as private}} 2955bbceadfSAlexey Bataev #pragma omp parallel master taskloop firstprivate(ii) 2965bbceadfSAlexey Bataev for (ii = 0; ii < 10; ii++) 2975bbceadfSAlexey Bataev c[ii] = a[ii]; 2985bbceadfSAlexey Bataev 2995bbceadfSAlexey Bataev #pragma omp parallel 3005bbceadfSAlexey Bataev // expected-error@+1 {{unexpected OpenMP clause 'linear' in directive '#pragma omp parallel master taskloop'}} 3015bbceadfSAlexey Bataev #pragma omp parallel master taskloop linear(ii) 3025bbceadfSAlexey Bataev for (ii = 0; ii < 10; ii++) 3035bbceadfSAlexey Bataev c[ii] = a[ii]; 3045bbceadfSAlexey Bataev 3055bbceadfSAlexey Bataev #pragma omp parallel 3065bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(ii) 3075bbceadfSAlexey Bataev for (ii = 0; ii < 10; ii++) 3085bbceadfSAlexey Bataev c[ii] = a[ii]; 3095bbceadfSAlexey Bataev 3105bbceadfSAlexey Bataev #pragma omp parallel 3115bbceadfSAlexey Bataev #pragma omp parallel master taskloop lastprivate(ii) 3125bbceadfSAlexey Bataev for (ii = 0; ii < 10; ii++) 3135bbceadfSAlexey Bataev c[ii] = a[ii]; 3145bbceadfSAlexey Bataev 3155bbceadfSAlexey Bataev #pragma omp parallel 3165bbceadfSAlexey Bataev { 3175bbceadfSAlexey Bataev // expected-error@+2 {{loop iteration variable in the associated loop of 'omp parallel master taskloop' directive may not be threadprivate or thread local, predetermined as private}} 3185bbceadfSAlexey Bataev #pragma omp parallel master taskloop 3195bbceadfSAlexey Bataev for (sii = 0; sii < 10; sii += 1) 3205bbceadfSAlexey Bataev c[sii] = a[sii]; 3215bbceadfSAlexey Bataev } 3225bbceadfSAlexey Bataev 3235bbceadfSAlexey Bataev #pragma omp parallel 3245bbceadfSAlexey Bataev { 3255bbceadfSAlexey Bataev #pragma omp parallel master taskloop 3265bbceadfSAlexey Bataev for (reg0 = 0; reg0 < 10; reg0 += 1) 3275bbceadfSAlexey Bataev c[reg0] = a[reg0]; 3285bbceadfSAlexey Bataev } 3295bbceadfSAlexey Bataev 3305bbceadfSAlexey Bataev #pragma omp parallel 3315bbceadfSAlexey Bataev { 3325bbceadfSAlexey Bataev #pragma omp parallel master taskloop 3335bbceadfSAlexey Bataev for (reg = 0; reg < 10; reg += 1) 3345bbceadfSAlexey Bataev c[reg] = a[reg]; 3355bbceadfSAlexey Bataev } 3365bbceadfSAlexey Bataev 3375bbceadfSAlexey Bataev #pragma omp parallel 3385bbceadfSAlexey Bataev { 3395bbceadfSAlexey Bataev #pragma omp parallel master taskloop 3405bbceadfSAlexey Bataev for (globalii = 0; globalii < 10; globalii += 1) 3415bbceadfSAlexey Bataev c[globalii] = a[globalii]; 3425bbceadfSAlexey Bataev } 3435bbceadfSAlexey Bataev 3445bbceadfSAlexey Bataev #pragma omp parallel 3455bbceadfSAlexey Bataev { 3465bbceadfSAlexey Bataev #pragma omp parallel master taskloop collapse(2) 3475bbceadfSAlexey Bataev for (ii = 0; ii < 10; ii += 1) 3485bbceadfSAlexey Bataev for (globalii = 0; globalii < 10; globalii += 1) 3495bbceadfSAlexey Bataev c[globalii] += a[globalii] + ii; 3505bbceadfSAlexey Bataev } 3515bbceadfSAlexey Bataev 3525bbceadfSAlexey Bataev #pragma omp parallel 3535bbceadfSAlexey Bataev // omp4-error@+2 {{statement after '#pragma omp parallel master taskloop' must be a for loop}} 3545bbceadfSAlexey Bataev #pragma omp parallel master taskloop 3555bbceadfSAlexey Bataev for (auto &item : a) { 3565bbceadfSAlexey Bataev item = item + 1; 3575bbceadfSAlexey Bataev } 3585bbceadfSAlexey Bataev 3595bbceadfSAlexey Bataev #pragma omp parallel 3605bbceadfSAlexey Bataev // expected-note@+3 {{loop step is expected to be positive due to this condition}} 3615bbceadfSAlexey Bataev // expected-error@+2 {{increment expression must cause 'i' to increase on each iteration of OpenMP for loop}} 3625bbceadfSAlexey Bataev #pragma omp parallel master taskloop 3635bbceadfSAlexey Bataev for (unsigned i = 9; i < 10; i--) { 3645bbceadfSAlexey Bataev c[i] = a[i] + b[i]; 3655bbceadfSAlexey Bataev } 3665bbceadfSAlexey Bataev 3675bbceadfSAlexey Bataev int(*lb)[4] = nullptr; 3685bbceadfSAlexey Bataev #pragma omp parallel 3695bbceadfSAlexey Bataev #pragma omp parallel master taskloop 3705bbceadfSAlexey Bataev for (int(*p)[4] = lb; p < lb + 8; ++p) { 3715bbceadfSAlexey Bataev } 3725bbceadfSAlexey Bataev 3735bbceadfSAlexey Bataev #pragma omp parallel 3745bbceadfSAlexey Bataev // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 3755bbceadfSAlexey Bataev #pragma omp parallel master taskloop 3765bbceadfSAlexey Bataev for (int a{0}; a < 10; ++a) { 3775bbceadfSAlexey Bataev } 3785bbceadfSAlexey Bataev 3795bbceadfSAlexey Bataev return 0; 3805bbceadfSAlexey Bataev } 3815bbceadfSAlexey Bataev 3825bbceadfSAlexey Bataev // Iterators allowed in openmp for-loops. 3835bbceadfSAlexey Bataev namespace std { 3845bbceadfSAlexey Bataev struct random_access_iterator_tag {}; 3855bbceadfSAlexey Bataev template <class Iter> 3865bbceadfSAlexey Bataev struct iterator_traits { 3875bbceadfSAlexey Bataev typedef typename Iter::difference_type difference_type; 3885bbceadfSAlexey Bataev typedef typename Iter::iterator_category iterator_category; 3895bbceadfSAlexey Bataev }; 3905bbceadfSAlexey Bataev template <class Iter> 3915bbceadfSAlexey Bataev typename iterator_traits<Iter>::difference_type 3925bbceadfSAlexey Bataev distance(Iter first, Iter last) { return first - last; } 3935bbceadfSAlexey Bataev } 3945bbceadfSAlexey Bataev class Iter0 { 3955bbceadfSAlexey Bataev public: 3965bbceadfSAlexey Bataev Iter0() {} 3975bbceadfSAlexey Bataev Iter0(const Iter0 &) {} 3985bbceadfSAlexey Bataev Iter0 operator++() { return *this; } 3995bbceadfSAlexey Bataev Iter0 operator--() { return *this; } 4005bbceadfSAlexey Bataev bool operator<(Iter0 a) { return true; } 4015bbceadfSAlexey Bataev }; 4025bbceadfSAlexey Bataev // expected-note@+2 {{candidate function not viable: no known conversion from 'GoodIter' to 'Iter0' for 1st argument}} 4035bbceadfSAlexey Bataev // expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'Iter0' for 1st argument}} 4045bbceadfSAlexey Bataev int operator-(Iter0 a, Iter0 b) { return 0; } 4055bbceadfSAlexey Bataev class Iter1 { 4065bbceadfSAlexey Bataev public: 4075bbceadfSAlexey Bataev Iter1(float f = 0.0f, double d = 0.0) {} 4085bbceadfSAlexey Bataev Iter1(const Iter1 &) {} 4095bbceadfSAlexey Bataev Iter1 operator++() { return *this; } 4105bbceadfSAlexey Bataev Iter1 operator--() { return *this; } 4115bbceadfSAlexey Bataev bool operator<(Iter1 a) { return true; } 4125bbceadfSAlexey Bataev bool operator>=(Iter1 a) { return false; } 4135bbceadfSAlexey Bataev }; 4145bbceadfSAlexey Bataev class GoodIter { 4155bbceadfSAlexey Bataev public: 4165bbceadfSAlexey Bataev GoodIter() {} 4175bbceadfSAlexey Bataev GoodIter(const GoodIter &) {} 4185bbceadfSAlexey Bataev GoodIter(int fst, int snd) {} 4195bbceadfSAlexey Bataev GoodIter &operator=(const GoodIter &that) { return *this; } 4205bbceadfSAlexey Bataev GoodIter &operator=(const Iter0 &that) { return *this; } 4215bbceadfSAlexey Bataev GoodIter &operator+=(int x) { return *this; } 4225bbceadfSAlexey Bataev GoodIter &operator-=(int x) { return *this; } 4235bbceadfSAlexey Bataev explicit GoodIter(void *) {} 4245bbceadfSAlexey Bataev GoodIter operator++() { return *this; } 4255bbceadfSAlexey Bataev GoodIter operator--() { return *this; } 4265bbceadfSAlexey Bataev bool operator!() { return true; } 4275bbceadfSAlexey Bataev bool operator<(GoodIter a) { return true; } 4285bbceadfSAlexey Bataev bool operator<=(GoodIter a) { return true; } 4295bbceadfSAlexey Bataev bool operator>=(GoodIter a) { return false; } 4305bbceadfSAlexey Bataev typedef int difference_type; 4315bbceadfSAlexey Bataev typedef std::random_access_iterator_tag iterator_category; 4325bbceadfSAlexey Bataev }; 4335bbceadfSAlexey Bataev // expected-note@+2 {{candidate function not viable: no known conversion from 'const Iter0' to 'GoodIter' for 2nd argument}} 4345bbceadfSAlexey Bataev // expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'GoodIter' for 1st argument}} 4355bbceadfSAlexey Bataev int operator-(GoodIter a, GoodIter b) { return 0; } 4365bbceadfSAlexey Bataev // expected-note@+1 3 {{candidate function not viable: requires single argument 'a', but 2 arguments were provided}} 4375bbceadfSAlexey Bataev GoodIter operator-(GoodIter a) { return a; } 4385bbceadfSAlexey Bataev // expected-note@+2 {{candidate function not viable: no known conversion from 'const Iter0' to 'int' for 2nd argument}} 4395bbceadfSAlexey Bataev // expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'GoodIter' for 1st argument}} 4405bbceadfSAlexey Bataev GoodIter operator-(GoodIter a, int v) { return GoodIter(); } 4415bbceadfSAlexey Bataev // expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter0' to 'GoodIter' for 1st argument}} 4425bbceadfSAlexey Bataev GoodIter operator+(GoodIter a, int v) { return GoodIter(); } 4435bbceadfSAlexey Bataev // expected-note@+2 {{candidate function not viable: no known conversion from 'GoodIter' to 'int' for 1st argument}} 4445bbceadfSAlexey Bataev // expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'int' for 1st argument}} 4455bbceadfSAlexey Bataev GoodIter operator-(int v, GoodIter a) { return GoodIter(); } 4465bbceadfSAlexey Bataev // expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter0' to 'int' for 1st argument}} 4475bbceadfSAlexey Bataev GoodIter operator+(int v, GoodIter a) { return GoodIter(); } 4485bbceadfSAlexey Bataev 4495bbceadfSAlexey Bataev int test_with_random_access_iterator() { 4505bbceadfSAlexey Bataev GoodIter begin, end; 4515bbceadfSAlexey Bataev Iter0 begin0, end0; 4525bbceadfSAlexey Bataev #pragma omp parallel 4535bbceadfSAlexey Bataev #pragma omp parallel master taskloop 4545bbceadfSAlexey Bataev for (GoodIter I = begin; I < end; ++I) 4555bbceadfSAlexey Bataev ++I; 4565bbceadfSAlexey Bataev #pragma omp parallel 4575bbceadfSAlexey Bataev // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 4585bbceadfSAlexey Bataev #pragma omp parallel master taskloop 4595bbceadfSAlexey Bataev for (GoodIter &I = begin; I < end; ++I) 4605bbceadfSAlexey Bataev ++I; 4615bbceadfSAlexey Bataev #pragma omp parallel 4625bbceadfSAlexey Bataev #pragma omp parallel master taskloop 4635bbceadfSAlexey Bataev for (GoodIter I = begin; I >= end; --I) 4645bbceadfSAlexey Bataev ++I; 4655bbceadfSAlexey Bataev #pragma omp parallel 4665bbceadfSAlexey Bataev // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 4675bbceadfSAlexey Bataev #pragma omp parallel master taskloop 4685bbceadfSAlexey Bataev for (GoodIter I(begin); I < end; ++I) 4695bbceadfSAlexey Bataev ++I; 4705bbceadfSAlexey Bataev #pragma omp parallel 4715bbceadfSAlexey Bataev // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 4725bbceadfSAlexey Bataev #pragma omp parallel master taskloop 4735bbceadfSAlexey Bataev for (GoodIter I(nullptr); I < end; ++I) 4745bbceadfSAlexey Bataev ++I; 4755bbceadfSAlexey Bataev #pragma omp parallel 4765bbceadfSAlexey Bataev // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 4775bbceadfSAlexey Bataev #pragma omp parallel master taskloop 4785bbceadfSAlexey Bataev for (GoodIter I(0); I < end; ++I) 4795bbceadfSAlexey Bataev ++I; 4805bbceadfSAlexey Bataev #pragma omp parallel 4815bbceadfSAlexey Bataev // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 4825bbceadfSAlexey Bataev #pragma omp parallel master taskloop 4835bbceadfSAlexey Bataev for (GoodIter I(1, 2); I < end; ++I) 4845bbceadfSAlexey Bataev ++I; 4855bbceadfSAlexey Bataev #pragma omp parallel 4865bbceadfSAlexey Bataev #pragma omp parallel master taskloop 4875bbceadfSAlexey Bataev for (begin = GoodIter(0); begin < end; ++begin) 4885bbceadfSAlexey Bataev ++begin; 4895bbceadfSAlexey Bataev // expected-error@+4 {{invalid operands to binary expression ('GoodIter' and 'const Iter0')}} 4905bbceadfSAlexey Bataev // expected-error@+3 {{could not calculate number of iterations calling 'operator-' with upper and lower loop bounds}} 4915bbceadfSAlexey Bataev #pragma omp parallel 4925bbceadfSAlexey Bataev #pragma omp parallel master taskloop 4935bbceadfSAlexey Bataev for (begin = begin0; begin < end; ++begin) 4945bbceadfSAlexey Bataev ++begin; 4955bbceadfSAlexey Bataev #pragma omp parallel 4965bbceadfSAlexey Bataev // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 4975bbceadfSAlexey Bataev #pragma omp parallel master taskloop 4985bbceadfSAlexey Bataev for (++begin; begin < end; ++begin) 4995bbceadfSAlexey Bataev ++begin; 5005bbceadfSAlexey Bataev #pragma omp parallel 5015bbceadfSAlexey Bataev #pragma omp parallel master taskloop 5025bbceadfSAlexey Bataev for (begin = end; begin < end; ++begin) 5035bbceadfSAlexey Bataev ++begin; 5045bbceadfSAlexey Bataev #pragma omp parallel 5055bbceadfSAlexey Bataev // omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} omp5-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'I'}} 5065bbceadfSAlexey Bataev #pragma omp parallel master taskloop 5075bbceadfSAlexey Bataev for (GoodIter I = begin; I - I; ++I) 5085bbceadfSAlexey Bataev ++I; 5095bbceadfSAlexey Bataev #pragma omp parallel 5105bbceadfSAlexey Bataev // omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} omp5-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'I'}} 5115bbceadfSAlexey Bataev #pragma omp parallel master taskloop 5125bbceadfSAlexey Bataev for (GoodIter I = begin; begin < end; ++I) 5135bbceadfSAlexey Bataev ++I; 5145bbceadfSAlexey Bataev #pragma omp parallel 5155bbceadfSAlexey Bataev // omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} omp5-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'I'}} 5165bbceadfSAlexey Bataev #pragma omp parallel master taskloop 5175bbceadfSAlexey Bataev for (GoodIter I = begin; !I; ++I) 5185bbceadfSAlexey Bataev ++I; 5195bbceadfSAlexey Bataev #pragma omp parallel 5205bbceadfSAlexey Bataev // expected-note@+3 {{loop step is expected to be negative due to this condition}} 5215bbceadfSAlexey Bataev // expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}} 5225bbceadfSAlexey Bataev #pragma omp parallel master taskloop 5235bbceadfSAlexey Bataev for (GoodIter I = begin; I >= end; I = I + 1) 5245bbceadfSAlexey Bataev ++I; 5255bbceadfSAlexey Bataev #pragma omp parallel 5265bbceadfSAlexey Bataev #pragma omp parallel master taskloop 5275bbceadfSAlexey Bataev for (GoodIter I = begin; I >= end; I = I - 1) 5285bbceadfSAlexey Bataev ++I; 5295bbceadfSAlexey Bataev #pragma omp parallel 5305bbceadfSAlexey Bataev // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'I'}} 5315bbceadfSAlexey Bataev #pragma omp parallel master taskloop 5325bbceadfSAlexey Bataev for (GoodIter I = begin; I >= end; I = -I) 5335bbceadfSAlexey Bataev ++I; 5345bbceadfSAlexey Bataev #pragma omp parallel 5355bbceadfSAlexey Bataev // expected-note@+3 {{loop step is expected to be negative due to this condition}} 5365bbceadfSAlexey Bataev // expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}} 5375bbceadfSAlexey Bataev #pragma omp parallel master taskloop 5385bbceadfSAlexey Bataev for (GoodIter I = begin; I >= end; I = 2 + I) 5395bbceadfSAlexey Bataev ++I; 5405bbceadfSAlexey Bataev #pragma omp parallel 5415bbceadfSAlexey Bataev // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'I'}} 5425bbceadfSAlexey Bataev #pragma omp parallel master taskloop 5435bbceadfSAlexey Bataev for (GoodIter I = begin; I >= end; I = 2 - I) 5445bbceadfSAlexey Bataev ++I; 5455bbceadfSAlexey Bataev // In the following example, we cannot update the loop variable using '+=' 5465bbceadfSAlexey Bataev // expected-error@+3 {{invalid operands to binary expression ('Iter0' and 'int')}} 5475bbceadfSAlexey Bataev #pragma omp parallel 5485bbceadfSAlexey Bataev #pragma omp parallel master taskloop 5495bbceadfSAlexey Bataev for (Iter0 I = begin0; I < end0; ++I) 5505bbceadfSAlexey Bataev ++I; 5515bbceadfSAlexey Bataev #pragma omp parallel 5525bbceadfSAlexey Bataev // Initializer is constructor without params. 5535bbceadfSAlexey Bataev // expected-error@+3 {{invalid operands to binary expression ('Iter0' and 'int')}} 5545bbceadfSAlexey Bataev // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 5555bbceadfSAlexey Bataev #pragma omp parallel master taskloop 5565bbceadfSAlexey Bataev for (Iter0 I; I < end0; ++I) 5575bbceadfSAlexey Bataev ++I; 5585bbceadfSAlexey Bataev Iter1 begin1, end1; 5595bbceadfSAlexey Bataev // expected-error@+4 {{invalid operands to binary expression ('Iter1' and 'Iter1')}} 5605bbceadfSAlexey Bataev // expected-error@+3 {{could not calculate number of iterations calling 'operator-' with upper and lower loop bounds}} 5615bbceadfSAlexey Bataev #pragma omp parallel 5625bbceadfSAlexey Bataev #pragma omp parallel master taskloop 5635bbceadfSAlexey Bataev for (Iter1 I = begin1; I < end1; ++I) 5645bbceadfSAlexey Bataev ++I; 5655bbceadfSAlexey Bataev #pragma omp parallel 5665bbceadfSAlexey Bataev // expected-note@+3 {{loop step is expected to be negative due to this condition}} 5675bbceadfSAlexey Bataev // expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}} 5685bbceadfSAlexey Bataev #pragma omp parallel master taskloop 5695bbceadfSAlexey Bataev for (Iter1 I = begin1; I >= end1; ++I) 5705bbceadfSAlexey Bataev ++I; 5715bbceadfSAlexey Bataev #pragma omp parallel 5725bbceadfSAlexey Bataev // expected-error@+5 {{invalid operands to binary expression ('Iter1' and 'float')}} 5735bbceadfSAlexey Bataev // expected-error@+4 {{could not calculate number of iterations calling 'operator-' with upper and lower loop bounds}} 5745bbceadfSAlexey Bataev // Initializer is constructor with all default params. 5755bbceadfSAlexey Bataev // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 5765bbceadfSAlexey Bataev #pragma omp parallel master taskloop 5775bbceadfSAlexey Bataev for (Iter1 I; I < end1; ++I) { 5785bbceadfSAlexey Bataev } 5795bbceadfSAlexey Bataev return 0; 5805bbceadfSAlexey Bataev } 5815bbceadfSAlexey Bataev 5825bbceadfSAlexey Bataev template <typename IT, int ST> 5835bbceadfSAlexey Bataev class TC { 5845bbceadfSAlexey Bataev public: 5855bbceadfSAlexey Bataev int dotest_lt(IT begin, IT end) { 5865bbceadfSAlexey Bataev #pragma omp parallel 5875bbceadfSAlexey Bataev // expected-note@+3 {{loop step is expected to be positive due to this condition}} 5885bbceadfSAlexey Bataev // expected-error@+2 {{increment expression must cause 'I' to increase on each iteration of OpenMP for loop}} 5895bbceadfSAlexey Bataev #pragma omp parallel master taskloop 5905bbceadfSAlexey Bataev for (IT I = begin; I < end; I = I + ST) { 5915bbceadfSAlexey Bataev ++I; 5925bbceadfSAlexey Bataev } 5935bbceadfSAlexey Bataev #pragma omp parallel 5945bbceadfSAlexey Bataev // expected-note@+3 {{loop step is expected to be positive due to this condition}} 5955bbceadfSAlexey Bataev // expected-error@+2 {{increment expression must cause 'I' to increase on each iteration of OpenMP for loop}} 5965bbceadfSAlexey Bataev #pragma omp parallel master taskloop 5975bbceadfSAlexey Bataev for (IT I = begin; I <= end; I += ST) { 5985bbceadfSAlexey Bataev ++I; 5995bbceadfSAlexey Bataev } 6005bbceadfSAlexey Bataev #pragma omp parallel 6015bbceadfSAlexey Bataev #pragma omp parallel master taskloop 6025bbceadfSAlexey Bataev for (IT I = begin; I < end; ++I) { 6035bbceadfSAlexey Bataev ++I; 6045bbceadfSAlexey Bataev } 6055bbceadfSAlexey Bataev } 6065bbceadfSAlexey Bataev 6075bbceadfSAlexey Bataev static IT step() { 6085bbceadfSAlexey Bataev return IT(ST); 6095bbceadfSAlexey Bataev } 6105bbceadfSAlexey Bataev }; 6115bbceadfSAlexey Bataev template <typename IT, int ST = 0> 6125bbceadfSAlexey Bataev int dotest_gt(IT begin, IT end) { 6135bbceadfSAlexey Bataev #pragma omp parallel 6145bbceadfSAlexey Bataev // expected-note@+3 2 {{loop step is expected to be negative due to this condition}} 6155bbceadfSAlexey Bataev // expected-error@+2 2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}} 6165bbceadfSAlexey Bataev #pragma omp parallel master taskloop 6175bbceadfSAlexey Bataev for (IT I = begin; I >= end; I = I + ST) { 6185bbceadfSAlexey Bataev ++I; 6195bbceadfSAlexey Bataev } 6205bbceadfSAlexey Bataev #pragma omp parallel 6215bbceadfSAlexey Bataev // expected-note@+3 2 {{loop step is expected to be negative due to this condition}} 6225bbceadfSAlexey Bataev // expected-error@+2 2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}} 6235bbceadfSAlexey Bataev #pragma omp parallel master taskloop 6245bbceadfSAlexey Bataev for (IT I = begin; I >= end; I += ST) { 6255bbceadfSAlexey Bataev ++I; 6265bbceadfSAlexey Bataev } 6275bbceadfSAlexey Bataev 6285bbceadfSAlexey Bataev #pragma omp parallel 6295bbceadfSAlexey Bataev // expected-note@+3 {{loop step is expected to be negative due to this condition}} 6305bbceadfSAlexey Bataev // expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}} 6315bbceadfSAlexey Bataev #pragma omp parallel master taskloop 6325bbceadfSAlexey Bataev for (IT I = begin; I >= end; ++I) { 6335bbceadfSAlexey Bataev ++I; 6345bbceadfSAlexey Bataev } 6355bbceadfSAlexey Bataev 6365bbceadfSAlexey Bataev #pragma omp parallel 6375bbceadfSAlexey Bataev #pragma omp parallel master taskloop 6385bbceadfSAlexey Bataev for (IT I = begin; I < end; I += TC<int, ST>::step()) { 6395bbceadfSAlexey Bataev ++I; 6405bbceadfSAlexey Bataev } 6415bbceadfSAlexey Bataev } 6425bbceadfSAlexey Bataev 6435bbceadfSAlexey Bataev void test_with_template() { 6445bbceadfSAlexey Bataev GoodIter begin, end; 6455bbceadfSAlexey Bataev TC<GoodIter, 100> t1; 6465bbceadfSAlexey Bataev TC<GoodIter, -100> t2; 6475bbceadfSAlexey Bataev t1.dotest_lt(begin, end); 6485bbceadfSAlexey Bataev t2.dotest_lt(begin, end); // expected-note {{in instantiation of member function 'TC<GoodIter, -100>::dotest_lt' requested here}} 6495bbceadfSAlexey Bataev dotest_gt(begin, end); // expected-note {{in instantiation of function template specialization 'dotest_gt<GoodIter, 0>' requested here}} 6505bbceadfSAlexey Bataev dotest_gt<unsigned, 10>(0, 100); // expected-note {{in instantiation of function template specialization 'dotest_gt<unsigned int, 10>' requested here}} 6515bbceadfSAlexey Bataev } 6525bbceadfSAlexey Bataev 6535bbceadfSAlexey Bataev void test_loop_break() { 6545bbceadfSAlexey Bataev const int N = 100; 6555bbceadfSAlexey Bataev float a[N], b[N], c[N]; 6565bbceadfSAlexey Bataev #pragma omp parallel 6575bbceadfSAlexey Bataev #pragma omp parallel master taskloop 6585bbceadfSAlexey Bataev for (int i = 0; i < 10; i++) { 6595bbceadfSAlexey Bataev c[i] = a[i] + b[i]; 6605bbceadfSAlexey Bataev for (int j = 0; j < 10; ++j) { 6615bbceadfSAlexey Bataev if (a[i] > b[j]) 6625bbceadfSAlexey Bataev break; // OK in nested loop 6635bbceadfSAlexey Bataev } 6645bbceadfSAlexey Bataev switch (i) { 6655bbceadfSAlexey Bataev case 1: 6665bbceadfSAlexey Bataev b[i]++; 6675bbceadfSAlexey Bataev break; 6685bbceadfSAlexey Bataev default: 6695bbceadfSAlexey Bataev break; 6705bbceadfSAlexey Bataev } 6715bbceadfSAlexey Bataev if (c[i] > 10) 6725bbceadfSAlexey Bataev break; // expected-error {{'break' statement cannot be used in OpenMP for loop}} 6735bbceadfSAlexey Bataev 6745bbceadfSAlexey Bataev if (c[i] > 11) 6755bbceadfSAlexey Bataev break; // expected-error {{'break' statement cannot be used in OpenMP for loop}} 6765bbceadfSAlexey Bataev } 6775bbceadfSAlexey Bataev 6785bbceadfSAlexey Bataev #pragma omp parallel 6795bbceadfSAlexey Bataev #pragma omp parallel master taskloop 6805bbceadfSAlexey Bataev for (int i = 0; i < 10; i++) { 6815bbceadfSAlexey Bataev for (int j = 0; j < 10; j++) { 6825bbceadfSAlexey Bataev c[i] = a[i] + b[i]; 6835bbceadfSAlexey Bataev if (c[i] > 10) { 6845bbceadfSAlexey Bataev if (c[i] < 20) { 6855bbceadfSAlexey Bataev break; // OK 6865bbceadfSAlexey Bataev } 6875bbceadfSAlexey Bataev } 6885bbceadfSAlexey Bataev } 6895bbceadfSAlexey Bataev } 6905bbceadfSAlexey Bataev } 6915bbceadfSAlexey Bataev 6925bbceadfSAlexey Bataev void test_loop_eh() { 6935bbceadfSAlexey Bataev const int N = 100; 6945bbceadfSAlexey Bataev float a[N], b[N], c[N]; 6955bbceadfSAlexey Bataev #pragma omp parallel 6965bbceadfSAlexey Bataev #pragma omp parallel master taskloop 6975bbceadfSAlexey Bataev for (int i = 0; i < 10; i++) { 6985bbceadfSAlexey Bataev c[i] = a[i] + b[i]; 6995bbceadfSAlexey Bataev try { 7005bbceadfSAlexey Bataev for (int j = 0; j < 10; ++j) { 7015bbceadfSAlexey Bataev if (a[i] > b[j]) 7025bbceadfSAlexey Bataev throw a[i]; 7035bbceadfSAlexey Bataev } 7045bbceadfSAlexey Bataev throw a[i]; 7055bbceadfSAlexey Bataev } catch (float f) { 7065bbceadfSAlexey Bataev if (f > 0.1) 7075bbceadfSAlexey Bataev throw a[i]; 7085bbceadfSAlexey Bataev return; // expected-error {{cannot return from OpenMP region}} 7095bbceadfSAlexey Bataev } 7105bbceadfSAlexey Bataev switch (i) { 7115bbceadfSAlexey Bataev case 1: 7125bbceadfSAlexey Bataev b[i]++; 7135bbceadfSAlexey Bataev break; 7145bbceadfSAlexey Bataev default: 7155bbceadfSAlexey Bataev break; 7165bbceadfSAlexey Bataev } 7175bbceadfSAlexey Bataev for (int j = 0; j < 10; j++) { 7185bbceadfSAlexey Bataev if (c[i] > 10) 7195bbceadfSAlexey Bataev throw c[i]; 7205bbceadfSAlexey Bataev } 7215bbceadfSAlexey Bataev } 7225bbceadfSAlexey Bataev if (c[9] > 10) 7235bbceadfSAlexey Bataev throw c[9]; // OK 7245bbceadfSAlexey Bataev 7255bbceadfSAlexey Bataev #pragma omp parallel 7265bbceadfSAlexey Bataev #pragma omp parallel master taskloop 7275bbceadfSAlexey Bataev for (int i = 0; i < 10; ++i) { 7285bbceadfSAlexey Bataev struct S { 7295bbceadfSAlexey Bataev void g() { throw 0; } 7305bbceadfSAlexey Bataev }; 7315bbceadfSAlexey Bataev } 7325bbceadfSAlexey Bataev } 7335bbceadfSAlexey Bataev 7345bbceadfSAlexey Bataev void test_loop_firstprivate_lastprivate() { 7355bbceadfSAlexey Bataev S s(4); 73677d049d0SAlexey Bataev int c; 7375bbceadfSAlexey Bataev #pragma omp parallel 7385bbceadfSAlexey Bataev #pragma omp parallel master taskloop lastprivate(s) firstprivate(s) 7395bbceadfSAlexey Bataev for (int i = 0; i < 16; ++i) 7405bbceadfSAlexey Bataev ; 74177d049d0SAlexey Bataev #pragma omp parallel master taskloop if(c) default(none) // expected-error {{variable 'c' must have explicitly specified data sharing attributes}} expected-note {{explicit data sharing attribute requested here}} 74277d049d0SAlexey Bataev for (int i = 0; i < 16; ++i) 74377d049d0SAlexey Bataev ; 74477d049d0SAlexey Bataev #pragma omp parallel master taskloop if(taskloop:c) default(none) // expected-error {{variable 'c' must have explicitly specified data sharing attributes}} expected-note {{explicit data sharing attribute requested here}} 74577d049d0SAlexey Bataev for (int i = 0; i < 16; ++i) 74677d049d0SAlexey Bataev ; 74777d049d0SAlexey Bataev #pragma omp parallel master taskloop if(parallel:c) default(none) 74877d049d0SAlexey Bataev for (int i = 0; i < 16; ++i) 74977d049d0SAlexey Bataev ; 7505bbceadfSAlexey Bataev } 7515bbceadfSAlexey Bataev 752