xref: /llvm-project/clang/test/OpenMP/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
360e51c48SAlexey 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
660e51c48SAlexey Bataev 
760e51c48SAlexey Bataev class S {
860e51c48SAlexey Bataev   int a;
S()960e51c48SAlexey Bataev   S() : a(0) {}
1060e51c48SAlexey Bataev 
1160e51c48SAlexey Bataev public:
S(int v)1260e51c48SAlexey Bataev   S(int v) : a(v) {}
S(const S & s)1360e51c48SAlexey Bataev   S(const S &s) : a(s.a) {}
1460e51c48SAlexey Bataev };
1560e51c48SAlexey Bataev 
1660e51c48SAlexey Bataev static int sii;
1760e51c48SAlexey Bataev // expected-note@+1 {{defined as threadprivate or thread local}}
1860e51c48SAlexey Bataev #pragma omp threadprivate(sii)
1960e51c48SAlexey Bataev static int globalii;
2060e51c48SAlexey Bataev 
2160e51c48SAlexey Bataev // Currently, we cannot use "0" for global register variables.
2260e51c48SAlexey Bataev // register int reg0 __asm__("0");
2360e51c48SAlexey Bataev int reg0;
2460e51c48SAlexey Bataev 
test_iteration_spaces()2560e51c48SAlexey Bataev int test_iteration_spaces() {
2660e51c48SAlexey Bataev   const int N = 100;
2760e51c48SAlexey Bataev   float a[N], b[N], c[N];
2860e51c48SAlexey Bataev   int ii, jj, kk;
2960e51c48SAlexey Bataev   float fii;
3060e51c48SAlexey Bataev   double dii;
3160e51c48SAlexey Bataev   register int reg; // expected-warning {{'register' storage class specifier is deprecated}}
3260e51c48SAlexey Bataev #pragma omp parallel
3360e51c48SAlexey Bataev #pragma omp master taskloop
3460e51c48SAlexey Bataev   for (int i = 0; i < 10; i += 1) {
3560e51c48SAlexey Bataev     c[i] = a[i] + b[i];
3660e51c48SAlexey Bataev   }
3760e51c48SAlexey Bataev #pragma omp parallel
3860e51c48SAlexey Bataev #pragma omp master taskloop
3960e51c48SAlexey Bataev   for (char i = 0; i < 10; i++) {
4060e51c48SAlexey Bataev     c[i] = a[i] + b[i];
4160e51c48SAlexey Bataev   }
4260e51c48SAlexey Bataev #pragma omp parallel
4360e51c48SAlexey Bataev #pragma omp master taskloop
4460e51c48SAlexey Bataev   for (char i = 0; i < 10; i += '\1') {
4560e51c48SAlexey Bataev     c[i] = a[i] + b[i];
4660e51c48SAlexey Bataev   }
4760e51c48SAlexey Bataev #pragma omp parallel
4860e51c48SAlexey Bataev #pragma omp master taskloop
4960e51c48SAlexey Bataev   for (long long i = 0; i < 10; i++) {
5060e51c48SAlexey Bataev     c[i] = a[i] + b[i];
5160e51c48SAlexey Bataev   }
5260e51c48SAlexey Bataev #pragma omp parallel
5360e51c48SAlexey Bataev // expected-error@+2 {{expression must have integral or unscoped enumeration type, not 'double'}}
5460e51c48SAlexey Bataev #pragma omp master taskloop
5560e51c48SAlexey Bataev   for (long long i = 0; i < 10; i += 1.5) {
5660e51c48SAlexey Bataev     c[i] = a[i] + b[i];
5760e51c48SAlexey Bataev   }
5860e51c48SAlexey Bataev #pragma omp parallel
5960e51c48SAlexey Bataev #pragma omp master taskloop
6060e51c48SAlexey Bataev   for (long long i = 0; i < 'z'; i += 1u) {
6160e51c48SAlexey Bataev     c[i] = a[i] + b[i];
6260e51c48SAlexey Bataev   }
6360e51c48SAlexey Bataev #pragma omp parallel
6460e51c48SAlexey Bataev // expected-error@+2 {{variable must be of integer or random access iterator type}}
6560e51c48SAlexey Bataev #pragma omp master taskloop
6660e51c48SAlexey Bataev   for (float fi = 0; fi < 10.0; fi++) {
6760e51c48SAlexey Bataev     c[(int)fi] = a[(int)fi] + b[(int)fi];
6860e51c48SAlexey Bataev   }
6960e51c48SAlexey Bataev #pragma omp parallel
7060e51c48SAlexey Bataev // expected-error@+2 {{variable must be of integer or random access iterator type}}
7160e51c48SAlexey Bataev #pragma omp master taskloop
7260e51c48SAlexey Bataev   for (double fi = 0; fi < 10.0; fi++) {
7360e51c48SAlexey Bataev     c[(int)fi] = a[(int)fi] + b[(int)fi];
7460e51c48SAlexey Bataev   }
7560e51c48SAlexey Bataev #pragma omp parallel
7660e51c48SAlexey Bataev // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
7760e51c48SAlexey Bataev #pragma omp master taskloop
7860e51c48SAlexey Bataev   for (int &ref = ii; ref < 10; ref++) {
7960e51c48SAlexey Bataev   }
8060e51c48SAlexey Bataev #pragma omp parallel
8160e51c48SAlexey Bataev // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
8260e51c48SAlexey Bataev #pragma omp master taskloop
8360e51c48SAlexey Bataev   for (int i; i < 10; i++)
8460e51c48SAlexey Bataev     c[i] = a[i];
8560e51c48SAlexey Bataev 
8660e51c48SAlexey Bataev #pragma omp parallel
8760e51c48SAlexey Bataev // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
8860e51c48SAlexey Bataev #pragma omp master taskloop
8960e51c48SAlexey Bataev   for (int i = 0, j = 0; i < 10; ++i)
9060e51c48SAlexey Bataev     c[i] = a[i];
9160e51c48SAlexey Bataev 
9260e51c48SAlexey Bataev #pragma omp parallel
9360e51c48SAlexey Bataev // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
9460e51c48SAlexey Bataev #pragma omp master taskloop
9560e51c48SAlexey Bataev   for (; ii < 10; ++ii)
9660e51c48SAlexey Bataev     c[ii] = a[ii];
9760e51c48SAlexey Bataev 
9860e51c48SAlexey Bataev #pragma omp parallel
9960e51c48SAlexey Bataev // expected-warning@+3 {{expression result unused}}
10060e51c48SAlexey Bataev // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
10160e51c48SAlexey Bataev #pragma omp master taskloop
10260e51c48SAlexey Bataev   for (ii + 1; ii < 10; ++ii)
10360e51c48SAlexey Bataev     c[ii] = a[ii];
10460e51c48SAlexey Bataev 
10560e51c48SAlexey Bataev #pragma omp parallel
10660e51c48SAlexey Bataev // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
10760e51c48SAlexey Bataev #pragma omp master taskloop
10860e51c48SAlexey Bataev   for (c[ii] = 0; ii < 10; ++ii)
10960e51c48SAlexey Bataev     c[ii] = a[ii];
11060e51c48SAlexey Bataev 
11160e51c48SAlexey Bataev #pragma omp parallel
11260e51c48SAlexey Bataev // Ok to skip parenthesises.
11360e51c48SAlexey Bataev #pragma omp master taskloop
11460e51c48SAlexey Bataev   for (((ii)) = 0; ii < 10; ++ii)
11560e51c48SAlexey Bataev     c[ii] = a[ii];
11660e51c48SAlexey Bataev 
11760e51c48SAlexey Bataev #pragma omp parallel
11860e51c48SAlexey 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'}}
11960e51c48SAlexey Bataev #pragma omp master taskloop
12060e51c48SAlexey Bataev   for (int i = 0; i; i++)
12160e51c48SAlexey Bataev     c[i] = a[i];
12260e51c48SAlexey Bataev 
12360e51c48SAlexey Bataev #pragma omp parallel
12460e51c48SAlexey 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'}}
12560e51c48SAlexey Bataev // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'i'}}
12660e51c48SAlexey Bataev #pragma omp master taskloop
12760e51c48SAlexey Bataev   for (int i = 0; jj < kk; ii++)
12860e51c48SAlexey Bataev     c[i] = a[i];
12960e51c48SAlexey Bataev 
13060e51c48SAlexey Bataev #pragma omp parallel
13160e51c48SAlexey 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'}}
13260e51c48SAlexey Bataev #pragma omp master taskloop
13360e51c48SAlexey Bataev   for (int i = 0; !!i; i++)
13460e51c48SAlexey Bataev     c[i] = a[i];
13560e51c48SAlexey Bataev 
13660e51c48SAlexey Bataev // Ok
13760e51c48SAlexey Bataev #pragma omp parallel
13860e51c48SAlexey Bataev // omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
13960e51c48SAlexey Bataev #pragma omp master taskloop
14060e51c48SAlexey Bataev   for (int i = 0; i != 1; i++)
14160e51c48SAlexey Bataev     c[i] = a[i];
14260e51c48SAlexey Bataev 
14360e51c48SAlexey Bataev #pragma omp parallel
14460e51c48SAlexey 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'}}
14560e51c48SAlexey Bataev #pragma omp master taskloop
14660e51c48SAlexey Bataev   for (int i = 0;; i++)
14760e51c48SAlexey Bataev     c[i] = a[i];
14860e51c48SAlexey Bataev 
14960e51c48SAlexey Bataev #pragma omp parallel
15060e51c48SAlexey Bataev // Ok.
15160e51c48SAlexey Bataev #pragma omp master taskloop
15260e51c48SAlexey Bataev   for (int i = 11; i > 10; i--)
15360e51c48SAlexey Bataev     c[i] = a[i];
15460e51c48SAlexey Bataev 
15560e51c48SAlexey Bataev #pragma omp parallel
15660e51c48SAlexey Bataev // Ok.
15760e51c48SAlexey Bataev #pragma omp master taskloop
15860e51c48SAlexey Bataev   for (int i = 0; i < 10; ++i)
15960e51c48SAlexey Bataev     c[i] = a[i];
16060e51c48SAlexey Bataev 
16160e51c48SAlexey Bataev #pragma omp parallel
16260e51c48SAlexey Bataev // Ok.
16360e51c48SAlexey Bataev #pragma omp master taskloop
16460e51c48SAlexey Bataev   for (ii = 0; ii < 10; ++ii)
16560e51c48SAlexey Bataev     c[ii] = a[ii];
16660e51c48SAlexey Bataev 
16760e51c48SAlexey Bataev #pragma omp parallel
16860e51c48SAlexey Bataev // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
16960e51c48SAlexey Bataev #pragma omp master taskloop
17060e51c48SAlexey Bataev   for (ii = 0; ii < 10; ++jj)
17160e51c48SAlexey Bataev     c[ii] = a[jj];
17260e51c48SAlexey Bataev 
17360e51c48SAlexey Bataev #pragma omp parallel
17460e51c48SAlexey Bataev // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
17560e51c48SAlexey Bataev #pragma omp master taskloop
17660e51c48SAlexey Bataev   for (ii = 0; ii < 10; ++++ii)
17760e51c48SAlexey Bataev     c[ii] = a[ii];
17860e51c48SAlexey Bataev 
17960e51c48SAlexey Bataev #pragma omp parallel
18060e51c48SAlexey Bataev // Ok but undefined behavior (in general, cannot check that incr
18160e51c48SAlexey Bataev // is really loop-invariant).
18260e51c48SAlexey Bataev #pragma omp master taskloop
18360e51c48SAlexey Bataev   for (ii = 0; ii < 10; ii = ii + ii)
18460e51c48SAlexey Bataev     c[ii] = a[ii];
18560e51c48SAlexey Bataev 
18660e51c48SAlexey Bataev #pragma omp parallel
18760e51c48SAlexey Bataev // expected-error@+2 {{expression must have integral or unscoped enumeration type, not 'float'}}
18860e51c48SAlexey Bataev #pragma omp master taskloop
18960e51c48SAlexey Bataev   for (ii = 0; ii < 10; ii = ii + 1.0f)
19060e51c48SAlexey Bataev     c[ii] = a[ii];
19160e51c48SAlexey Bataev 
19260e51c48SAlexey Bataev #pragma omp parallel
19360e51c48SAlexey Bataev // Ok - step was converted to integer type.
19460e51c48SAlexey Bataev #pragma omp master taskloop
19560e51c48SAlexey Bataev   for (ii = 0; ii < 10; ii = ii + (int)1.1f)
19660e51c48SAlexey Bataev     c[ii] = a[ii];
19760e51c48SAlexey Bataev 
19860e51c48SAlexey Bataev #pragma omp parallel
19960e51c48SAlexey Bataev // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
20060e51c48SAlexey Bataev #pragma omp master taskloop
20160e51c48SAlexey Bataev   for (ii = 0; ii < 10; jj = ii + 2)
20260e51c48SAlexey Bataev     c[ii] = a[ii];
20360e51c48SAlexey Bataev 
20460e51c48SAlexey Bataev #pragma omp parallel
20560e51c48SAlexey Bataev // expected-warning@+3 {{relational comparison result unused}}
20660e51c48SAlexey Bataev // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
20760e51c48SAlexey Bataev #pragma omp master taskloop
20860e51c48SAlexey Bataev   for (ii = 0; ii<10; jj> kk + 2)
20960e51c48SAlexey Bataev     c[ii] = a[ii];
21060e51c48SAlexey Bataev 
21160e51c48SAlexey Bataev #pragma omp parallel
21260e51c48SAlexey Bataev // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
21360e51c48SAlexey Bataev #pragma omp master taskloop
21460e51c48SAlexey Bataev   for (ii = 0; ii < 10;)
21560e51c48SAlexey Bataev     c[ii] = a[ii];
21660e51c48SAlexey Bataev 
21760e51c48SAlexey Bataev #pragma omp parallel
21860e51c48SAlexey Bataev // expected-warning@+3 {{expression result unused}}
21960e51c48SAlexey Bataev // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
22060e51c48SAlexey Bataev #pragma omp master taskloop
22160e51c48SAlexey Bataev   for (ii = 0; ii < 10; !ii)
22260e51c48SAlexey Bataev     c[ii] = a[ii];
22360e51c48SAlexey Bataev 
22460e51c48SAlexey Bataev #pragma omp parallel
22560e51c48SAlexey Bataev // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
22660e51c48SAlexey Bataev #pragma omp master taskloop
22760e51c48SAlexey Bataev   for (ii = 0; ii < 10; ii ? ++ii : ++jj)
22860e51c48SAlexey Bataev     c[ii] = a[ii];
22960e51c48SAlexey Bataev 
23060e51c48SAlexey Bataev #pragma omp parallel
23160e51c48SAlexey Bataev // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
23260e51c48SAlexey Bataev #pragma omp master taskloop
23360e51c48SAlexey Bataev   for (ii = 0; ii < 10; ii = ii < 10)
23460e51c48SAlexey Bataev     c[ii] = a[ii];
23560e51c48SAlexey Bataev 
23660e51c48SAlexey Bataev #pragma omp parallel
23760e51c48SAlexey Bataev // expected-note@+3 {{loop step is expected to be positive due to this condition}}
23860e51c48SAlexey Bataev // expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
23960e51c48SAlexey Bataev #pragma omp master taskloop
24060e51c48SAlexey Bataev   for (ii = 0; ii < 10; ii = ii + 0)
24160e51c48SAlexey Bataev     c[ii] = a[ii];
24260e51c48SAlexey Bataev 
24360e51c48SAlexey Bataev #pragma omp parallel
24460e51c48SAlexey Bataev // expected-note@+3 {{loop step is expected to be positive due to this condition}}
24560e51c48SAlexey Bataev // expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
24660e51c48SAlexey Bataev #pragma omp master taskloop
24760e51c48SAlexey Bataev   for (ii = 0; ii < 10; ii = ii + (int)(0.8 - 0.45))
24860e51c48SAlexey Bataev     c[ii] = a[ii];
24960e51c48SAlexey Bataev 
25060e51c48SAlexey Bataev #pragma omp parallel
25160e51c48SAlexey Bataev // expected-note@+3 {{loop step is expected to be positive due to this condition}}
25260e51c48SAlexey Bataev // expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
25360e51c48SAlexey Bataev #pragma omp master taskloop
25460e51c48SAlexey Bataev   for (ii = 0; (ii) < 10; ii -= 25)
25560e51c48SAlexey Bataev     c[ii] = a[ii];
25660e51c48SAlexey Bataev 
25760e51c48SAlexey Bataev #pragma omp parallel
25860e51c48SAlexey Bataev // expected-note@+3 {{loop step is expected to be positive due to this condition}}
25960e51c48SAlexey Bataev // expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
26060e51c48SAlexey Bataev #pragma omp master taskloop
26160e51c48SAlexey Bataev   for (ii = 0; (ii < 10); ii -= 0)
26260e51c48SAlexey Bataev     c[ii] = a[ii];
26360e51c48SAlexey Bataev 
26460e51c48SAlexey Bataev #pragma omp parallel
26560e51c48SAlexey Bataev // expected-note@+3 {{loop step is expected to be negative due to this condition}}
26660e51c48SAlexey Bataev // expected-error@+2 {{increment expression must cause 'ii' to decrease on each iteration of OpenMP for loop}}
26760e51c48SAlexey Bataev #pragma omp master taskloop
26860e51c48SAlexey Bataev   for (ii = 0; ii > 10; (ii += 0))
26960e51c48SAlexey Bataev     c[ii] = a[ii];
27060e51c48SAlexey Bataev 
27160e51c48SAlexey Bataev #pragma omp parallel
27260e51c48SAlexey Bataev // expected-note@+3 {{loop step is expected to be positive due to this condition}}
27360e51c48SAlexey Bataev // expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
27460e51c48SAlexey Bataev #pragma omp master taskloop
27560e51c48SAlexey Bataev   for (ii = 0; ii < 10; (ii) = (1 - 1) + (ii))
27660e51c48SAlexey Bataev     c[ii] = a[ii];
27760e51c48SAlexey Bataev 
27860e51c48SAlexey Bataev #pragma omp parallel
27960e51c48SAlexey Bataev // expected-note@+3 {{loop step is expected to be negative due to this condition}}
28060e51c48SAlexey Bataev // expected-error@+2 {{increment expression must cause 'ii' to decrease on each iteration of OpenMP for loop}}
28160e51c48SAlexey Bataev #pragma omp master taskloop
28260e51c48SAlexey Bataev   for ((ii = 0); ii > 10; (ii -= 0))
28360e51c48SAlexey Bataev     c[ii] = a[ii];
28460e51c48SAlexey Bataev 
28560e51c48SAlexey Bataev #pragma omp parallel
28660e51c48SAlexey Bataev // expected-note@+3 {{loop step is expected to be positive due to this condition}}
28760e51c48SAlexey Bataev // expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
28860e51c48SAlexey Bataev #pragma omp master taskloop
28960e51c48SAlexey Bataev   for (ii = 0; (ii < 10); (ii -= 0))
29060e51c48SAlexey Bataev     c[ii] = a[ii];
29160e51c48SAlexey Bataev 
29260e51c48SAlexey Bataev #pragma omp parallel
29360e51c48SAlexey Bataev // expected-note@+2  {{defined as firstprivate}}
29460e51c48SAlexey Bataev // expected-error@+2 {{loop iteration variable in the associated loop of 'omp master taskloop' directive may not be firstprivate, predetermined as private}}
29560e51c48SAlexey Bataev #pragma omp master taskloop firstprivate(ii)
29660e51c48SAlexey Bataev   for (ii = 0; ii < 10; ii++)
29760e51c48SAlexey Bataev     c[ii] = a[ii];
29860e51c48SAlexey Bataev 
29960e51c48SAlexey Bataev #pragma omp parallel
30060e51c48SAlexey Bataev // expected-error@+1 {{unexpected OpenMP clause 'linear' in directive '#pragma omp master taskloop'}}
30160e51c48SAlexey Bataev #pragma omp master taskloop linear(ii)
30260e51c48SAlexey Bataev   for (ii = 0; ii < 10; ii++)
30360e51c48SAlexey Bataev     c[ii] = a[ii];
30460e51c48SAlexey Bataev 
30560e51c48SAlexey Bataev #pragma omp parallel
30660e51c48SAlexey Bataev #pragma omp master taskloop private(ii)
30760e51c48SAlexey Bataev   for (ii = 0; ii < 10; ii++)
30860e51c48SAlexey Bataev     c[ii] = a[ii];
30960e51c48SAlexey Bataev 
31060e51c48SAlexey Bataev #pragma omp parallel
31160e51c48SAlexey Bataev #pragma omp master taskloop lastprivate(ii)
31260e51c48SAlexey Bataev   for (ii = 0; ii < 10; ii++)
31360e51c48SAlexey Bataev     c[ii] = a[ii];
31460e51c48SAlexey Bataev 
31560e51c48SAlexey Bataev #pragma omp parallel
31660e51c48SAlexey Bataev   {
31760e51c48SAlexey Bataev // expected-error@+2 {{loop iteration variable in the associated loop of 'omp master taskloop' directive may not be threadprivate or thread local, predetermined as private}}
31860e51c48SAlexey Bataev #pragma omp master taskloop
31960e51c48SAlexey Bataev     for (sii = 0; sii < 10; sii += 1)
32060e51c48SAlexey Bataev       c[sii] = a[sii];
32160e51c48SAlexey Bataev   }
32260e51c48SAlexey Bataev 
32360e51c48SAlexey Bataev #pragma omp parallel
32460e51c48SAlexey Bataev   {
32560e51c48SAlexey Bataev #pragma omp master taskloop
32660e51c48SAlexey Bataev     for (reg0 = 0; reg0 < 10; reg0 += 1)
32760e51c48SAlexey Bataev       c[reg0] = a[reg0];
32860e51c48SAlexey Bataev   }
32960e51c48SAlexey Bataev 
33060e51c48SAlexey Bataev #pragma omp parallel
33160e51c48SAlexey Bataev   {
33260e51c48SAlexey Bataev #pragma omp master taskloop
33360e51c48SAlexey Bataev     for (reg = 0; reg < 10; reg += 1)
33460e51c48SAlexey Bataev       c[reg] = a[reg];
33560e51c48SAlexey Bataev   }
33660e51c48SAlexey Bataev 
33760e51c48SAlexey Bataev #pragma omp parallel
33860e51c48SAlexey Bataev   {
33960e51c48SAlexey Bataev #pragma omp master taskloop
34060e51c48SAlexey Bataev     for (globalii = 0; globalii < 10; globalii += 1)
34160e51c48SAlexey Bataev       c[globalii] = a[globalii];
34260e51c48SAlexey Bataev   }
34360e51c48SAlexey Bataev 
34460e51c48SAlexey Bataev #pragma omp parallel
34560e51c48SAlexey Bataev   {
34660e51c48SAlexey Bataev #pragma omp master taskloop collapse(2)
34760e51c48SAlexey Bataev     for (ii = 0; ii < 10; ii += 1)
34860e51c48SAlexey Bataev     for (globalii = 0; globalii < 10; globalii += 1)
34960e51c48SAlexey Bataev       c[globalii] += a[globalii] + ii;
35060e51c48SAlexey Bataev   }
35160e51c48SAlexey Bataev 
35260e51c48SAlexey Bataev #pragma omp parallel
35360e51c48SAlexey Bataev // omp4-error@+2 {{statement after '#pragma omp master taskloop' must be a for loop}}
35460e51c48SAlexey Bataev #pragma omp master taskloop
35560e51c48SAlexey Bataev   for (auto &item : a) {
35660e51c48SAlexey Bataev     item = item + 1;
35760e51c48SAlexey Bataev   }
35860e51c48SAlexey Bataev 
35960e51c48SAlexey Bataev #pragma omp parallel
36060e51c48SAlexey Bataev // expected-note@+3 {{loop step is expected to be positive due to this condition}}
36160e51c48SAlexey Bataev // expected-error@+2 {{increment expression must cause 'i' to increase on each iteration of OpenMP for loop}}
36260e51c48SAlexey Bataev #pragma omp master taskloop
36360e51c48SAlexey Bataev   for (unsigned i = 9; i < 10; i--) {
36460e51c48SAlexey Bataev     c[i] = a[i] + b[i];
36560e51c48SAlexey Bataev   }
36660e51c48SAlexey Bataev 
36760e51c48SAlexey Bataev   int(*lb)[4] = nullptr;
36860e51c48SAlexey Bataev #pragma omp parallel
36960e51c48SAlexey Bataev #pragma omp master taskloop
37060e51c48SAlexey Bataev   for (int(*p)[4] = lb; p < lb + 8; ++p) {
37160e51c48SAlexey Bataev   }
37260e51c48SAlexey Bataev 
37360e51c48SAlexey Bataev #pragma omp parallel
37460e51c48SAlexey Bataev // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
37560e51c48SAlexey Bataev #pragma omp master taskloop
37660e51c48SAlexey Bataev   for (int a{0}; a < 10; ++a) {
37760e51c48SAlexey Bataev   }
37860e51c48SAlexey Bataev 
37960e51c48SAlexey Bataev   return 0;
38060e51c48SAlexey Bataev }
38160e51c48SAlexey Bataev 
38260e51c48SAlexey Bataev // Iterators allowed in openmp for-loops.
38360e51c48SAlexey Bataev namespace std {
38460e51c48SAlexey Bataev struct random_access_iterator_tag {};
38560e51c48SAlexey Bataev template <class Iter>
38660e51c48SAlexey Bataev struct iterator_traits {
38760e51c48SAlexey Bataev   typedef typename Iter::difference_type difference_type;
38860e51c48SAlexey Bataev   typedef typename Iter::iterator_category iterator_category;
38960e51c48SAlexey Bataev };
39060e51c48SAlexey Bataev template <class Iter>
39160e51c48SAlexey Bataev typename iterator_traits<Iter>::difference_type
distance(Iter first,Iter last)39260e51c48SAlexey Bataev distance(Iter first, Iter last) { return first - last; }
39360e51c48SAlexey Bataev }
39460e51c48SAlexey Bataev class Iter0 {
39560e51c48SAlexey Bataev public:
Iter0()39660e51c48SAlexey Bataev   Iter0() {}
Iter0(const Iter0 &)39760e51c48SAlexey Bataev   Iter0(const Iter0 &) {}
operator ++()39860e51c48SAlexey Bataev   Iter0 operator++() { return *this; }
operator --()39960e51c48SAlexey Bataev   Iter0 operator--() { return *this; }
operator <(Iter0 a)40060e51c48SAlexey Bataev   bool operator<(Iter0 a) { return true; }
40160e51c48SAlexey Bataev };
40260e51c48SAlexey Bataev // expected-note@+2 {{candidate function not viable: no known conversion from 'GoodIter' to 'Iter0' for 1st argument}}
40360e51c48SAlexey Bataev // expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'Iter0' for 1st argument}}
operator -(Iter0 a,Iter0 b)40460e51c48SAlexey Bataev int operator-(Iter0 a, Iter0 b) { return 0; }
40560e51c48SAlexey Bataev class Iter1 {
40660e51c48SAlexey Bataev public:
Iter1(float f=0.0f,double d=0.0)40760e51c48SAlexey Bataev   Iter1(float f = 0.0f, double d = 0.0) {}
Iter1(const Iter1 &)40860e51c48SAlexey Bataev   Iter1(const Iter1 &) {}
operator ++()40960e51c48SAlexey Bataev   Iter1 operator++() { return *this; }
operator --()41060e51c48SAlexey Bataev   Iter1 operator--() { return *this; }
operator <(Iter1 a)41160e51c48SAlexey Bataev   bool operator<(Iter1 a) { return true; }
operator >=(Iter1 a)41260e51c48SAlexey Bataev   bool operator>=(Iter1 a) { return false; }
41360e51c48SAlexey Bataev };
41460e51c48SAlexey Bataev class GoodIter {
41560e51c48SAlexey Bataev public:
GoodIter()41660e51c48SAlexey Bataev   GoodIter() {}
GoodIter(const GoodIter &)41760e51c48SAlexey Bataev   GoodIter(const GoodIter &) {}
GoodIter(int fst,int snd)41860e51c48SAlexey Bataev   GoodIter(int fst, int snd) {}
operator =(const GoodIter & that)41960e51c48SAlexey Bataev   GoodIter &operator=(const GoodIter &that) { return *this; }
operator =(const Iter0 & that)42060e51c48SAlexey Bataev   GoodIter &operator=(const Iter0 &that) { return *this; }
operator +=(int x)42160e51c48SAlexey Bataev   GoodIter &operator+=(int x) { return *this; }
operator -=(int x)42260e51c48SAlexey Bataev   GoodIter &operator-=(int x) { return *this; }
GoodIter(void *)42360e51c48SAlexey Bataev   explicit GoodIter(void *) {}
operator ++()42460e51c48SAlexey Bataev   GoodIter operator++() { return *this; }
operator --()42560e51c48SAlexey Bataev   GoodIter operator--() { return *this; }
operator !()42660e51c48SAlexey Bataev   bool operator!() { return true; }
operator <(GoodIter a)42760e51c48SAlexey Bataev   bool operator<(GoodIter a) { return true; }
operator <=(GoodIter a)42860e51c48SAlexey Bataev   bool operator<=(GoodIter a) { return true; }
operator >=(GoodIter a)42960e51c48SAlexey Bataev   bool operator>=(GoodIter a) { return false; }
43060e51c48SAlexey Bataev   typedef int difference_type;
43160e51c48SAlexey Bataev   typedef std::random_access_iterator_tag iterator_category;
43260e51c48SAlexey Bataev };
43360e51c48SAlexey Bataev // expected-note@+2 {{candidate function not viable: no known conversion from 'const Iter0' to 'GoodIter' for 2nd argument}}
43460e51c48SAlexey Bataev // expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'GoodIter' for 1st argument}}
operator -(GoodIter a,GoodIter b)43560e51c48SAlexey Bataev int operator-(GoodIter a, GoodIter b) { return 0; }
43660e51c48SAlexey Bataev // expected-note@+1 3 {{candidate function not viable: requires single argument 'a', but 2 arguments were provided}}
operator -(GoodIter a)43760e51c48SAlexey Bataev GoodIter operator-(GoodIter a) { return a; }
43860e51c48SAlexey Bataev // expected-note@+2 {{candidate function not viable: no known conversion from 'const Iter0' to 'int' for 2nd argument}}
43960e51c48SAlexey Bataev // expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'GoodIter' for 1st argument}}
operator -(GoodIter a,int v)44060e51c48SAlexey Bataev GoodIter operator-(GoodIter a, int v) { return GoodIter(); }
44160e51c48SAlexey Bataev // expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter0' to 'GoodIter' for 1st argument}}
operator +(GoodIter a,int v)44260e51c48SAlexey Bataev GoodIter operator+(GoodIter a, int v) { return GoodIter(); }
44360e51c48SAlexey Bataev // expected-note@+2 {{candidate function not viable: no known conversion from 'GoodIter' to 'int' for 1st argument}}
44460e51c48SAlexey Bataev // expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'int' for 1st argument}}
operator -(int v,GoodIter a)44560e51c48SAlexey Bataev GoodIter operator-(int v, GoodIter a) { return GoodIter(); }
44660e51c48SAlexey Bataev // expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter0' to 'int' for 1st argument}}
operator +(int v,GoodIter a)44760e51c48SAlexey Bataev GoodIter operator+(int v, GoodIter a) { return GoodIter(); }
44860e51c48SAlexey Bataev 
test_with_random_access_iterator()44960e51c48SAlexey Bataev int test_with_random_access_iterator() {
45060e51c48SAlexey Bataev   GoodIter begin, end;
45160e51c48SAlexey Bataev   Iter0 begin0, end0;
45260e51c48SAlexey Bataev #pragma omp parallel
45360e51c48SAlexey Bataev #pragma omp master taskloop
45460e51c48SAlexey Bataev   for (GoodIter I = begin; I < end; ++I)
45560e51c48SAlexey Bataev     ++I;
45660e51c48SAlexey Bataev #pragma omp parallel
45760e51c48SAlexey Bataev // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
45860e51c48SAlexey Bataev #pragma omp master taskloop
45960e51c48SAlexey Bataev   for (GoodIter &I = begin; I < end; ++I)
46060e51c48SAlexey Bataev     ++I;
46160e51c48SAlexey Bataev #pragma omp parallel
46260e51c48SAlexey Bataev #pragma omp master taskloop
46360e51c48SAlexey Bataev   for (GoodIter I = begin; I >= end; --I)
46460e51c48SAlexey Bataev     ++I;
46560e51c48SAlexey Bataev #pragma omp parallel
46660e51c48SAlexey Bataev // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
46760e51c48SAlexey Bataev #pragma omp master taskloop
46860e51c48SAlexey Bataev   for (GoodIter I(begin); I < end; ++I)
46960e51c48SAlexey Bataev     ++I;
47060e51c48SAlexey Bataev #pragma omp parallel
47160e51c48SAlexey Bataev // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
47260e51c48SAlexey Bataev #pragma omp master taskloop
47360e51c48SAlexey Bataev   for (GoodIter I(nullptr); I < end; ++I)
47460e51c48SAlexey Bataev     ++I;
47560e51c48SAlexey Bataev #pragma omp parallel
47660e51c48SAlexey Bataev // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
47760e51c48SAlexey Bataev #pragma omp master taskloop
47860e51c48SAlexey Bataev   for (GoodIter I(0); I < end; ++I)
47960e51c48SAlexey Bataev     ++I;
48060e51c48SAlexey Bataev #pragma omp parallel
48160e51c48SAlexey Bataev // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
48260e51c48SAlexey Bataev #pragma omp master taskloop
48360e51c48SAlexey Bataev   for (GoodIter I(1, 2); I < end; ++I)
48460e51c48SAlexey Bataev     ++I;
48560e51c48SAlexey Bataev #pragma omp parallel
48660e51c48SAlexey Bataev #pragma omp master taskloop
48760e51c48SAlexey Bataev   for (begin = GoodIter(0); begin < end; ++begin)
48860e51c48SAlexey Bataev     ++begin;
48960e51c48SAlexey Bataev // expected-error@+4 {{invalid operands to binary expression ('GoodIter' and 'const Iter0')}}
49060e51c48SAlexey Bataev // expected-error@+3 {{could not calculate number of iterations calling 'operator-' with upper and lower loop bounds}}
49160e51c48SAlexey Bataev #pragma omp parallel
49260e51c48SAlexey Bataev #pragma omp master taskloop
49360e51c48SAlexey Bataev   for (begin = begin0; begin < end; ++begin)
49460e51c48SAlexey Bataev     ++begin;
49560e51c48SAlexey Bataev #pragma omp parallel
49660e51c48SAlexey Bataev // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
49760e51c48SAlexey Bataev #pragma omp master taskloop
49860e51c48SAlexey Bataev   for (++begin; begin < end; ++begin)
49960e51c48SAlexey Bataev     ++begin;
50060e51c48SAlexey Bataev #pragma omp parallel
50160e51c48SAlexey Bataev #pragma omp master taskloop
50260e51c48SAlexey Bataev   for (begin = end; begin < end; ++begin)
50360e51c48SAlexey Bataev     ++begin;
50460e51c48SAlexey Bataev #pragma omp parallel
50560e51c48SAlexey 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'}}
50660e51c48SAlexey Bataev #pragma omp master taskloop
50760e51c48SAlexey Bataev   for (GoodIter I = begin; I - I; ++I)
50860e51c48SAlexey Bataev     ++I;
50960e51c48SAlexey Bataev #pragma omp parallel
51060e51c48SAlexey 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'}}
51160e51c48SAlexey Bataev #pragma omp master taskloop
51260e51c48SAlexey Bataev   for (GoodIter I = begin; begin < end; ++I)
51360e51c48SAlexey Bataev     ++I;
51460e51c48SAlexey Bataev #pragma omp parallel
51560e51c48SAlexey 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'}}
51660e51c48SAlexey Bataev #pragma omp master taskloop
51760e51c48SAlexey Bataev   for (GoodIter I = begin; !I; ++I)
51860e51c48SAlexey Bataev     ++I;
51960e51c48SAlexey Bataev #pragma omp parallel
52060e51c48SAlexey Bataev // expected-note@+3 {{loop step is expected to be negative due to this condition}}
52160e51c48SAlexey Bataev // expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
52260e51c48SAlexey Bataev #pragma omp master taskloop
52360e51c48SAlexey Bataev   for (GoodIter I = begin; I >= end; I = I + 1)
52460e51c48SAlexey Bataev     ++I;
52560e51c48SAlexey Bataev #pragma omp parallel
52660e51c48SAlexey Bataev #pragma omp master taskloop
52760e51c48SAlexey Bataev   for (GoodIter I = begin; I >= end; I = I - 1)
52860e51c48SAlexey Bataev     ++I;
52960e51c48SAlexey Bataev #pragma omp parallel
53060e51c48SAlexey Bataev // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'I'}}
53160e51c48SAlexey Bataev #pragma omp master taskloop
53260e51c48SAlexey Bataev   for (GoodIter I = begin; I >= end; I = -I)
53360e51c48SAlexey Bataev     ++I;
53460e51c48SAlexey Bataev #pragma omp parallel
53560e51c48SAlexey Bataev // expected-note@+3 {{loop step is expected to be negative due to this condition}}
53660e51c48SAlexey Bataev // expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
53760e51c48SAlexey Bataev #pragma omp master taskloop
53860e51c48SAlexey Bataev   for (GoodIter I = begin; I >= end; I = 2 + I)
53960e51c48SAlexey Bataev     ++I;
54060e51c48SAlexey Bataev #pragma omp parallel
54160e51c48SAlexey Bataev // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'I'}}
54260e51c48SAlexey Bataev #pragma omp master taskloop
54360e51c48SAlexey Bataev   for (GoodIter I = begin; I >= end; I = 2 - I)
54460e51c48SAlexey Bataev     ++I;
54560e51c48SAlexey Bataev // In the following example, we cannot update the loop variable using '+='
54660e51c48SAlexey Bataev // expected-error@+3 {{invalid operands to binary expression ('Iter0' and 'int')}}
54760e51c48SAlexey Bataev #pragma omp parallel
54860e51c48SAlexey Bataev #pragma omp master taskloop
54960e51c48SAlexey Bataev   for (Iter0 I = begin0; I < end0; ++I)
55060e51c48SAlexey Bataev     ++I;
55160e51c48SAlexey Bataev #pragma omp parallel
55260e51c48SAlexey Bataev // Initializer is constructor without params.
55360e51c48SAlexey Bataev // expected-error@+3 {{invalid operands to binary expression ('Iter0' and 'int')}}
55460e51c48SAlexey Bataev // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
55560e51c48SAlexey Bataev #pragma omp master taskloop
55660e51c48SAlexey Bataev   for (Iter0 I; I < end0; ++I)
55760e51c48SAlexey Bataev     ++I;
55860e51c48SAlexey Bataev   Iter1 begin1, end1;
55960e51c48SAlexey Bataev // expected-error@+4 {{invalid operands to binary expression ('Iter1' and 'Iter1')}}
56060e51c48SAlexey Bataev // expected-error@+3 {{could not calculate number of iterations calling 'operator-' with upper and lower loop bounds}}
56160e51c48SAlexey Bataev #pragma omp parallel
56260e51c48SAlexey Bataev #pragma omp master taskloop
56360e51c48SAlexey Bataev   for (Iter1 I = begin1; I < end1; ++I)
56460e51c48SAlexey Bataev     ++I;
56560e51c48SAlexey Bataev #pragma omp parallel
56660e51c48SAlexey Bataev // expected-note@+3 {{loop step is expected to be negative due to this condition}}
56760e51c48SAlexey Bataev // expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
56860e51c48SAlexey Bataev #pragma omp master taskloop
56960e51c48SAlexey Bataev   for (Iter1 I = begin1; I >= end1; ++I)
57060e51c48SAlexey Bataev     ++I;
57160e51c48SAlexey Bataev #pragma omp parallel
57260e51c48SAlexey Bataev // expected-error@+5 {{invalid operands to binary expression ('Iter1' and 'float')}}
57360e51c48SAlexey Bataev // expected-error@+4 {{could not calculate number of iterations calling 'operator-' with upper and lower loop bounds}}
57460e51c48SAlexey Bataev // Initializer is constructor with all default params.
57560e51c48SAlexey Bataev // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
57660e51c48SAlexey Bataev #pragma omp master taskloop
57760e51c48SAlexey Bataev   for (Iter1 I; I < end1; ++I) {
57860e51c48SAlexey Bataev   }
57960e51c48SAlexey Bataev   return 0;
58060e51c48SAlexey Bataev }
58160e51c48SAlexey Bataev 
58260e51c48SAlexey Bataev template <typename IT, int ST>
58360e51c48SAlexey Bataev class TC {
58460e51c48SAlexey Bataev public:
dotest_lt(IT begin,IT end)58560e51c48SAlexey Bataev   int dotest_lt(IT begin, IT end) {
58660e51c48SAlexey Bataev #pragma omp parallel
58760e51c48SAlexey Bataev // expected-note@+3 {{loop step is expected to be positive due to this condition}}
58860e51c48SAlexey Bataev // expected-error@+2 {{increment expression must cause 'I' to increase on each iteration of OpenMP for loop}}
58960e51c48SAlexey Bataev #pragma omp master taskloop
59060e51c48SAlexey Bataev     for (IT I = begin; I < end; I = I + ST) {
59160e51c48SAlexey Bataev       ++I;
59260e51c48SAlexey Bataev     }
59360e51c48SAlexey Bataev #pragma omp parallel
59460e51c48SAlexey Bataev // expected-note@+3 {{loop step is expected to be positive due to this condition}}
59560e51c48SAlexey Bataev // expected-error@+2 {{increment expression must cause 'I' to increase on each iteration of OpenMP for loop}}
59660e51c48SAlexey Bataev #pragma omp master taskloop
59760e51c48SAlexey Bataev     for (IT I = begin; I <= end; I += ST) {
59860e51c48SAlexey Bataev       ++I;
59960e51c48SAlexey Bataev     }
60060e51c48SAlexey Bataev #pragma omp parallel
60160e51c48SAlexey Bataev #pragma omp master taskloop
60260e51c48SAlexey Bataev     for (IT I = begin; I < end; ++I) {
60360e51c48SAlexey Bataev       ++I;
60460e51c48SAlexey Bataev     }
60560e51c48SAlexey Bataev   }
60660e51c48SAlexey Bataev 
step()60760e51c48SAlexey Bataev   static IT step() {
60860e51c48SAlexey Bataev     return IT(ST);
60960e51c48SAlexey Bataev   }
61060e51c48SAlexey Bataev };
61160e51c48SAlexey Bataev template <typename IT, int ST = 0>
dotest_gt(IT begin,IT end)61260e51c48SAlexey Bataev int dotest_gt(IT begin, IT end) {
61360e51c48SAlexey Bataev #pragma omp parallel
61460e51c48SAlexey Bataev // expected-note@+3 2 {{loop step is expected to be negative due to this condition}}
61560e51c48SAlexey Bataev // expected-error@+2 2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
61660e51c48SAlexey Bataev #pragma omp master taskloop
61760e51c48SAlexey Bataev   for (IT I = begin; I >= end; I = I + ST) {
61860e51c48SAlexey Bataev     ++I;
61960e51c48SAlexey Bataev   }
62060e51c48SAlexey Bataev #pragma omp parallel
62160e51c48SAlexey Bataev // expected-note@+3 2 {{loop step is expected to be negative due to this condition}}
62260e51c48SAlexey Bataev // expected-error@+2 2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
62360e51c48SAlexey Bataev #pragma omp master taskloop
62460e51c48SAlexey Bataev   for (IT I = begin; I >= end; I += ST) {
62560e51c48SAlexey Bataev     ++I;
62660e51c48SAlexey Bataev   }
62760e51c48SAlexey Bataev 
62860e51c48SAlexey Bataev #pragma omp parallel
62960e51c48SAlexey Bataev // expected-note@+3 {{loop step is expected to be negative due to this condition}}
63060e51c48SAlexey Bataev // expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
63160e51c48SAlexey Bataev #pragma omp master taskloop
63260e51c48SAlexey Bataev   for (IT I = begin; I >= end; ++I) {
63360e51c48SAlexey Bataev     ++I;
63460e51c48SAlexey Bataev   }
63560e51c48SAlexey Bataev 
63660e51c48SAlexey Bataev #pragma omp parallel
63760e51c48SAlexey Bataev #pragma omp master taskloop
63860e51c48SAlexey Bataev   for (IT I = begin; I < end; I += TC<int, ST>::step()) {
63960e51c48SAlexey Bataev     ++I;
64060e51c48SAlexey Bataev   }
64160e51c48SAlexey Bataev }
64260e51c48SAlexey Bataev 
test_with_template()64360e51c48SAlexey Bataev void test_with_template() {
64460e51c48SAlexey Bataev   GoodIter begin, end;
64560e51c48SAlexey Bataev   TC<GoodIter, 100> t1;
64660e51c48SAlexey Bataev   TC<GoodIter, -100> t2;
64760e51c48SAlexey Bataev   t1.dotest_lt(begin, end);
64860e51c48SAlexey Bataev   t2.dotest_lt(begin, end);         // expected-note {{in instantiation of member function 'TC<GoodIter, -100>::dotest_lt' requested here}}
64960e51c48SAlexey Bataev   dotest_gt(begin, end);            // expected-note {{in instantiation of function template specialization 'dotest_gt<GoodIter, 0>' requested here}}
65060e51c48SAlexey Bataev   dotest_gt<unsigned, 10>(0, 100);  // expected-note {{in instantiation of function template specialization 'dotest_gt<unsigned int, 10>' requested here}}
65160e51c48SAlexey Bataev }
65260e51c48SAlexey Bataev 
test_loop_break()65360e51c48SAlexey Bataev void test_loop_break() {
65460e51c48SAlexey Bataev   const int N = 100;
65560e51c48SAlexey Bataev   float a[N], b[N], c[N];
65660e51c48SAlexey Bataev #pragma omp parallel
65760e51c48SAlexey Bataev #pragma omp master taskloop
65860e51c48SAlexey Bataev   for (int i = 0; i < 10; i++) {
65960e51c48SAlexey Bataev     c[i] = a[i] + b[i];
66060e51c48SAlexey Bataev     for (int j = 0; j < 10; ++j) {
66160e51c48SAlexey Bataev       if (a[i] > b[j])
66260e51c48SAlexey Bataev         break; // OK in nested loop
66360e51c48SAlexey Bataev     }
66460e51c48SAlexey Bataev     switch (i) {
66560e51c48SAlexey Bataev     case 1:
66660e51c48SAlexey Bataev       b[i]++;
66760e51c48SAlexey Bataev       break;
66860e51c48SAlexey Bataev     default:
66960e51c48SAlexey Bataev       break;
67060e51c48SAlexey Bataev     }
67160e51c48SAlexey Bataev     if (c[i] > 10)
67260e51c48SAlexey Bataev       break; // expected-error {{'break' statement cannot be used in OpenMP for loop}}
67360e51c48SAlexey Bataev 
67460e51c48SAlexey Bataev     if (c[i] > 11)
67560e51c48SAlexey Bataev       break; // expected-error {{'break' statement cannot be used in OpenMP for loop}}
67660e51c48SAlexey Bataev   }
67760e51c48SAlexey Bataev 
67860e51c48SAlexey Bataev #pragma omp parallel
67960e51c48SAlexey Bataev #pragma omp master taskloop
68060e51c48SAlexey Bataev   for (int i = 0; i < 10; i++) {
68160e51c48SAlexey Bataev     for (int j = 0; j < 10; j++) {
68260e51c48SAlexey Bataev       c[i] = a[i] + b[i];
68360e51c48SAlexey Bataev       if (c[i] > 10) {
68460e51c48SAlexey Bataev         if (c[i] < 20) {
68560e51c48SAlexey Bataev           break; // OK
68660e51c48SAlexey Bataev         }
68760e51c48SAlexey Bataev       }
68860e51c48SAlexey Bataev     }
68960e51c48SAlexey Bataev   }
69060e51c48SAlexey Bataev }
69160e51c48SAlexey Bataev 
test_loop_eh()69260e51c48SAlexey Bataev void test_loop_eh() {
69360e51c48SAlexey Bataev   const int N = 100;
69460e51c48SAlexey Bataev   float a[N], b[N], c[N];
69560e51c48SAlexey Bataev #pragma omp parallel
69660e51c48SAlexey Bataev #pragma omp master taskloop
69760e51c48SAlexey Bataev   for (int i = 0; i < 10; i++) {
69860e51c48SAlexey Bataev     c[i] = a[i] + b[i];
69960e51c48SAlexey Bataev     try {
70060e51c48SAlexey Bataev       for (int j = 0; j < 10; ++j) {
70160e51c48SAlexey Bataev         if (a[i] > b[j])
70260e51c48SAlexey Bataev           throw a[i];
70360e51c48SAlexey Bataev       }
70460e51c48SAlexey Bataev       throw a[i];
70560e51c48SAlexey Bataev     } catch (float f) {
70660e51c48SAlexey Bataev       if (f > 0.1)
70760e51c48SAlexey Bataev         throw a[i];
70860e51c48SAlexey Bataev       return; // expected-error {{cannot return from OpenMP region}}
70960e51c48SAlexey Bataev     }
71060e51c48SAlexey Bataev     switch (i) {
71160e51c48SAlexey Bataev     case 1:
71260e51c48SAlexey Bataev       b[i]++;
71360e51c48SAlexey Bataev       break;
71460e51c48SAlexey Bataev     default:
71560e51c48SAlexey Bataev       break;
71660e51c48SAlexey Bataev     }
71760e51c48SAlexey Bataev     for (int j = 0; j < 10; j++) {
71860e51c48SAlexey Bataev       if (c[i] > 10)
71960e51c48SAlexey Bataev         throw c[i];
72060e51c48SAlexey Bataev     }
72160e51c48SAlexey Bataev   }
72260e51c48SAlexey Bataev   if (c[9] > 10)
72360e51c48SAlexey Bataev     throw c[9]; // OK
72460e51c48SAlexey Bataev 
72560e51c48SAlexey Bataev #pragma omp parallel
72660e51c48SAlexey Bataev #pragma omp master taskloop
72760e51c48SAlexey Bataev   for (int i = 0; i < 10; ++i) {
72860e51c48SAlexey Bataev     struct S {
72960e51c48SAlexey Bataev       void g() { throw 0; }
73060e51c48SAlexey Bataev     };
73160e51c48SAlexey Bataev   }
73260e51c48SAlexey Bataev }
73360e51c48SAlexey Bataev 
test_loop_firstprivate_lastprivate()73460e51c48SAlexey Bataev void test_loop_firstprivate_lastprivate() {
73560e51c48SAlexey Bataev   S s(4);
73660e51c48SAlexey Bataev #pragma omp parallel
73760e51c48SAlexey Bataev #pragma omp master taskloop lastprivate(s) firstprivate(s)
73860e51c48SAlexey Bataev   for (int i = 0; i < 16; ++i)
73960e51c48SAlexey Bataev     ;
74060e51c48SAlexey Bataev }
74160e51c48SAlexey Bataev 
742