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