12bfce22aSSaiyedul Islam // RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp4 %s -Wuninitialized
2*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -fsyntax-only -fopenmp -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp5 %s -Wuninitialized
35bbceadfSAlexey Bataev
42bfce22aSSaiyedul Islam // RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp4 %s -Wuninitialized
5*ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp5 %s -Wuninitialized
65bbceadfSAlexey Bataev
75bbceadfSAlexey Bataev class S {
85bbceadfSAlexey Bataev int a;
S()95bbceadfSAlexey Bataev S() : a(0) {}
105bbceadfSAlexey Bataev
115bbceadfSAlexey Bataev public:
S(int v)125bbceadfSAlexey Bataev S(int v) : a(v) {}
S(const S & s)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
test_iteration_spaces()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
distance(Iter first,Iter last)3925bbceadfSAlexey Bataev distance(Iter first, Iter last) { return first - last; }
3935bbceadfSAlexey Bataev }
3945bbceadfSAlexey Bataev class Iter0 {
3955bbceadfSAlexey Bataev public:
Iter0()3965bbceadfSAlexey Bataev Iter0() {}
Iter0(const Iter0 &)3975bbceadfSAlexey Bataev Iter0(const Iter0 &) {}
operator ++()3985bbceadfSAlexey Bataev Iter0 operator++() { return *this; }
operator --()3995bbceadfSAlexey Bataev Iter0 operator--() { return *this; }
operator <(Iter0 a)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}}
operator -(Iter0 a,Iter0 b)4045bbceadfSAlexey Bataev int operator-(Iter0 a, Iter0 b) { return 0; }
4055bbceadfSAlexey Bataev class Iter1 {
4065bbceadfSAlexey Bataev public:
Iter1(float f=0.0f,double d=0.0)4075bbceadfSAlexey Bataev Iter1(float f = 0.0f, double d = 0.0) {}
Iter1(const Iter1 &)4085bbceadfSAlexey Bataev Iter1(const Iter1 &) {}
operator ++()4095bbceadfSAlexey Bataev Iter1 operator++() { return *this; }
operator --()4105bbceadfSAlexey Bataev Iter1 operator--() { return *this; }
operator <(Iter1 a)4115bbceadfSAlexey Bataev bool operator<(Iter1 a) { return true; }
operator >=(Iter1 a)4125bbceadfSAlexey Bataev bool operator>=(Iter1 a) { return false; }
4135bbceadfSAlexey Bataev };
4145bbceadfSAlexey Bataev class GoodIter {
4155bbceadfSAlexey Bataev public:
GoodIter()4165bbceadfSAlexey Bataev GoodIter() {}
GoodIter(const GoodIter &)4175bbceadfSAlexey Bataev GoodIter(const GoodIter &) {}
GoodIter(int fst,int snd)4185bbceadfSAlexey Bataev GoodIter(int fst, int snd) {}
operator =(const GoodIter & that)4195bbceadfSAlexey Bataev GoodIter &operator=(const GoodIter &that) { return *this; }
operator =(const Iter0 & that)4205bbceadfSAlexey Bataev GoodIter &operator=(const Iter0 &that) { return *this; }
operator +=(int x)4215bbceadfSAlexey Bataev GoodIter &operator+=(int x) { return *this; }
operator -=(int x)4225bbceadfSAlexey Bataev GoodIter &operator-=(int x) { return *this; }
GoodIter(void *)4235bbceadfSAlexey Bataev explicit GoodIter(void *) {}
operator ++()4245bbceadfSAlexey Bataev GoodIter operator++() { return *this; }
operator --()4255bbceadfSAlexey Bataev GoodIter operator--() { return *this; }
operator !()4265bbceadfSAlexey Bataev bool operator!() { return true; }
operator <(GoodIter a)4275bbceadfSAlexey Bataev bool operator<(GoodIter a) { return true; }
operator <=(GoodIter a)4285bbceadfSAlexey Bataev bool operator<=(GoodIter a) { return true; }
operator >=(GoodIter a)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}}
operator -(GoodIter a,GoodIter b)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}}
operator -(GoodIter a)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}}
operator -(GoodIter a,int v)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}}
operator +(GoodIter a,int v)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}}
operator -(int v,GoodIter a)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}}
operator +(int v,GoodIter a)4475bbceadfSAlexey Bataev GoodIter operator+(int v, GoodIter a) { return GoodIter(); }
4485bbceadfSAlexey Bataev
test_with_random_access_iterator()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:
dotest_lt(IT begin,IT end)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
step()6075bbceadfSAlexey Bataev static IT step() {
6085bbceadfSAlexey Bataev return IT(ST);
6095bbceadfSAlexey Bataev }
6105bbceadfSAlexey Bataev };
6115bbceadfSAlexey Bataev template <typename IT, int ST = 0>
dotest_gt(IT begin,IT end)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
test_with_template()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
test_loop_break()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
test_loop_eh()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
test_loop_firstprivate_lastprivate()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