1 | // RUN: %clang_cc1 -fsyntax-only -fopenmp -triple x86_64-unknown-unknown -verify %s |
2 | |
3 | // RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -triple x86_64-unknown-unknown -verify %s |
4 | |
5 | // expected-error@+1 {{unexpected OpenMP directive '#pragma omp taskloop simd'}} |
6 | #pragma omp taskloop simd |
7 | |
8 | // expected-error@+1 {{unexpected OpenMP directive '#pragma omp taskloop simd'}} |
9 | #pragma omp taskloop simd foo |
10 | |
11 | void test_no_clause() { |
12 | int i; |
13 | #pragma omp taskloop simd |
14 | for (i = 0; i < 16; ++i) |
15 | ; |
16 | |
17 | // expected-error@+2 {{statement after '#pragma omp taskloop simd' must be a for loop}} |
18 | #pragma omp taskloop simd |
19 | ++i; |
20 | } |
21 | |
22 | void test_branch_protected_scope() { |
23 | int i = 0; |
24 | L1: |
25 | ++i; |
26 | |
27 | int x[24]; |
28 | |
29 | #pragma omp parallel |
30 | #pragma omp taskloop simd |
31 | for (i = 0; i < 16; ++i) { |
32 | if (i == 5) |
33 | goto L1; // expected-error {{use of undeclared label 'L1'}} |
34 | else if (i == 6) |
35 | return; // expected-error {{cannot return from OpenMP region}} |
36 | else if (i == 7) |
37 | goto L2; |
38 | else if (i == 8) { |
39 | L2: |
40 | x[i]++; |
41 | } |
42 | } |
43 | |
44 | if (x[0] == 0) |
45 | goto L2; // expected-error {{use of undeclared label 'L2'}} |
46 | else if (x[1] == 1) |
47 | goto L1; |
48 | } |
49 | |
50 | void test_invalid_clause() { |
51 | int i; |
52 | #pragma omp parallel |
53 | // expected-warning@+1 {{extra tokens at the end of '#pragma omp taskloop simd' are ignored}} |
54 | #pragma omp taskloop simd foo bar |
55 | for (i = 0; i < 16; ++i) |
56 | ; |
57 | // expected-error@+1 {{directive '#pragma omp taskloop simd' cannot contain more than one 'nogroup' clause}} |
58 | #pragma omp taskloop simd nogroup nogroup |
59 | for (i = 0; i < 16; ++i) |
60 | ; |
61 | } |
62 | |
63 | void test_non_identifiers() { |
64 | int i, x; |
65 | |
66 | #pragma omp parallel |
67 | // expected-warning@+1 {{extra tokens at the end of '#pragma omp taskloop simd' are ignored}} |
68 | #pragma omp taskloop simd; |
69 | for (i = 0; i < 16; ++i) |
70 | ; |
71 | // expected-warning@+2 {{extra tokens at the end of '#pragma omp taskloop simd' are ignored}} |
72 | #pragma omp parallel |
73 | #pragma omp taskloop simd linear(x); |
74 | for (i = 0; i < 16; ++i) |
75 | ; |
76 | |
77 | #pragma omp parallel |
78 | // expected-warning@+1 {{extra tokens at the end of '#pragma omp taskloop simd' are ignored}} |
79 | #pragma omp taskloop simd private(x); |
80 | for (i = 0; i < 16; ++i) |
81 | ; |
82 | |
83 | #pragma omp parallel |
84 | // expected-warning@+1 {{extra tokens at the end of '#pragma omp taskloop simd' are ignored}} |
85 | #pragma omp taskloop simd, private(x); |
86 | for (i = 0; i < 16; ++i) |
87 | ; |
88 | } |
89 | |
90 | extern int foo(); |
91 | |
92 | void test_collapse() { |
93 | int i; |
94 | #pragma omp parallel |
95 | // expected-error@+1 {{expected '('}} |
96 | #pragma omp taskloop simd collapse |
97 | for (i = 0; i < 16; ++i) |
98 | ; |
99 | #pragma omp parallel |
100 | // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} |
101 | #pragma omp taskloop simd collapse( |
102 | for (i = 0; i < 16; ++i) |
103 | ; |
104 | #pragma omp parallel |
105 | // expected-error@+1 {{expected expression}} |
106 | #pragma omp taskloop simd collapse() |
107 | for (i = 0; i < 16; ++i) |
108 | ; |
109 | #pragma omp parallel |
110 | // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} |
111 | #pragma omp taskloop simd collapse(, |
112 | for (i = 0; i < 16; ++i) |
113 | ; |
114 | #pragma omp parallel |
115 | // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} |
116 | #pragma omp taskloop simd collapse(, ) |
117 | for (i = 0; i < 16; ++i) |
118 | ; |
119 | #pragma omp parallel |
120 | // expected-warning@+2 {{extra tokens at the end of '#pragma omp taskloop simd' are ignored}} |
121 | // expected-error@+1 {{expected '('}} |
122 | #pragma omp taskloop simd collapse 4) |
123 | for (i = 0; i < 16; ++i) |
124 | ; |
125 | #pragma omp parallel |
126 | // expected-error@+2 {{expected ')'}} |
127 | // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} |
128 | #pragma omp taskloop simd collapse(4 |
129 | for (i = 0; i < 16; ++i) |
130 | ; // expected-error {{expected 4 for loops after '#pragma omp taskloop simd', but found only 1}} |
131 | #pragma omp parallel |
132 | // expected-error@+2 {{expected ')'}} |
133 | // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} |
134 | #pragma omp taskloop simd collapse(4, |
135 | for (i = 0; i < 16; ++i) |
136 | ; // expected-error {{expected 4 for loops after '#pragma omp taskloop simd', but found only 1}} |
137 | #pragma omp parallel |
138 | // expected-error@+2 {{expected ')'}} |
139 | // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} |
140 | #pragma omp taskloop simd collapse(4, ) |
141 | for (i = 0; i < 16; ++i) |
142 | ; // expected-error {{expected 4 for loops after '#pragma omp taskloop simd', but found only 1}} |
143 | #pragma omp parallel |
144 | // expected-note@+1 {{as specified in 'collapse' clause}} |
145 | #pragma omp taskloop simd collapse(4) |
146 | for (i = 0; i < 16; ++i) |
147 | ; // expected-error {{expected 4 for loops after '#pragma omp taskloop simd', but found only 1}} |
148 | #pragma omp parallel |
149 | // expected-error@+2 {{expected ')'}} |
150 | // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} |
151 | #pragma omp taskloop simd collapse(4 4) |
152 | for (i = 0; i < 16; ++i) |
153 | ; // expected-error {{expected 4 for loops after '#pragma omp taskloop simd', but found only 1}} |
154 | #pragma omp parallel |
155 | // expected-error@+2 {{expected ')'}} |
156 | // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} |
157 | #pragma omp taskloop simd collapse(4, , 4) |
158 | for (i = 0; i < 16; ++i) |
159 | ; // expected-error {{expected 4 for loops after '#pragma omp taskloop simd', but found only 1}} |
160 | #pragma omp parallel |
161 | #pragma omp taskloop simd collapse(4) |
162 | for (int i1 = 0; i1 < 16; ++i1) |
163 | for (int i2 = 0; i2 < 16; ++i2) |
164 | for (int i3 = 0; i3 < 16; ++i3) |
165 | for (int i4 = 0; i4 < 16; ++i4) |
166 | foo(); |
167 | #pragma omp parallel |
168 | // expected-error@+2 {{expected ')'}} |
169 | // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} |
170 | #pragma omp taskloop simd collapse(4, 8) |
171 | for (i = 0; i < 16; ++i) |
172 | ; // expected-error {{expected 4 for loops after '#pragma omp taskloop simd', but found only 1}} |
173 | #pragma omp parallel |
174 | // expected-error@+1 {{expression is not an integer constant expression}} |
175 | #pragma omp taskloop simd collapse(2.5) |
176 | for (i = 0; i < 16; ++i) |
177 | ; |
178 | #pragma omp parallel |
179 | // expected-error@+1 {{expression is not an integer constant expression}} |
180 | #pragma omp taskloop simd collapse(foo()) |
181 | for (i = 0; i < 16; ++i) |
182 | ; |
183 | #pragma omp parallel |
184 | // expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}} |
185 | #pragma omp taskloop simd collapse(-5) |
186 | for (i = 0; i < 16; ++i) |
187 | ; |
188 | #pragma omp parallel |
189 | // expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}} |
190 | #pragma omp taskloop simd collapse(0) |
191 | for (i = 0; i < 16; ++i) |
192 | ; |
193 | #pragma omp parallel |
194 | // expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}} |
195 | #pragma omp taskloop simd collapse(5 - 5) |
196 | for (i = 0; i < 16; ++i) |
197 | ; |
198 | } |
199 | |
200 | void test_private() { |
201 | int i; |
202 | #pragma omp parallel |
203 | // expected-error@+2 {{expected expression}} |
204 | // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} |
205 | #pragma omp taskloop simd private( |
206 | for (i = 0; i < 16; ++i) |
207 | ; |
208 | #pragma omp parallel |
209 | // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} |
210 | // expected-error@+1 2 {{expected expression}} |
211 | #pragma omp taskloop simd private(, |
212 | for (i = 0; i < 16; ++i) |
213 | ; |
214 | #pragma omp parallel |
215 | // expected-error@+1 2 {{expected expression}} |
216 | #pragma omp taskloop simd private(, ) |
217 | for (i = 0; i < 16; ++i) |
218 | ; |
219 | #pragma omp parallel |
220 | // expected-error@+1 {{expected expression}} |
221 | #pragma omp taskloop simd private() |
222 | for (i = 0; i < 16; ++i) |
223 | ; |
224 | #pragma omp parallel |
225 | // expected-error@+1 {{expected expression}} |
226 | #pragma omp taskloop simd private(int) |
227 | for (i = 0; i < 16; ++i) |
228 | ; |
229 | #pragma omp parallel |
230 | // expected-error@+1 {{expected variable name}} |
231 | #pragma omp taskloop simd private(0) |
232 | for (i = 0; i < 16; ++i) |
233 | ; |
234 | |
235 | int x, y, z; |
236 | #pragma omp parallel |
237 | #pragma omp taskloop simd private(x) |
238 | for (i = 0; i < 16; ++i) |
239 | ; |
240 | #pragma omp parallel |
241 | #pragma omp taskloop simd private(x, y) |
242 | for (i = 0; i < 16; ++i) |
243 | ; |
244 | #pragma omp parallel |
245 | #pragma omp taskloop simd private(x, y, z) |
246 | for (i = 0; i < 16; ++i) { |
247 | x = y * i + z; |
248 | } |
249 | } |
250 | |
251 | void test_lastprivate() { |
252 | int i; |
253 | #pragma omp parallel |
254 | // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} |
255 | // expected-error@+1 {{expected expression}} |
256 | #pragma omp taskloop simd lastprivate( |
257 | for (i = 0; i < 16; ++i) |
258 | ; |
259 | |
260 | #pragma omp parallel |
261 | // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} |
262 | // expected-error@+1 2 {{expected expression}} |
263 | #pragma omp taskloop simd lastprivate(, |
264 | for (i = 0; i < 16; ++i) |
265 | ; |
266 | #pragma omp parallel |
267 | // expected-error@+1 2 {{expected expression}} |
268 | #pragma omp taskloop simd lastprivate(, ) |
269 | for (i = 0; i < 16; ++i) |
270 | ; |
271 | #pragma omp parallel |
272 | // expected-error@+1 {{expected expression}} |
273 | #pragma omp taskloop simd lastprivate() |
274 | for (i = 0; i < 16; ++i) |
275 | ; |
276 | #pragma omp parallel |
277 | // expected-error@+1 {{expected expression}} |
278 | #pragma omp taskloop simd lastprivate(int) |
279 | for (i = 0; i < 16; ++i) |
280 | ; |
281 | #pragma omp parallel |
282 | // expected-error@+1 {{expected variable name}} |
283 | #pragma omp taskloop simd lastprivate(0) |
284 | for (i = 0; i < 16; ++i) |
285 | ; |
286 | |
287 | int x, y, z; |
288 | #pragma omp parallel |
289 | #pragma omp taskloop simd lastprivate(x) |
290 | for (i = 0; i < 16; ++i) |
291 | ; |
292 | #pragma omp parallel |
293 | #pragma omp taskloop simd lastprivate(x, y) |
294 | for (i = 0; i < 16; ++i) |
295 | ; |
296 | #pragma omp parallel |
297 | #pragma omp taskloop simd lastprivate(x, y, z) |
298 | for (i = 0; i < 16; ++i) |
299 | ; |
300 | } |
301 | |
302 | void test_firstprivate() { |
303 | int i; |
304 | #pragma omp parallel |
305 | // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} |
306 | // expected-error@+1 {{expected expression}} |
307 | #pragma omp taskloop simd firstprivate( |
308 | for (i = 0; i < 16; ++i) |
309 | ; |
310 | |
311 | #pragma omp parallel |
312 | // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} |
313 | // expected-error@+1 2 {{expected expression}} |
314 | #pragma omp taskloop simd firstprivate(, |
315 | for (i = 0; i < 16; ++i) |
316 | ; |
317 | #pragma omp parallel |
318 | // expected-error@+1 2 {{expected expression}} |
319 | #pragma omp taskloop simd firstprivate(, ) |
320 | for (i = 0; i < 16; ++i) |
321 | ; |
322 | #pragma omp parallel |
323 | // expected-error@+1 {{expected expression}} |
324 | #pragma omp taskloop simd firstprivate() |
325 | for (i = 0; i < 16; ++i) |
326 | ; |
327 | #pragma omp parallel |
328 | // expected-error@+1 {{expected expression}} |
329 | #pragma omp taskloop simd firstprivate(int) |
330 | for (i = 0; i < 16; ++i) |
331 | ; |
332 | #pragma omp parallel |
333 | // expected-error@+1 {{expected variable name}} |
334 | #pragma omp taskloop simd firstprivate(0) |
335 | for (i = 0; i < 16; ++i) |
336 | ; |
337 | |
338 | int x, y, z; |
339 | #pragma omp parallel |
340 | #pragma omp taskloop simd lastprivate(x) firstprivate(x) |
341 | for (i = 0; i < 16; ++i) |
342 | ; |
343 | #pragma omp parallel |
344 | #pragma omp taskloop simd lastprivate(x, y) firstprivate(x, y) |
345 | for (i = 0; i < 16; ++i) |
346 | ; |
347 | #pragma omp parallel |
348 | #pragma omp taskloop simd lastprivate(x, y, z) firstprivate(x, y, z) |
349 | for (i = 0; i < 16; ++i) |
350 | ; |
351 | // expected-error@+1 {{the value of 'simdlen' parameter must be less than or equal to the value of the 'safelen' parameter}} |
352 | #pragma omp taskloop simd simdlen(64) safelen(8) |
353 | for (i = 0; i < 16; ++i) |
354 | ; |
355 | } |
356 | |
357 | void test_loop_messages() { |
358 | float a[100], b[100], c[100]; |
359 | #pragma omp parallel |
360 | // expected-error@+2 {{variable must be of integer or pointer type}} |
361 | #pragma omp taskloop simd |
362 | for (float fi = 0; fi < 10.0; fi++) { |
363 | c[(int)fi] = a[(int)fi] + b[(int)fi]; |
364 | } |
365 | #pragma omp parallel |
366 | // expected-error@+2 {{variable must be of integer or pointer type}} |
367 | #pragma omp taskloop simd |
368 | for (double fi = 0; fi < 10.0; fi++) { |
369 | c[(int)fi] = a[(int)fi] + b[(int)fi]; |
370 | } |
371 | |
372 | // expected-warning@+2 {{OpenMP loop iteration variable cannot have more than 64 bits size and will be narrowed}} |
373 | #pragma omp taskloop simd |
374 | for (__int128 ii = 0; ii < 10; ii++) { |
375 | c[ii] = a[ii] + b[ii]; |
376 | } |
377 | } |
378 | |
379 | |