1ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// RUN: %clang_cc1 -fsyntax-only -fopenmp=libiomp5 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify %s
2ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
3ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesclass S {
4ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  int a;
5ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  S() : a(0) {}
6ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
7ef8225444452a1486bd721f3285301fe84643b00Stephen Hinespublic:
8ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  S(int v) : a(v) {}
9ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  S(const S &s) : a(s.a) {}
10ef8225444452a1486bd721f3285301fe84643b00Stephen Hines};
11ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
12ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstatic int sii;
13ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp threadprivate(sii) // expected-note {{defined as threadprivate or thread local}}
14ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
15ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesint test_iteration_spaces() {
16ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  const int N = 100;
17ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  float a[N], b[N], c[N];
18ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  int ii, jj, kk;
19ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  float fii;
20ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  double dii;
21ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
22ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
23ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int i = 0; i < 10; i += 1) {
24ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[i] = a[i] + b[i];
25ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
26ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
27ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
28ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (char i = 0; i < 10; i++) {
29ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[i] = a[i] + b[i];
30ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
31ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
32ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
33ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (char i = 0; i < 10; i += '\1') {
34ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[i] = a[i] + b[i];
35ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
36ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
37ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
38ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (long long i = 0; i < 10; i++) {
39ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[i] = a[i] + b[i];
40ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
41ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
42ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{expression must have integral or unscoped enumeration type, not 'double'}}
43ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
44ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (long long i = 0; i < 10; i += 1.5) {
45ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[i] = a[i] + b[i];
46ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
47ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
48ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
49ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (long long i = 0; i < 'z'; i += 1u) {
50ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[i] = a[i] + b[i];
51ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
52ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
53ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{variable must be of integer or random access iterator type}}
54ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
55ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (float fi = 0; fi < 10.0; fi++) {
56ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[(int)fi] = a[(int)fi] + b[(int)fi];
57ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
58ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
59ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{variable must be of integer or random access iterator type}}
60ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
61ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (double fi = 0; fi < 10.0; fi++) {
62ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[(int)fi] = a[(int)fi] + b[(int)fi];
63ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
64ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
65ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{variable must be of integer or random access iterator type}}
66ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
67ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int &ref = ii; ref < 10; ref++) {
68ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
69ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
70ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}}
71ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
72ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int i; i < 10; i++)
73ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[i] = a[i];
74ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
75ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
76ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}}
77ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
78ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int i = 0, j = 0; i < 10; ++i)
79ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[i] = a[i];
80ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
81ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
82ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}}
83ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
84ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (; ii < 10; ++ii)
85ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[ii];
86ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
87ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
88ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-warning@+3 {{expression result unused}}
89ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}}
90ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
91ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (ii + 1; ii < 10; ++ii)
92ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[ii];
93ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
94ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
95ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}}
96ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
97ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (c[ii] = 0; ii < 10; ++ii)
98ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[ii];
99ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
100ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
101ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// Ok to skip parenthesises.
102ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
103ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (((ii)) = 0; ii < 10; ++ii)
104ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[ii];
105ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
106ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
107ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
108ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
109ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int i = 0; i; i++)
110ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[i] = a[i];
111ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
112ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
113ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+3 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
114ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'i'}}
115ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
116ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int i = 0; jj < kk; ii++)
117ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[i] = a[i];
118ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
119ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
120ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
121ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
122ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int i = 0; !!i; i++)
123ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[i] = a[i];
124ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
125ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
126ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
127ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
128ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int i = 0; i != 1; i++)
129ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[i] = a[i];
130ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
131ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
132ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
133ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
134ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int i = 0;; i++)
135ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[i] = a[i];
136ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
137ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
138ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// Ok.
139ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
140ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int i = 11; i > 10; i--)
141ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[i] = a[i];
142ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
143ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
144ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// Ok.
145ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
146ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int i = 0; i < 10; ++i)
147ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[i] = a[i];
148ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
149ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
150ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// Ok.
151ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
152ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (ii = 0; ii < 10; ++ii)
153ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[ii];
154ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
155ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
156ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
157ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
158ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (ii = 0; ii < 10; ++jj)
159ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[jj];
160ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
161ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
162ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
163ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
164ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (ii = 0; ii < 10; ++++ii)
165ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[ii];
166ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
167ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
168ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// Ok but undefined behavior (in general, cannot check that incr
169ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// is really loop-invariant).
170ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
171ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (ii = 0; ii < 10; ii = ii + ii)
172ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[ii];
173ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
174ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
175ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{expression must have integral or unscoped enumeration type, not 'float'}}
176ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
177ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (ii = 0; ii < 10; ii = ii + 1.0f)
178ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[ii];
179ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
180ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
181ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// Ok - step was converted to integer type.
182ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
183ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (ii = 0; ii < 10; ii = ii + (int)1.1f)
184ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[ii];
185ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
186ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
187ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
188ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
189ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (ii = 0; ii < 10; jj = ii + 2)
190ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[ii];
191ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
192ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
193ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-warning@+3 {{relational comparison result unused}}
194ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
195ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
196ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (ii = 0; ii<10; jj> kk + 2)
197ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[ii];
198ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
199ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
200ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
201ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
202ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (ii = 0; ii < 10;)
203ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[ii];
204ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
205ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
206ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-warning@+3 {{expression result unused}}
207ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
208ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
209ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (ii = 0; ii < 10; !ii)
210ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[ii];
211ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
212ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
213ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
214ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
215ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (ii = 0; ii < 10; ii ? ++ii : ++jj)
216ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[ii];
217ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
218ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
219ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
220ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
221ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (ii = 0; ii < 10; ii = ii < 10)
222ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[ii];
223ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
224ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
225ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-note@+3 {{loop step is expected to be positive due to this condition}}
226ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
227ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
228ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (ii = 0; ii < 10; ii = ii + 0)
229ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[ii];
230ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
231ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
232ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-note@+3 {{loop step is expected to be positive due to this condition}}
233ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
234ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
235ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (ii = 0; ii < 10; ii = ii + (int)(0.8 - 0.45))
236ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[ii];
237ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
238ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
239ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-note@+3 {{loop step is expected to be positive due to this condition}}
240ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
241ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
242ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (ii = 0; (ii) < 10; ii -= 25)
243ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[ii];
244ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
245ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
246ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-note@+3 {{loop step is expected to be positive due to this condition}}
247ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
248ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
249ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (ii = 0; (ii < 10); ii -= 0)
250ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[ii];
251ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
252ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
253ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-note@+3 {{loop step is expected to be negative due to this condition}}
254ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{increment expression must cause 'ii' to decrease on each iteration of OpenMP for loop}}
255ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
256ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (ii = 0; ii > 10; (ii += 0))
257ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[ii];
258ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
259ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
260ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-note@+3 {{loop step is expected to be positive due to this condition}}
261ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
262ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
263ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (ii = 0; ii < 10; (ii) = (1 - 1) + (ii))
264ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[ii];
265ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
266ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
267ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-note@+3 {{loop step is expected to be negative due to this condition}}
268ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{increment expression must cause 'ii' to decrease on each iteration of OpenMP for loop}}
269ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
270ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for ((ii = 0); ii > 10; (ii -= 0))
271ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[ii];
272ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
273ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
274ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-note@+3 {{loop step is expected to be positive due to this condition}}
275ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
276ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
277ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (ii = 0; (ii < 10); (ii -= 0))
278ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[ii];
279ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
280ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
281ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-note@+2  {{defined as firstprivate}}
282ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{loop iteration variable in the associated loop of 'omp for' directive may not be firstprivate, predetermined as private}}
283ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for firstprivate(ii)
284ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (ii = 0; ii < 10; ii++)
285ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[ii];
286ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
287ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
288ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+3 {{unexpected OpenMP clause 'linear' in directive '#pragma omp for'}}
289ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-note@+2  {{defined as linear}}
290ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{loop iteration variable in the associated loop of 'omp for' directive may not be linear, predetermined as private}}
291ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for linear(ii)
292ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (ii = 0; ii < 10; ii++)
293ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[ii];
294ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
295ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
296ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for private(ii)
297ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (ii = 0; ii < 10; ii++)
298ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[ii];
299ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
300ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
301ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for lastprivate(ii)
302ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (ii = 0; ii < 10; ii++)
303ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[ii] = a[ii];
304ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
305ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
306ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  {
307ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{loop iteration variable in the associated loop of 'omp for' directive may not be threadprivate or thread local, predetermined as private}}
308ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
309ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    for (sii = 0; sii < 10; sii += 1)
310ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      c[sii] = a[sii];
311ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
312ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
313ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
314ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{statement after '#pragma omp for' must be a for loop}}
315ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
316ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (auto &item : a) {
317ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    item = item + 1;
318ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
319ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
320ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
321ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-note@+3 {{loop step is expected to be positive due to this condition}}
322ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{increment expression must cause 'i' to increase on each iteration of OpenMP for loop}}
323ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
324ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (unsigned i = 9; i < 10; i--) {
325ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[i] = a[i] + b[i];
326ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
327ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
328ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  int(*lb)[4] = nullptr;
329ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
330ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
331ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int(*p)[4] = lb; p < lb + 8; ++p) {
332ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
333ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
334ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
335ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
336ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
337ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int a{0}; a < 10; ++a) {
338ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
339ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
340ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  return 0;
341ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
342ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
343ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// Iterators allowed in openmp for-loops.
344ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesnamespace std {
345ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct random_access_iterator_tag {};
346ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate <class Iter>
347ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct iterator_traits {
348ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  typedef typename Iter::difference_type difference_type;
349ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  typedef typename Iter::iterator_category iterator_category;
350ef8225444452a1486bd721f3285301fe84643b00Stephen Hines};
351ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate <class Iter>
352ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestypename iterator_traits<Iter>::difference_type
353ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesdistance(Iter first, Iter last) { return first - last; }
354ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
355ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesclass Iter0 {
356ef8225444452a1486bd721f3285301fe84643b00Stephen Hinespublic:
357ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  Iter0() {}
358ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  Iter0(const Iter0 &) {}
359ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  Iter0 operator++() { return *this; }
360ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  Iter0 operator--() { return *this; }
361ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  bool operator<(Iter0 a) { return true; }
362ef8225444452a1486bd721f3285301fe84643b00Stephen Hines};
363ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesint operator-(Iter0 a, Iter0 b) { return 0; }
364ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesclass Iter1 {
365ef8225444452a1486bd721f3285301fe84643b00Stephen Hinespublic:
366ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  Iter1(float f = 0.0f, double d = 0.0) {}
367ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  Iter1(const Iter1 &) {}
368ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  Iter1 operator++() { return *this; }
369ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  Iter1 operator--() { return *this; }
370ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  bool operator<(Iter1 a) { return true; }
371ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  bool operator>=(Iter1 a) { return false; }
372ef8225444452a1486bd721f3285301fe84643b00Stephen Hines};
373ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesclass GoodIter {
374ef8225444452a1486bd721f3285301fe84643b00Stephen Hinespublic:
375ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  GoodIter() {}
376ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  GoodIter(const GoodIter &) {}
377ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  GoodIter(int fst, int snd) {}
378ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  GoodIter &operator=(const GoodIter &that) { return *this; }
379ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  GoodIter &operator=(const Iter0 &that) { return *this; }
380ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  GoodIter &operator+=(int x) { return *this; }
381ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  explicit GoodIter(void *) {}
382ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  GoodIter operator++() { return *this; }
383ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  GoodIter operator--() { return *this; }
384ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  bool operator!() { return true; }
385ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  bool operator<(GoodIter a) { return true; }
386ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  bool operator<=(GoodIter a) { return true; }
387ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  bool operator>=(GoodIter a) { return false; }
388ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  typedef int difference_type;
389ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  typedef std::random_access_iterator_tag iterator_category;
390ef8225444452a1486bd721f3285301fe84643b00Stephen Hines};
391ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesint operator-(GoodIter a, GoodIter b) { return 0; }
392ef8225444452a1486bd721f3285301fe84643b00Stephen HinesGoodIter operator-(GoodIter a) { return a; }
393ef8225444452a1486bd721f3285301fe84643b00Stephen HinesGoodIter operator-(GoodIter a, int v) { return GoodIter(); }
394ef8225444452a1486bd721f3285301fe84643b00Stephen HinesGoodIter operator+(GoodIter a, int v) { return GoodIter(); }
395ef8225444452a1486bd721f3285301fe84643b00Stephen HinesGoodIter operator-(int v, GoodIter a) { return GoodIter(); }
396ef8225444452a1486bd721f3285301fe84643b00Stephen HinesGoodIter operator+(int v, GoodIter a) { return GoodIter(); }
397ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
398ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesint test_with_random_access_iterator() {
399ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  GoodIter begin, end;
400ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  Iter0 begin0, end0;
401ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
402ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
403ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (GoodIter I = begin; I < end; ++I)
404ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++I;
405ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
406ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{variable must be of integer or random access iterator type}}
407ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
408ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (GoodIter &I = begin; I < end; ++I)
409ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++I;
410ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
411ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
412ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (GoodIter I = begin; I >= end; --I)
413ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++I;
414ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
415ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
416ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
417ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (GoodIter I(begin); I < end; ++I)
418ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++I;
419ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
420ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
421ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
422ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (GoodIter I(nullptr); I < end; ++I)
423ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++I;
424ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
425ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
426ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
427ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (GoodIter I(0); I < end; ++I)
428ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++I;
429ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
430ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
431ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
432ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (GoodIter I(1, 2); I < end; ++I)
433ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++I;
434ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
435ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
436ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (begin = GoodIter(0); begin < end; ++begin)
437ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++begin;
438ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
439ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
440ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (begin = begin0; begin < end; ++begin)
441ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++begin;
442ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
443ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}}
444ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
445ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (++begin; begin < end; ++begin)
446ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++begin;
447ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
448ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
449ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (begin = end; begin < end; ++begin)
450ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++begin;
451ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
452ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}}
453ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
454ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (GoodIter I = begin; I - I; ++I)
455ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++I;
456ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
457ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}}
458ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
459ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (GoodIter I = begin; begin < end; ++I)
460ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++I;
461ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
462ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}}
463ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
464ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (GoodIter I = begin; !I; ++I)
465ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++I;
466ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
467ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-note@+3 {{loop step is expected to be negative due to this condition}}
468ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
469ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
470ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (GoodIter I = begin; I >= end; I = I + 1)
471ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++I;
472ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
473ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
474ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (GoodIter I = begin; I >= end; I = I - 1)
475ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++I;
476ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
477ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'I'}}
478ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
479ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (GoodIter I = begin; I >= end; I = -I)
480ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++I;
481ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
482ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-note@+3 {{loop step is expected to be negative due to this condition}}
483ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
484ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
485ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (GoodIter I = begin; I >= end; I = 2 + I)
486ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++I;
487ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
488ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'I'}}
489ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
490ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (GoodIter I = begin; I >= end; I = 2 - I)
491ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++I;
492ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
493ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
494ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (Iter0 I = begin0; I < end0; ++I)
495ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++I;
496ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
497ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// Initializer is constructor without params.
498ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
499ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
500ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (Iter0 I; I < end0; ++I)
501ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++I;
502ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  Iter1 begin1, end1;
503ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
504ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
505ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (Iter1 I = begin1; I < end1; ++I)
506ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++I;
507ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
508ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-note@+3 {{loop step is expected to be negative due to this condition}}
509ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
510ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
511ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (Iter1 I = begin1; I >= end1; ++I)
512ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++I;
513ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
514ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// Initializer is constructor with all default params.
515ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
516ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
517ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (Iter1 I; I < end1; ++I) {
518ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
519ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  return 0;
520ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
521ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
522ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate <typename IT, int ST>
523ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesclass TC {
524ef8225444452a1486bd721f3285301fe84643b00Stephen Hinespublic:
525ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  int dotest_lt(IT begin, IT end) {
526ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
527ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-note@+3 {{loop step is expected to be positive due to this condition}}
528ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{increment expression must cause 'I' to increase on each iteration of OpenMP for loop}}
529ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
530ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    for (IT I = begin; I < end; I = I + ST) {
531ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      ++I;
532ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    }
533ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
534ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-note@+3 {{loop step is expected to be positive due to this condition}}
535ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{increment expression must cause 'I' to increase on each iteration of OpenMP for loop}}
536ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
537ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    for (IT I = begin; I <= end; I += ST) {
538ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      ++I;
539ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    }
540ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
541ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
542ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    for (IT I = begin; I < end; ++I) {
543ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      ++I;
544ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    }
545ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
546ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
547ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  static IT step() {
548ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    return IT(ST);
549ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
550ef8225444452a1486bd721f3285301fe84643b00Stephen Hines};
551ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate <typename IT, int ST = 0>
552ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesint dotest_gt(IT begin, IT end) {
553ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
554ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-note@+3 2 {{loop step is expected to be negative due to this condition}}
555ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
556ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
557ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (IT I = begin; I >= end; I = I + ST) {
558ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++I;
559ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
560ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
561ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-note@+3 2 {{loop step is expected to be negative due to this condition}}
562ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
563ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
564ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (IT I = begin; I >= end; I += ST) {
565ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++I;
566ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
567ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
568ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
569ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-note@+3 {{loop step is expected to be negative due to this condition}}
570ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
571ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
572ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (IT I = begin; I >= end; ++I) {
573ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++I;
574ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
575ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
576ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
577ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
578ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (IT I = begin; I < end; I += TC<int, ST>::step()) {
579ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++I;
580ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
581ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
582ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
583ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid test_with_template() {
584ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  GoodIter begin, end;
585ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  TC<GoodIter, 100> t1;
586ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  TC<GoodIter, -100> t2;
587ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  t1.dotest_lt(begin, end);
588ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  t2.dotest_lt(begin, end);         // expected-note {{in instantiation of member function 'TC<GoodIter, -100>::dotest_lt' requested here}}
589ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  dotest_gt(begin, end);            // expected-note {{in instantiation of function template specialization 'dotest_gt<GoodIter, 0>' requested here}}
590ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  dotest_gt<unsigned, -10>(0, 100); // expected-note {{in instantiation of function template specialization 'dotest_gt<unsigned int, -10>' requested here}}
591ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
592ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
593ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid test_loop_break() {
594ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  const int N = 100;
595ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  float a[N], b[N], c[N];
596ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
597ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
598ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int i = 0; i < 10; i++) {
599ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[i] = a[i] + b[i];
600ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    for (int j = 0; j < 10; ++j) {
601ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      if (a[i] > b[j])
602ef8225444452a1486bd721f3285301fe84643b00Stephen Hines        break; // OK in nested loop
603ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    }
604ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    switch (i) {
605ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    case 1:
606ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      b[i]++;
607ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      break;
608ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    default:
609ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      break;
610ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    }
611ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    if (c[i] > 10)
612ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      break; // expected-error {{'break' statement cannot be used in OpenMP for loop}}
613ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
614ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    if (c[i] > 11)
615ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      break; // expected-error {{'break' statement cannot be used in OpenMP for loop}}
616ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
617ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
618ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
619ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
620ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int i = 0; i < 10; i++) {
621ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    for (int j = 0; j < 10; j++) {
622ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      c[i] = a[i] + b[i];
623ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      if (c[i] > 10) {
624ef8225444452a1486bd721f3285301fe84643b00Stephen Hines        if (c[i] < 20) {
625ef8225444452a1486bd721f3285301fe84643b00Stephen Hines          break; // OK
626ef8225444452a1486bd721f3285301fe84643b00Stephen Hines        }
627ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      }
628ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    }
629ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
630ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
631ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
632ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid test_loop_eh() {
633ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  const int N = 100;
634ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  float a[N], b[N], c[N];
635ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
636ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
637ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int i = 0; i < 10; i++) {
638ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    c[i] = a[i] + b[i];
639ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    try {
640ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      for (int j = 0; j < 10; ++j) {
641ef8225444452a1486bd721f3285301fe84643b00Stephen Hines        if (a[i] > b[j])
642ef8225444452a1486bd721f3285301fe84643b00Stephen Hines          throw a[i];
643ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      }
644ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      throw a[i];
645ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    } catch (float f) {
646ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      if (f > 0.1)
647ef8225444452a1486bd721f3285301fe84643b00Stephen Hines        throw a[i];
648ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      return; // expected-error {{cannot return from OpenMP region}}
649ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    }
650ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    switch (i) {
651ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    case 1:
652ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      b[i]++;
653ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      break;
654ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    default:
655ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      break;
656ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    }
657ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    for (int j = 0; j < 10; j++) {
658ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      if (c[i] > 10)
659ef8225444452a1486bd721f3285301fe84643b00Stephen Hines        throw c[i];
660ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    }
661ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
662ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if (c[9] > 10)
663ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    throw c[9]; // OK
664ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
665ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
666ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for
667ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int i = 0; i < 10; ++i) {
668ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    struct S {
669ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      void g() { throw 0; }
670ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    };
671ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
672ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
673ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
674ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid test_loop_firstprivate_lastprivate() {
675ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  S s(4);
676ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
677ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp for lastprivate(s) firstprivate(s)
678ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int i = 0; i < 16; ++i)
679ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ;
680ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
681