1 // RUN: %clang_cc1 -fsyntax-only -fopenmp -triple x86_64-unknown-unknown -verify %s
3 // RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -triple x86_64-unknown-unknown -verify %s
5 // expected-error@+1 {{unexpected OpenMP directive '#pragma omp for'}}
8 // expected-error@+1 {{unexpected OpenMP directive '#pragma omp for'}}
11 void test_no_clause() {
14 for (i = 0; i < 16; ++i)
17 // expected-error@+2 {{statement after '#pragma omp for' must be a for loop}}
22 void test_branch_protected_scope() {
31 for (i = 0; i < 16; ++i) {
33 goto L1; // expected-error {{use of undeclared label 'L1'}}
35 return; // expected-error {{cannot return from OpenMP region}}
45 goto L2; // expected-error {{use of undeclared label 'L2'}}
50 void test_invalid_clause() {
53 // expected-warning@+1 {{extra tokens at the end of '#pragma omp for' are ignored}}
54 #pragma omp for foo bar
55 for (i = 0; i < 16; ++i)
57 // At one time, this failed an assert.
58 // expected-error@+1 {{unexpected OpenMP clause 'num_teams' in directive '#pragma omp for'}}
59 #pragma omp for num_teams(3)
60 for (i = 0; i < 16; ++i)
62 // At one time, this error was reported twice.
63 // expected-error@+1 {{unexpected OpenMP clause 'uniform' in directive '#pragma omp for'}}
64 #pragma omp for uniform
65 for (i = 0; i < 16; ++i)
67 // expected-error@+1 {{unexpected OpenMP clause 'if' in directive '#pragma omp for'}}
69 for (i = 0; i < 16; ++i)
73 void test_non_identifiers() {
77 // expected-warning@+1 {{extra tokens at the end of '#pragma omp for' are ignored}}
79 for (i = 0; i < 16; ++i)
81 // expected-warning@+2 {{extra tokens at the end of '#pragma omp for' are ignored}}
83 #pragma omp for linear(x);
84 for (i = 0; i < 16; ++i)
88 // expected-warning@+1 {{extra tokens at the end of '#pragma omp for' are ignored}}
89 #pragma omp for private(x);
90 for (i = 0; i < 16; ++i)
94 // expected-warning@+1 {{extra tokens at the end of '#pragma omp for' are ignored}}
95 #pragma omp for, private(x);
96 for (i = 0; i < 16; ++i)
102 void test_collapse() {
105 // expected-error@+1 {{expected '('}}
106 #pragma omp for collapse
107 for (i = 0; i < 16; ++i)
110 // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
111 #pragma omp for collapse(
112 for (i = 0; i < 16; ++i)
115 // expected-error@+1 {{expected expression}}
116 #pragma omp for collapse()
117 for (i = 0; i < 16; ++i)
120 // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
121 #pragma omp for collapse(,
122 for (i = 0; i < 16; ++i)
125 // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
126 #pragma omp for collapse(, )
127 for (i = 0; i < 16; ++i)
130 // expected-warning@+2 {{extra tokens at the end of '#pragma omp for' are ignored}}
131 // expected-error@+1 {{expected '('}}
132 #pragma omp for collapse 4)
133 for (i = 0; i < 16; ++i)
136 // expected-error@+2 {{expected ')'}}
137 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
138 #pragma omp for collapse(4
139 for (i = 0; i < 16; ++i)
140 ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
142 // expected-error@+2 {{expected ')'}}
143 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
144 #pragma omp for collapse(4,
145 for (i = 0; i < 16; ++i)
146 ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
148 // expected-error@+2 {{expected ')'}}
149 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
150 #pragma omp for collapse(4, )
151 for (i = 0; i < 16; ++i)
152 ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
154 // expected-note@+1 {{as specified in 'collapse' clause}}
155 #pragma omp for collapse(4)
156 for (i = 0; i < 16; ++i)
157 ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
159 // expected-error@+2 {{expected ')'}}
160 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
161 #pragma omp for collapse(4 4)
162 for (i = 0; i < 16; ++i)
163 ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
165 // expected-error@+2 {{expected ')'}}
166 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
167 #pragma omp for collapse(4, , 4)
168 for (i = 0; i < 16; ++i)
169 ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
171 #pragma omp for collapse(4)
172 for (int i1 = 0; i1 < 16; ++i1)
173 for (int i2 = 0; i2 < 16; ++i2)
174 for (int i3 = 0; i3 < 16; ++i3)
175 for (int i4 = 0; i4 < 16; ++i4)
178 // expected-error@+2 {{expected ')'}}
179 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
180 #pragma omp for collapse(4, 8)
181 for (i = 0; i < 16; ++i)
182 ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
184 // expected-error@+1 {{expression is not an integer constant expression}}
185 #pragma omp for collapse(2.5)
186 for (i = 0; i < 16; ++i)
189 // expected-error@+1 {{expression is not an integer constant expression}}
190 #pragma omp for collapse(foo())
191 for (i = 0; i < 16; ++i)
194 // expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}}
195 #pragma omp for collapse(-5)
196 for (i = 0; i < 16; ++i)
199 // expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}}
200 #pragma omp for collapse(0)
201 for (i = 0; i < 16; ++i)
204 // expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}}
205 #pragma omp for collapse(5 - 5)
206 for (i = 0; i < 16; ++i)
209 #pragma omp for collapse(2)
210 for (i = 0; i < 16; ++i)
211 // expected-note@+1 {{variable with automatic storage duration is predetermined as private; perhaps you forget to enclose 'omp for' directive into a parallel or another task region?}}
212 for (int j = 0; j < 16; ++j)
213 // expected-error@+2 {{reduction variable must be shared}}
214 // expected-error@+1 {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
215 #pragma omp for reduction(+ : i, j)
216 for (int k = 0; k < 16; ++k)
220 void test_private() {
223 // expected-error@+2 {{expected expression}}
224 // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
225 #pragma omp for private(
226 for (i = 0; i < 16; ++i)
229 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
230 // expected-error@+1 2 {{expected expression}}
231 #pragma omp for private(,
232 for (i = 0; i < 16; ++i)
235 // expected-error@+1 2 {{expected expression}}
236 #pragma omp for private(, )
237 for (i = 0; i < 16; ++i)
240 // expected-error@+1 {{expected expression}}
241 #pragma omp for private()
242 for (i = 0; i < 16; ++i)
245 // expected-error@+1 {{expected expression}}
246 #pragma omp for private(int)
247 for (i = 0; i < 16; ++i)
250 // expected-error@+1 {{expected variable name}}
251 #pragma omp for private(0)
252 for (i = 0; i < 16; ++i)
257 #pragma omp for private(x)
258 for (i = 0; i < 16; ++i)
261 #pragma omp for private(x, y)
262 for (i = 0; i < 16; ++i)
265 #pragma omp for private(x, y, z)
266 for (i = 0; i < 16; ++i) {
271 void test_lastprivate() {
274 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
275 // expected-error@+1 {{expected expression}}
276 #pragma omp for lastprivate(
277 for (i = 0; i < 16; ++i)
281 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
282 // expected-error@+1 2 {{expected expression}}
283 #pragma omp for lastprivate(,
284 for (i = 0; i < 16; ++i)
287 // expected-error@+1 2 {{expected expression}}
288 #pragma omp for lastprivate(, )
289 for (i = 0; i < 16; ++i)
292 // expected-error@+1 {{expected expression}}
293 #pragma omp for lastprivate()
294 for (i = 0; i < 16; ++i)
297 // expected-error@+1 {{expected expression}}
298 #pragma omp for lastprivate(int)
299 for (i = 0; i < 16; ++i)
302 // expected-error@+1 {{expected variable name}}
303 #pragma omp for lastprivate(0)
304 for (i = 0; i < 16; ++i)
309 #pragma omp for lastprivate(x)
310 for (i = 0; i < 16; ++i)
313 #pragma omp for lastprivate(x, y)
314 for (i = 0; i < 16; ++i)
317 #pragma omp for lastprivate(x, y, z)
318 for (i = 0; i < 16; ++i)
322 void test_firstprivate() {
325 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
326 // expected-error@+1 {{expected expression}}
327 #pragma omp for firstprivate(
328 for (i = 0; i < 16; ++i)
332 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
333 // expected-error@+1 2 {{expected expression}}
334 #pragma omp for firstprivate(,
335 for (i = 0; i < 16; ++i)
338 // expected-error@+1 2 {{expected expression}}
339 #pragma omp for firstprivate(, )
340 for (i = 0; i < 16; ++i)
343 // expected-error@+1 {{expected expression}}
344 #pragma omp for firstprivate()
345 for (i = 0; i < 16; ++i)
348 // expected-error@+1 {{expected expression}}
349 #pragma omp for firstprivate(int)
350 for (i = 0; i < 16; ++i)
353 // expected-error@+1 {{expected variable name}}
354 #pragma omp for firstprivate(0)
355 for (i = 0; i < 16; ++i)
360 #pragma omp for lastprivate(x) firstprivate(x)
361 for (i = 0; i < 16; ++i)
364 #pragma omp for lastprivate(x, y) firstprivate(x, y)
365 for (i = 0; i < 16; ++i)
368 #pragma omp for lastprivate(x, y, z) firstprivate(x, y, z)
369 for (i = 0; i < 16; ++i)
373 void test_loop_messages() {
374 float a[100], b[100], c[100];
376 // expected-error@+2 {{variable must be of integer or pointer type}}
378 for (float fi = 0; fi < 10.0; fi++) {
379 c[(int)fi] = a[(int)fi] + b[(int)fi];
382 // expected-error@+2 {{variable must be of integer or pointer type}}
384 for (double fi = 0; fi < 10.0; fi++) {
385 c[(int)fi] = a[(int)fi] + b[(int)fi];
388 // expected-warning@+2 {{OpenMP loop iteration variable cannot have more than 64 bits size and will be narrowed}}
390 for (__int128 ii = 0; ii < 10; ii++) {
391 c[ii] = a[ii] + b[ii];