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