xref: /llvm-project/clang/test/OpenMP/parallel_master_taskloop_loop_messages.cpp (revision ff260ad0e014516fbebb4b9f7bcd5e085ac37661)
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