1b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// RUN: %clang_cc1 -fsyntax-only -fopenmp -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify %s
2c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
3c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesclass S {
4c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  int a;
5c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  S() : a(0) {}
6c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
7c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinespublic:
8c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  S(int v) : a(v) {}
9c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  S(const S &s) : a(s.a) {}
10c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines};
11c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
12c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstatic int sii;
134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+1 {{defined as threadprivate or thread local}}
14b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#pragma omp threadprivate(sii)
15176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstatic int globalii;
16c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
1787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Currently, we cannot use "0" for global register variables.
1887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// register int reg0 __asm__("0");
1987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint reg0;
20b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
21c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesint test_iteration_spaces() {
22c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  const int N = 100;
23c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  float a[N], b[N], c[N];
24c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  int ii, jj, kk;
25c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  float fii;
26c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  double dii;
27b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  register int reg; // expected-warning {{'register' storage class specifier is deprecated}}
28c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
29c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
30c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (int i = 0; i < 10; i += 1) {
31c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[i] = a[i] + b[i];
32c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
33c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
34c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
35c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (char i = 0; i < 10; i++) {
36c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[i] = a[i] + b[i];
37c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
38c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
39c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
40c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (char i = 0; i < 10; i += '\1') {
41c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[i] = a[i] + b[i];
42c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
43c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
44c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
45c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (long long i = 0; i < 10; i++) {
46c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[i] = a[i] + b[i];
47c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
48c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
49c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{expression must have integral or unscoped enumeration type, not 'double'}}
50c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
51c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (long long i = 0; i < 10; i += 1.5) {
52c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[i] = a[i] + b[i];
53c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
54c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
55c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
56c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (long long i = 0; i < 'z'; i += 1u) {
57c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[i] = a[i] + b[i];
58c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
59c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
60c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{variable must be of integer or random access iterator type}}
61c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
62c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (float fi = 0; fi < 10.0; fi++) {
63c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[(int)fi] = a[(int)fi] + b[(int)fi];
64c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
65c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
66c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{variable must be of integer or random access iterator type}}
67c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
68c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (double fi = 0; fi < 10.0; fi++) {
69c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[(int)fi] = a[(int)fi] + b[(int)fi];
70c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
71c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
7287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
73c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
74c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (int &ref = ii; ref < 10; ref++) {
75c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
76c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
7787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
78c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
79c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (int i; i < 10; i++)
80c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[i] = a[i];
81c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
82c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
8387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
84c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
85c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (int i = 0, j = 0; i < 10; ++i)
86c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[i] = a[i];
87c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
88c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
8987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
90c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
91c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (; ii < 10; ++ii)
92c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[ii];
93c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
94c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
95c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-warning@+3 {{expression result unused}}
9687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
97c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
98c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (ii + 1; ii < 10; ++ii)
99c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[ii];
100c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
101c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
10287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
103c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
104c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (c[ii] = 0; ii < 10; ++ii)
105c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[ii];
106c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
107c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
108c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// Ok to skip parenthesises.
109c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
110c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (((ii)) = 0; ii < 10; ++ii)
111c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[ii];
112c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
113c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
114c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
115c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
116c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (int i = 0; i; i++)
117c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[i] = a[i];
118c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
119c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
120c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+3 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
121c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'i'}}
122c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
123c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (int i = 0; jj < kk; ii++)
124c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[i] = a[i];
125c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
126c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
127c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
128c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
129c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (int i = 0; !!i; i++)
130c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[i] = a[i];
131c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
132c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
133c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
134c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
135c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (int i = 0; i != 1; i++)
136c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[i] = a[i];
137c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
138c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
139c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
140c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
141c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (int i = 0;; i++)
142c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[i] = a[i];
143c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
144c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
145c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// Ok.
146c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
147c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (int i = 11; i > 10; i--)
148c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[i] = a[i];
149c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
150c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
151c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// Ok.
152c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
153c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (int i = 0; i < 10; ++i)
154c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[i] = a[i];
155c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
156c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
157c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// Ok.
158c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
159c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (ii = 0; ii < 10; ++ii)
160c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[ii];
161c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
162c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
163c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
164c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
165c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (ii = 0; ii < 10; ++jj)
166c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[jj];
167c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
168c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
169c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
170c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
171c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (ii = 0; ii < 10; ++++ii)
172c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[ii];
173c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
174c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
175c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// Ok but undefined behavior (in general, cannot check that incr
176c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// is really loop-invariant).
177c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
178c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (ii = 0; ii < 10; ii = ii + ii)
179c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[ii];
180c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
181c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
182c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{expression must have integral or unscoped enumeration type, not 'float'}}
183c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
184c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (ii = 0; ii < 10; ii = ii + 1.0f)
185c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[ii];
186c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
187c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
188c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// Ok - step was converted to integer type.
189c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
190c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (ii = 0; ii < 10; ii = ii + (int)1.1f)
191c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[ii];
192c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
193c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
194c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
195c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
196c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (ii = 0; ii < 10; jj = ii + 2)
197c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[ii];
198c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
199c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
200c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-warning@+3 {{relational comparison result unused}}
201c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
202c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
203c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (ii = 0; ii<10; jj> kk + 2)
204c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[ii];
205c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
206c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
207c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
208c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
209c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (ii = 0; ii < 10;)
210c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[ii];
211c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
212c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
213c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-warning@+3 {{expression result unused}}
214c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
215c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
216c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (ii = 0; ii < 10; !ii)
217c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[ii];
218c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
219c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
220c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
221c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
222c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (ii = 0; ii < 10; ii ? ++ii : ++jj)
223c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[ii];
224c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
225c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
226c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
227c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
228c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (ii = 0; ii < 10; ii = ii < 10)
229c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[ii];
230c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
231c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
232c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-note@+3 {{loop step is expected to be positive due to this condition}}
233c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
234c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
235c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (ii = 0; ii < 10; ii = ii + 0)
236c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[ii];
237c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
238c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
239c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-note@+3 {{loop step is expected to be positive due to this condition}}
240c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
241c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
242c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (ii = 0; ii < 10; ii = ii + (int)(0.8 - 0.45))
243c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[ii];
244c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
245c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
246c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-note@+3 {{loop step is expected to be positive due to this condition}}
247c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
248c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
249c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (ii = 0; (ii) < 10; ii -= 25)
250c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[ii];
251c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
252c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
253c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-note@+3 {{loop step is expected to be positive due to this condition}}
254c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
255c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
256c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (ii = 0; (ii < 10); ii -= 0)
257c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[ii];
258c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
259c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
260c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-note@+3 {{loop step is expected to be negative due to this condition}}
261c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{increment expression must cause 'ii' to decrease on each iteration of OpenMP for loop}}
262c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
263c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (ii = 0; ii > 10; (ii += 0))
264c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[ii];
265c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
266c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
267c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-note@+3 {{loop step is expected to be positive due to this condition}}
268c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
269c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
270c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (ii = 0; ii < 10; (ii) = (1 - 1) + (ii))
271c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[ii];
272c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
273c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
274c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-note@+3 {{loop step is expected to be negative due to this condition}}
275c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{increment expression must cause 'ii' to decrease on each iteration of OpenMP for loop}}
276c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
277c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for ((ii = 0); ii > 10; (ii -= 0))
278c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[ii];
279c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
280c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
281c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-note@+3 {{loop step is expected to be positive due to this condition}}
282c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
283c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
284c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (ii = 0; (ii < 10); (ii -= 0))
285c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[ii];
286c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
287c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
288c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-note@+2  {{defined as firstprivate}}
289c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{loop iteration variable in the associated loop of 'omp for' directive may not be firstprivate, predetermined as private}}
290c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for firstprivate(ii)
291c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (ii = 0; ii < 10; ii++)
292c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[ii];
293c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
294c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
295c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-note@+2  {{defined as linear}}
296c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{loop iteration variable in the associated loop of 'omp for' directive may not be linear, predetermined as private}}
297c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for linear(ii)
298c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (ii = 0; ii < 10; ii++)
299c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[ii];
300c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
301c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
302c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for private(ii)
303c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (ii = 0; ii < 10; ii++)
304c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[ii];
305c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
306c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
307c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for lastprivate(ii)
308c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (ii = 0; ii < 10; ii++)
309c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[ii] = a[ii];
310c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
311c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
312c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  {
3134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{loop iteration variable in the associated loop of 'omp for' directive may not be threadprivate or thread local, predetermined as private}}
314c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
315c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    for (sii = 0; sii < 10; sii += 1)
316c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      c[sii] = a[sii];
317c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
318c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
319c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
320176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  {
321b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#pragma omp for
322b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    for (reg0 = 0; reg0 < 10; reg0 += 1)
323b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      c[reg0] = a[reg0];
324b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  }
325b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
326b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#pragma omp parallel
327b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  {
328b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#pragma omp for
329b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    for (reg = 0; reg < 10; reg += 1)
330b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      c[reg] = a[reg];
331b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  }
332b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
333b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#pragma omp parallel
334b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  {
335176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for
336176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    for (globalii = 0; globalii < 10; globalii += 1)
337176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      c[globalii] = a[globalii];
338176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
339176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
340176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
341176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  {
342176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for collapse(2)
343176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    for (ii = 0; ii < 10; ii += 1)
344176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    for (globalii = 0; globalii < 10; globalii += 1)
345176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      c[globalii] += a[globalii] + ii;
346176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
347176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
348176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
349c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{statement after '#pragma omp for' must be a for loop}}
350c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
351c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (auto &item : a) {
352c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    item = item + 1;
353c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
354c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
355c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
356c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-note@+3 {{loop step is expected to be positive due to this condition}}
357c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{increment expression must cause 'i' to increase on each iteration of OpenMP for loop}}
358c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
359c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (unsigned i = 9; i < 10; i--) {
360c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[i] = a[i] + b[i];
361c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
362c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
363c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  int(*lb)[4] = nullptr;
364c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
365c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
366c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (int(*p)[4] = lb; p < lb + 8; ++p) {
367c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
368c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
369c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
370c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
371c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
372c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (int a{0}; a < 10; ++a) {
373c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
374c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
375c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return 0;
376c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
377c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
378c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// Iterators allowed in openmp for-loops.
379c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesnamespace std {
380c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstruct random_access_iterator_tag {};
381c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <class Iter>
382c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstruct iterator_traits {
383c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  typedef typename Iter::difference_type difference_type;
384c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  typedef typename Iter::iterator_category iterator_category;
385c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines};
386c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <class Iter>
387c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestypename iterator_traits<Iter>::difference_type
388c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesdistance(Iter first, Iter last) { return first - last; }
389c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
390c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesclass Iter0 {
391c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinespublic:
392c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  Iter0() {}
393c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  Iter0(const Iter0 &) {}
394c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  Iter0 operator++() { return *this; }
395c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  Iter0 operator--() { return *this; }
396c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  bool operator<(Iter0 a) { return true; }
397c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines};
398176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+2 {{candidate function not viable: no known conversion from 'GoodIter' to 'Iter0' for 1st argument}}
399176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'Iter0' for 1st argument}}
400c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesint operator-(Iter0 a, Iter0 b) { return 0; }
401c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesclass Iter1 {
402c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinespublic:
403c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  Iter1(float f = 0.0f, double d = 0.0) {}
404c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  Iter1(const Iter1 &) {}
405c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  Iter1 operator++() { return *this; }
406c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  Iter1 operator--() { return *this; }
407c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  bool operator<(Iter1 a) { return true; }
408c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  bool operator>=(Iter1 a) { return false; }
409c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines};
410c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesclass GoodIter {
411c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinespublic:
412c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  GoodIter() {}
413c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  GoodIter(const GoodIter &) {}
414c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  GoodIter(int fst, int snd) {}
415c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  GoodIter &operator=(const GoodIter &that) { return *this; }
416c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  GoodIter &operator=(const Iter0 &that) { return *this; }
417c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  GoodIter &operator+=(int x) { return *this; }
418176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  GoodIter &operator-=(int x) { return *this; }
419c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  explicit GoodIter(void *) {}
420c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  GoodIter operator++() { return *this; }
421c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  GoodIter operator--() { return *this; }
422c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  bool operator!() { return true; }
423c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  bool operator<(GoodIter a) { return true; }
424c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  bool operator<=(GoodIter a) { return true; }
425c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  bool operator>=(GoodIter a) { return false; }
426c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  typedef int difference_type;
427c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  typedef std::random_access_iterator_tag iterator_category;
428c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines};
4294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass GoodIter1 {
4304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic:
4314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  GoodIter1() {}
4324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  GoodIter1(const GoodIter1 &) {}
4334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  GoodIter1 &operator++(int) { return *this; }
4344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  GoodIter1 &operator=(const GoodIter1 &that) { return *this; }
4354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  GoodIter1 &operator+=(int x) { return *this; }
4364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend long operator-(const GoodIter1 &, const GoodIter1 &);
4374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  GoodIter1 &operator-(int) { return *this; }
4384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool operator<(GoodIter1 a) { return true; }
4394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef int difference_type;
4404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef std::random_access_iterator_tag iterator_category;
4414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
4424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+2 {{candidate function not viable: no known conversion from 'const Iter0' to 'GoodIter' for 2nd argument}}
443176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'GoodIter' for 1st argument}}
444c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesint operator-(GoodIter a, GoodIter b) { return 0; }
445176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+1 3 {{candidate function not viable: requires single argument 'a', but 2 arguments were provided}}
446c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesGoodIter operator-(GoodIter a) { return a; }
4474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+2 {{candidate function not viable: no known conversion from 'const Iter0' to 'int' for 2nd argument}}
448176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'GoodIter' for 1st argument}}
449c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesGoodIter operator-(GoodIter a, int v) { return GoodIter(); }
450176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter0' to 'GoodIter' for 1st argument}}
451c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesGoodIter operator+(GoodIter a, int v) { return GoodIter(); }
452176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+2 {{candidate function not viable: no known conversion from 'GoodIter' to 'int' for 1st argument}}
453176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'int' for 1st argument}}
454c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesGoodIter operator-(int v, GoodIter a) { return GoodIter(); }
455176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter0' to 'int' for 1st argument}}
456c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesGoodIter operator+(int v, GoodIter a) { return GoodIter(); }
457c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
458c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesint test_with_random_access_iterator() {
459c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  GoodIter begin, end;
460c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  Iter0 begin0, end0;
461c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
462c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
463c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (GoodIter I = begin; I < end; ++I)
464c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ++I;
465c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
46687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
467c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
468c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (GoodIter &I = begin; I < end; ++I)
469c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ++I;
470c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
471c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
472c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (GoodIter I = begin; I >= end; --I)
473c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ++I;
474c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
475c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
476c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
477c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (GoodIter I(begin); I < end; ++I)
478c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ++I;
479c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
480c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
481c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
482c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (GoodIter I(nullptr); I < end; ++I)
483c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ++I;
484c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
485c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
486c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
487c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (GoodIter I(0); I < end; ++I)
488c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ++I;
489c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
490c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
491c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
492c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (GoodIter I(1, 2); I < end; ++I)
493c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ++I;
494c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
495c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
496c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (begin = GoodIter(0); begin < end; ++begin)
497c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ++begin;
4984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+4 {{invalid operands to binary expression ('GoodIter' and 'const Iter0')}}
499176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+3 {{could not calculate number of iterations calling 'operator-' with upper and lower loop bounds}}
500c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
501c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
502c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (begin = begin0; begin < end; ++begin)
503c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ++begin;
504c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
50587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
506c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
507c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (++begin; begin < end; ++begin)
508c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ++begin;
509c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
510c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
511c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (begin = end; begin < end; ++begin)
512c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ++begin;
513c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
514c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}}
515c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
516c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (GoodIter I = begin; I - I; ++I)
517c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ++I;
518c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
519c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}}
520c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
521c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (GoodIter I = begin; begin < end; ++I)
522c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ++I;
523c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
524c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}}
525c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
526c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (GoodIter I = begin; !I; ++I)
527c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ++I;
528c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
529c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-note@+3 {{loop step is expected to be negative due to this condition}}
530c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
531c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
532c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (GoodIter I = begin; I >= end; I = I + 1)
533c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ++I;
534c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
535c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
536c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (GoodIter I = begin; I >= end; I = I - 1)
537c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ++I;
538c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
539c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'I'}}
540c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
541c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (GoodIter I = begin; I >= end; I = -I)
542c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ++I;
543c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
544c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-note@+3 {{loop step is expected to be negative due to this condition}}
545c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
546c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
547c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (GoodIter I = begin; I >= end; I = 2 + I)
548c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ++I;
549c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
550c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'I'}}
551c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
552c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (GoodIter I = begin; I >= end; I = 2 - I)
553c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ++I;
554176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// In the following example, we cannot update the loop variable using '+='
555176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+3 {{invalid operands to binary expression ('Iter0' and 'int')}}
556c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
557c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
558c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (Iter0 I = begin0; I < end0; ++I)
559c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ++I;
560c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
561c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// Initializer is constructor without params.
562176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+3 {{invalid operands to binary expression ('Iter0' and 'int')}}
563c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
564c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
565c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (Iter0 I; I < end0; ++I)
566c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ++I;
567c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  Iter1 begin1, end1;
568176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+4 {{invalid operands to binary expression ('Iter1' and 'Iter1')}}
569176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+3 {{could not calculate number of iterations calling 'operator-' with upper and lower loop bounds}}
570c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
571c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
572c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (Iter1 I = begin1; I < end1; ++I)
573c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ++I;
574c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
575c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-note@+3 {{loop step is expected to be negative due to this condition}}
576c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
577c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
578c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (Iter1 I = begin1; I >= end1; ++I)
579c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ++I;
580c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
58187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// expected-error@+5 {{invalid operands to binary expression ('Iter1' and 'float')}}
582176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+4 {{could not calculate number of iterations calling 'operator-' with upper and lower loop bounds}}
583c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// Initializer is constructor with all default params.
584c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
585c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
586c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (Iter1 I; I < end1; ++I) {
587c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
5884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  GoodIter1 I1, E1;
5894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp for
5904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (GoodIter1 I = I1; I < E1; I++)
5914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ;
592c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return 0;
593c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
594c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
595c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename IT, int ST>
596c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesclass TC {
597c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinespublic:
598c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  int dotest_lt(IT begin, IT end) {
599c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
600c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-note@+3 {{loop step is expected to be positive due to this condition}}
601c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{increment expression must cause 'I' to increase on each iteration of OpenMP for loop}}
602c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
603c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    for (IT I = begin; I < end; I = I + ST) {
604c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      ++I;
605c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    }
606c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
607c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-note@+3 {{loop step is expected to be positive due to this condition}}
608c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{increment expression must cause 'I' to increase on each iteration of OpenMP for loop}}
609c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
610c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    for (IT I = begin; I <= end; I += ST) {
611c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      ++I;
612c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    }
613c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
614c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
615c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    for (IT I = begin; I < end; ++I) {
616c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      ++I;
617c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    }
618c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
619c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
620c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  static IT step() {
621c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return IT(ST);
622c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
623c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines};
624c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename IT, int ST = 0>
625c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesint dotest_gt(IT begin, IT end) {
626c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
627c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-note@+3 2 {{loop step is expected to be negative due to this condition}}
628c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
629c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
630c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (IT I = begin; I >= end; I = I + ST) {
631c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ++I;
632c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
633c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
634c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-note@+3 2 {{loop step is expected to be negative due to this condition}}
635c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
636c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
637c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (IT I = begin; I >= end; I += ST) {
638c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ++I;
639c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
640c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
641c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
642c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-note@+3 {{loop step is expected to be negative due to this condition}}
643c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
644c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
645c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (IT I = begin; I >= end; ++I) {
646c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ++I;
647c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
648c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
649c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
650c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
651c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (IT I = begin; I < end; I += TC<int, ST>::step()) {
652c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ++I;
653c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
654c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
655c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
656c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid test_with_template() {
657c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  GoodIter begin, end;
658c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TC<GoodIter, 100> t1;
659c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TC<GoodIter, -100> t2;
660c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  t1.dotest_lt(begin, end);
661c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  t2.dotest_lt(begin, end);         // expected-note {{in instantiation of member function 'TC<GoodIter, -100>::dotest_lt' requested here}}
662c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  dotest_gt(begin, end);            // expected-note {{in instantiation of function template specialization 'dotest_gt<GoodIter, 0>' requested here}}
663c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  dotest_gt<unsigned, -10>(0, 100); // expected-note {{in instantiation of function template specialization 'dotest_gt<unsigned int, -10>' requested here}}
664c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
665c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
666c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid test_loop_break() {
667c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  const int N = 100;
668c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  float a[N], b[N], c[N];
669c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
670c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
671c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (int i = 0; i < 10; i++) {
672c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[i] = a[i] + b[i];
673c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    for (int j = 0; j < 10; ++j) {
674c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      if (a[i] > b[j])
675c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines        break; // OK in nested loop
676c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    }
677c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    switch (i) {
678c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    case 1:
679c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      b[i]++;
680c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      break;
681c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    default:
682c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      break;
683c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    }
684c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    if (c[i] > 10)
685c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      break; // expected-error {{'break' statement cannot be used in OpenMP for loop}}
686c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
687c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    if (c[i] > 11)
688c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      break; // expected-error {{'break' statement cannot be used in OpenMP for loop}}
689c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
690c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
691c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
692c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
693c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (int i = 0; i < 10; i++) {
694c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    for (int j = 0; j < 10; j++) {
695c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      c[i] = a[i] + b[i];
696c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      if (c[i] > 10) {
697c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines        if (c[i] < 20) {
698c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines          break; // OK
699c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines        }
700c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      }
701c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    }
702c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
703c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
704c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
705c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid test_loop_eh() {
706c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  const int N = 100;
707c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  float a[N], b[N], c[N];
708c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
709c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
710c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (int i = 0; i < 10; i++) {
711c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    c[i] = a[i] + b[i];
712c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    try {
713c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      for (int j = 0; j < 10; ++j) {
714c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines        if (a[i] > b[j])
715c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines          throw a[i];
716c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      }
717c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      throw a[i];
718c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    } catch (float f) {
719c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      if (f > 0.1)
720c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines        throw a[i];
721c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      return; // expected-error {{cannot return from OpenMP region}}
722c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    }
723c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    switch (i) {
724c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    case 1:
725c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      b[i]++;
726c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      break;
727c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    default:
728c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      break;
729c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    }
730c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    for (int j = 0; j < 10; j++) {
731c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      if (c[i] > 10)
732c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines        throw c[i];
733c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    }
734c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
735c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  if (c[9] > 10)
736c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    throw c[9]; // OK
737c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
738c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
739c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for
740c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (int i = 0; i < 10; ++i) {
741c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    struct S {
742c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      void g() { throw 0; }
743c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    };
744c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
745c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
746c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
747c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid test_loop_firstprivate_lastprivate() {
748c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  S s(4);
749c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel
750c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp for lastprivate(s) firstprivate(s)
751c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (int i = 0; i < 16; ++i)
752c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    ;
753c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
754176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
755176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid test_ordered() {
756176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
757176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for ordered ordered // expected-error {{directive '#pragma omp for' cannot contain more than one 'ordered' clause}}
758176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (int i = 0; i < 16; ++i)
759176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ;
760176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
761176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
762176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid test_nowait() {
763176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
764176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for nowait nowait // expected-error {{directive '#pragma omp for' cannot contain more than one 'nowait' clause}}
765176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (int i = 0; i < 16; ++i)
766176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ;
767176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
768