Clang Project

clang_source_code/test/OpenMP/for_misc_messages.c
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 for'}}
6#pragma omp for
7
8// expected-error@+1 {{unexpected OpenMP directive '#pragma omp for'}}
9#pragma omp for foo
10
11void test_no_clause() {
12  int i;
13#pragma omp for
14  for (i = 0; i < 16; ++i)
15    ;
16
17// expected-error@+2 {{statement after '#pragma omp for' must be a for loop}}
18#pragma omp for
19  ++i;
20}
21
22void test_branch_protected_scope() {
23  int i = 0;
24L1:
25  ++i;
26
27  int x[24];
28
29#pragma omp parallel
30#pragma omp for
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
50void test_invalid_clause() {
51  int i;
52#pragma omp parallel
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)
56    ;
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)
61    ;
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)
66    ;
67// expected-error@+1 {{unexpected OpenMP clause 'if' in directive '#pragma omp for'}}
68#pragma omp for if(0)
69  for (i = 0; i < 16; ++i)
70    ;
71}
72
73void test_non_identifiers() {
74  int i, x;
75
76#pragma omp parallel
77// expected-warning@+1 {{extra tokens at the end of '#pragma omp for' are ignored}}
78#pragma omp for;
79  for (i = 0; i < 16; ++i)
80    ;
81// expected-warning@+2 {{extra tokens at the end of '#pragma omp for' are ignored}}
82#pragma omp parallel
83#pragma omp for linear(x);
84  for (i = 0; i < 16; ++i)
85    ;
86
87#pragma omp parallel
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)
91    ;
92
93#pragma omp parallel
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)
97    ;
98}
99
100extern int foo();
101
102void test_collapse() {
103  int i;
104#pragma omp parallel
105// expected-error@+1 {{expected '('}}
106#pragma omp for 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 for collapse(
112  for (i = 0; i < 16; ++i)
113    ;
114#pragma omp parallel
115// expected-error@+1 {{expected expression}}
116#pragma omp for collapse()
117  for (i = 0; i < 16; ++i)
118    ;
119#pragma omp parallel
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)
123    ;
124#pragma omp parallel
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)
128    ;
129#pragma omp parallel
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)
134    ;
135#pragma omp parallel
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}}
141#pragma omp parallel
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}}
147#pragma omp parallel
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}}
153#pragma omp parallel
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}}
158#pragma omp parallel
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}}
164#pragma omp parallel
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}}
170#pragma omp parallel
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)
176          foo();
177#pragma omp parallel
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}}
183#pragma omp parallel
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)
187    ;
188#pragma omp parallel
189// expected-error@+1 {{expression is not an integer constant expression}}
190#pragma omp for collapse(foo())
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 for collapse(-5)
196  for (i = 0; i < 16; ++i)
197    ;
198#pragma omp parallel
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)
202    ;
203#pragma omp parallel
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)
207    ;
208#pragma omp parallel
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)
217        i += j;
218}
219
220void test_private() {
221  int i;
222#pragma omp parallel
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)
227    ;
228#pragma omp parallel
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)
233    ;
234#pragma omp parallel
235// expected-error@+1 2 {{expected expression}}
236#pragma omp for private(, )
237  for (i = 0; i < 16; ++i)
238    ;
239#pragma omp parallel
240// expected-error@+1 {{expected expression}}
241#pragma omp for private()
242  for (i = 0; i < 16; ++i)
243    ;
244#pragma omp parallel
245// expected-error@+1 {{expected expression}}
246#pragma omp for private(int)
247  for (i = 0; i < 16; ++i)
248    ;
249#pragma omp parallel
250// expected-error@+1 {{expected variable name}}
251#pragma omp for private(0)
252  for (i = 0; i < 16; ++i)
253    ;
254
255  int x, y, z;
256#pragma omp parallel
257#pragma omp for private(x)
258  for (i = 0; i < 16; ++i)
259    ;
260#pragma omp parallel
261#pragma omp for private(x, y)
262  for (i = 0; i < 16; ++i)
263    ;
264#pragma omp parallel
265#pragma omp for private(x, y, z)
266  for (i = 0; i < 16; ++i) {
267    x = y * i + z;
268  }
269}
270
271void test_lastprivate() {
272  int i;
273#pragma omp parallel
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)
278    ;
279
280#pragma omp parallel
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)
285    ;
286#pragma omp parallel
287// expected-error@+1 2 {{expected expression}}
288#pragma omp for lastprivate(, )
289  for (i = 0; i < 16; ++i)
290    ;
291#pragma omp parallel
292// expected-error@+1 {{expected expression}}
293#pragma omp for lastprivate()
294  for (i = 0; i < 16; ++i)
295    ;
296#pragma omp parallel
297// expected-error@+1 {{expected expression}}
298#pragma omp for lastprivate(int)
299  for (i = 0; i < 16; ++i)
300    ;
301#pragma omp parallel
302// expected-error@+1 {{expected variable name}}
303#pragma omp for lastprivate(0)
304  for (i = 0; i < 16; ++i)
305    ;
306
307  int x, y, z;
308#pragma omp parallel
309#pragma omp for lastprivate(x)
310  for (i = 0; i < 16; ++i)
311    ;
312#pragma omp parallel
313#pragma omp for lastprivate(x, y)
314  for (i = 0; i < 16; ++i)
315    ;
316#pragma omp parallel
317#pragma omp for lastprivate(x, y, z)
318  for (i = 0; i < 16; ++i)
319    ;
320}
321
322void test_firstprivate() {
323  int i;
324#pragma omp parallel
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)
329    ;
330
331#pragma omp parallel
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)
336    ;
337#pragma omp parallel
338// expected-error@+1 2 {{expected expression}}
339#pragma omp for firstprivate(, )
340  for (i = 0; i < 16; ++i)
341    ;
342#pragma omp parallel
343// expected-error@+1 {{expected expression}}
344#pragma omp for firstprivate()
345  for (i = 0; i < 16; ++i)
346    ;
347#pragma omp parallel
348// expected-error@+1 {{expected expression}}
349#pragma omp for firstprivate(int)
350  for (i = 0; i < 16; ++i)
351    ;
352#pragma omp parallel
353// expected-error@+1 {{expected variable name}}
354#pragma omp for firstprivate(0)
355  for (i = 0; i < 16; ++i)
356    ;
357
358  int x, y, z;
359#pragma omp parallel
360#pragma omp for lastprivate(x) firstprivate(x)
361  for (i = 0; i < 16; ++i)
362    ;
363#pragma omp parallel
364#pragma omp for lastprivate(x, y) firstprivate(x, y)
365  for (i = 0; i < 16; ++i)
366    ;
367#pragma omp parallel
368#pragma omp for lastprivate(x, y, z) firstprivate(x, y, z)
369  for (i = 0; i < 16; ++i)
370    ;
371}
372
373void test_loop_messages() {
374  float a[100], b[100], c[100];
375#pragma omp parallel
376// expected-error@+2 {{variable must be of integer or pointer type}}
377#pragma omp for
378  for (float fi = 0; fi < 10.0; fi++) {
379    c[(int)fi] = a[(int)fi] + b[(int)fi];
380  }
381#pragma omp parallel
382// expected-error@+2 {{variable must be of integer or pointer type}}
383#pragma omp for
384  for (double fi = 0; fi < 10.0; fi++) {
385    c[(int)fi] = a[(int)fi] + b[(int)fi];
386  }
387
388  // expected-warning@+2 {{OpenMP loop iteration variable cannot have more than 64 bits size and will be narrowed}}
389  #pragma omp for
390  for (__int128 ii = 0; ii < 10; ii++) {
391    c[ii] = a[ii] + b[ii];
392  }
393}
394
395