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