1 // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -o - %s -Wuninitialized
2 // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -std=c++98 -o - %s -Wuninitialized
3 // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -std=c++11 -o - %s -Wuninitialized
4 // RUN: %clang_cc1 -verify=expected,omp52 -fopenmp -fopenmp-version=52 -ferror-limit 100 -o - %s -Wuninitialized
5
6 // RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 -o - %s -Wuninitialized
7 // RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 -std=c++98 -o - %s -Wuninitialized
8 // RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 -std=c++11 -o - %s -Wuninitialized
9
xxx(int argc)10 void xxx(int argc) {
11 int x; // expected-note {{initialize the variable 'x' to silence this warning}}
12 #pragma omp for ordered
13 for (int i = 0; i < 10; ++i) {
14 #pragma omp ordered
15 argc = x; // expected-warning {{variable 'x' is uninitialized when used here}}
16 }
17 }
18
19 int foo();
20 #if __cplusplus >= 201103L
21 // expected-note@-2 {{declared here}}
22 #endif
23
24 template <class T>
foo()25 T foo() {
26 T k;
27 #pragma omp for ordered
28 for (int i = 0; i < 10; ++i) {
29 L1:
30 foo();
31 #pragma omp ordered
32 {
33 foo();
34 goto L1; // expected-error {{use of undeclared label 'L1'}}
35 }
36 }
37 #pragma omp for ordered
38 for (int i = 0; i < 10; ++i) {
39 foo();
40 goto L2; // expected-error {{use of undeclared label 'L2'}}
41 #pragma omp ordered
42 {
43 L2:
44 foo();
45 }
46 }
47 #pragma omp for ordered
48 for (int i = 0; i < 10; ++i) {
49 #pragma omp ordered threads threads // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'threads' clause}}
50 {
51 foo();
52 }
53 }
54 #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}}
55 for (int i = 0; i < 10; ++i) {
56 #pragma omp ordered // expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
57 {
58 foo();
59 }
60 }
61 #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}}
62 for (int i = 0; i < 10; ++i) {
63 #pragma omp ordered threads // expected-error {{'ordered' directive with 'threads' clause cannot be closely nested inside ordered region with specified parameter}}
64 {
65 foo();
66 }
67 }
68 #pragma omp for ordered
69 for (int i = 0; i < 10; ++i) {
70 #pragma omp ordered // expected-note {{previous 'ordered' directive used here}}
71 {
72 foo();
73 }
74 #pragma omp ordered // expected-error {{exactly one 'ordered' directive must appear in the loop body of an enclosing directive}}
75 {
76 foo();
77 }
78 }
79 #pragma omp ordered simd simd // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'simd' clause}}
80 {
81 foo();
82 }
83 #pragma omp simd
84 for (int i = 0; i < 10; ++i) {
85 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
86 {
87 foo();
88 }
89 }
90 #pragma omp simd
91 for (int i = 0; i < 10; ++i) {
92 #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
93 {
94 foo();
95 }
96 }
97 #pragma omp simd
98 for (int i = 0; i < 10; ++i) {
99 #pragma omp ordered simd // expected-note {{previous 'ordered' directive used here}}
100 {
101 foo();
102 }
103 #pragma omp ordered simd // expected-error {{exactly one 'ordered' directive must appear in the loop body of an enclosing directive}}
104 {
105 foo();
106 }
107 }
108 #pragma omp for simd
109 for (int i = 0; i < 10; ++i) {
110 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
111 {
112 foo();
113 }
114 }
115 #pragma omp for simd
116 for (int i = 0; i < 10; ++i) {
117 #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
118 {
119 foo();
120 }
121 }
122 #pragma omp parallel for simd
123 for (int i = 0; i < 10; ++i) {
124 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
125 {
126 foo();
127 }
128 }
129 #pragma omp parallel for simd
130 for (int i = 0; i < 10; ++i) {
131 #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
132 {
133 foo();
134 }
135 #if _OPENMP >= 202111
136 #pragma omp ordered doacross(source:omp_cur_iteration) // expected-error {{OpenMP constructs may not be nested inside a simd region}}
137 #else
138 #pragma omp ordered depend(source) // expected-error {{OpenMP constructs may not be nested inside a simd region}}
139 #endif
140 }
141 #pragma omp parallel for ordered
142 for (int i = 0; i < 10; ++i) {
143 #if _OPENMP >= 202111
144 #pragma omp ordered doacross(source:) // omp52-error {{'ordered' directive with 'doacross' clause cannot be closely nested inside ordered region without specified parameter}}
145 #pragma omp ordered doacross(sink : i) // omp52-error {{'ordered' directive with 'doacross' clause cannot be closely nested inside ordered region without specified parameter}}
146 #else
147 #pragma omp ordered depend(source) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}}
148 #pragma omp ordered depend(sink : i) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}}
149 #endif
150 }
151 #pragma omp parallel for ordered(2) // expected-note 3 {{'ordered' clause with specified parameter}}
152 for (int i = 0; i < 10; ++i) {
153 for (int j = 0; j < 10; ++j) {
154 #if _OPENMP >= 202111
155 #pragma omp ordered doacross // omp52-error {{expected '(' after 'doacross'}} omp52-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
156 #pragma omp ordered doacross( // omp52-error {{expected ')'}} omp52-error {{expected 'source' or 'sink' in OpenMP clause 'doacross'}} omp52-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} omp52-warning {{missing ':' or ')' after dependence-type - ignoring}} omp52-note {{to match this '('}}
157 #pragma omp ordered doacross(source // omp52-warning {{missing ':' or ')' after dependence-type - ignoring}} omp52-error {{expected ')'}} omp52-note {{to match this '('}}
158 #pragma omp ordered doacross(sink // omp52-error {{expected expression}} omp52-warning {{missing ':' or ')' after dependence-type - ignoring}} omp52-error {{expected ')'}} omp52-note {{to match this '('}} omp52-error {{expected 'i' loop iteration variable}}
159 #pragma omp ordered doacross(sink : // omp52-error {{expected ')'}} omp52-note {{to match this '('}} omp52-error {{expected expression}} omp52-error {{expected 'i' loop iteration variable}}
160 #pragma omp ordered doacross(sink : i // omp52-error {{expected ')'}} omp52-note {{to match this '('}} omp52-error {{expected 'j' loop iteration variable}}
161 #pragma omp ordered doacross(sink : i) // omp52-error {{expected 'j' loop iteration variable}}
162 #pragma omp ordered doacross(sink:omp_cur_iteration + 1) // omp52-error {{'doacross sink:' must be with 'omp_cur_iteration - 1'}}
163 #pragma omp ordered doacross(sink:omp_cur_iteration - 2) // omp52-error {{'doacross sink:' must be with 'omp_cur_iteration - 1'}}
164 #pragma omp ordered doacross(sink:omp_cur_iteration) // omp52-error {{'doacross sink:' must be with 'omp_cur_iteration - 1'}}
165 #pragma omp ordered doacross(source:omp_cur_iteration - 1) // omp52-error {{'doacross source:' must be with 'omp_cur_iteration'}}
166 #pragma omp ordered doacross(source:)
167 if (i == j)
168 #pragma omp ordered doacross(source:) // omp52-error {{'#pragma omp ordered' with 'doacross' clause cannot be an immediate substatement}}
169 ;
170 if (i == j)
171 #pragma omp ordered doacross(sink : i, j) // omp52-error {{'#pragma omp ordered' with 'doacross' clause cannot be an immediate substatement}}
172 ;
173 #pragma omp ordered doacross(source:) threads // omp52-error {{'doacross' clauses cannot be mixed with 'threads' clause}}
174 #pragma omp ordered simd doacross(source:) // omp52-error {{'doacross' clauses cannot be mixed with 'simd' clause}}
175 #pragma omp ordered doacross(source:) doacross(source:) // omp52-error {{directive '#pragma omp ordered' cannot contain more than one 'doacross' clause with 'source' dependence}}
176 #pragma omp ordered doacross(in : i) // omp52-error {{expected 'source' or 'sink' in OpenMP clause 'doacross'}} omp52-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
177 #pragma omp ordered doacross(sink : i, j)
178 #pragma omp ordered doacross(sink : j, i) // omp52-error {{expected 'i' loop iteration variable}} omp52-error {{expected 'j' loop iteration variable}}
179 #pragma omp ordered doacross(sink : i, j, k) // omp52-error {{unexpected expression: number of expressions is larger than the number of associated loops}}
180 #pragma omp ordered doacross(sink : i+foo(), j/4) // omp52-error {{integral constant expression}} omp52-error {{expected '+' or '-' operation}}
181 #if __cplusplus >= 201103L
182 // omp52-note@-2 {{non-constexpr function 'foo' cannot be used in a constant expression}}
183 #endif
184 #pragma omp ordered doacross(sink : i*0, j-4)// omp52-error {{expected '+' or '-' operation}}
185 #pragma omp ordered doacross(sink : i-0, j+sizeof(T)) doacross(sink : i-0, j+sizeof(T))
186 #pragma omp ordered doacross(sink : i-0, j+sizeof(T)) doacross(source:) // omp52-error {{'doacross(source)' clause cannot be mixed with 'doacross(sink:vec)' clauses}}
187 #pragma omp ordered doacross(source:) doacross(sink : i-0, j+sizeof(T)) // omp52-error {{'doacross(sink:vec)' clauses cannot be mixed with 'doacross(source)' clause}}
188 #else
189 #pragma omp ordered depend // expected-error {{expected '(' after 'depend'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
190 #pragma omp ordered depend( // expected-error {{expected ')'}} expected-error {{expected 'source' or 'sink' in OpenMP clause 'depend'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} expected-warning {{missing ':' or ')' after dependency type - ignoring}} expected-note {{to match this '('}}
191 #pragma omp ordered depend(source // expected-error {{expected ')'}} expected-note {{to match this '('}}
192 #pragma omp ordered depend(sink // expected-error {{expected expression}} expected-warning {{missing ':' or ')' after dependency type - ignoring}} expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected 'i' loop iteration variable}}
193 #pragma omp ordered depend(sink : // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} expected-error {{expected 'i' loop iteration variable}}
194 #pragma omp ordered depend(sink : i // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected 'j' loop iteration variable}}
195 #pragma omp ordered depend(sink : i) // expected-error {{expected 'j' loop iteration variable}}
196 #pragma omp ordered depend(source)
197 if (i == j)
198 #pragma omp ordered depend(source) // expected-error {{'#pragma omp ordered' with 'depend' clause cannot be an immediate substatement}}
199 ;
200 if (i == j)
201 #pragma omp ordered depend(sink : i, j) // expected-error {{'#pragma omp ordered' with 'depend' clause cannot be an immediate substatement}}
202 ;
203 #pragma omp ordered depend(source) threads // expected-error {{'depend' clauses cannot be mixed with 'threads' clause}}
204 #pragma omp ordered simd depend(source) // expected-error {{'depend' clauses cannot be mixed with 'simd' clause}}
205 #pragma omp ordered depend(source) depend(source) // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'depend' clause with 'source' dependence}}
206 #pragma omp ordered depend(in : i) // expected-error {{expected 'source' or 'sink' in OpenMP clause 'depend'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
207 #pragma omp ordered depend(sink : i, j)
208 #pragma omp ordered depend(sink : j, i) // expected-error {{expected 'i' loop iteration variable}} expected-error {{expected 'j' loop iteration variable}}
209 #pragma omp ordered depend(sink : i, j, k) // expected-error {{unexpected expression: number of expressions is larger than the number of associated loops}}
210 #pragma omp ordered depend(sink : i+foo(), j/4) // expected-error {{integral constant expression}} expected-error {{expected '+' or '-' operation}}
211 #if __cplusplus >= 201103L
212 // expected-note@-2 {{non-constexpr function 'foo' cannot be used in a constant expression}}
213 #endif
214 #pragma omp ordered depend(sink : i*0, j-4)// expected-error {{expected '+' or '-' operation}}
215 #pragma omp ordered depend(sink : i-0, j+sizeof(T)) depend(sink : i-0, j+sizeof(T))
216 #pragma omp ordered depend(sink : i-0, j+sizeof(T)) depend(source) // expected-error {{'depend(source)' clause cannot be mixed with 'depend(sink:vec)' clauses}}
217 #pragma omp ordered depend(source) depend(sink : i-0, j+sizeof(T)) // expected-error {{'depend(sink:vec)' clauses cannot be mixed with 'depend(source)' clause}}
218 #endif
219 }
220 }
221 #if _OPENMP >= 202111
222 #else
223 #pragma omp ordered depend(source) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}}
224 #pragma omp ordered depend(sink:k) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}}
225 #endif
226 return T();
227 }
228
foo()229 int foo() {
230 #if __cplusplus >= 201103L
231 // expected-note@-2 {{declared here}}
232 #endif
233 int k;
234 #pragma omp for ordered
235 for (int i = 0; i < 10; ++i) {
236 L1:
237 foo();
238 #pragma omp ordered
239 {
240 foo();
241 goto L1; // expected-error {{use of undeclared label 'L1'}}
242 }
243 }
244 #pragma omp for ordered
245 for (int i = 0; i < 10; ++i) {
246 foo();
247 goto L2; // expected-error {{use of undeclared label 'L2'}}
248 #pragma omp ordered
249 {
250 L2:
251 foo();
252 }
253 }
254 #pragma omp for ordered
255 for (int i = 0; i < 10; ++i) {
256 #pragma omp ordered threads threads // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'threads' clause}}
257 {
258 foo();
259 }
260 }
261 #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}}
262 for (int i = 0; i < 10; ++i) {
263 #pragma omp ordered // expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
264 {
265 foo();
266 }
267 }
268 #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}}
269 for (int i = 0; i < 10; ++i) {
270 #pragma omp ordered threads // expected-error {{'ordered' directive with 'threads' clause cannot be closely nested inside ordered region with specified parameter}}
271 {
272 foo();
273 }
274 }
275 #pragma omp ordered simd simd // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'simd' clause}}
276 {
277 foo();
278 }
279 #pragma omp simd
280 for (int i = 0; i < 10; ++i) {
281 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
282 {
283 foo();
284 }
285 }
286 #pragma omp simd
287 for (int i = 0; i < 10; ++i) {
288 #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
289 {
290 foo();
291 }
292 }
293 #pragma omp for simd
294 for (int i = 0; i < 10; ++i) {
295 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
296 {
297 foo();
298 }
299 }
300 #pragma omp for simd
301 for (int i = 0; i < 10; ++i) {
302 #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
303 {
304 foo();
305 }
306 }
307 #pragma omp parallel for simd
308 for (int i = 0; i < 10; ++i) {
309 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
310 {
311 foo();
312 }
313 }
314 #pragma omp parallel for simd
315 for (int i = 0; i < 10; ++i) {
316 #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
317 {
318 foo();
319 }
320 #if _OPENMP >= 202111
321 #pragma omp ordered doacross(source:omp_cur_iteration) // expected-error {{OpenMP constructs may not be nested inside a simd region}}
322 #else
323 #pragma omp ordered depend(source) // expected-error {{OpenMP constructs may not be nested inside a simd region}}
324 #endif
325 }
326 #pragma omp parallel for ordered
327 for (int i = 0; i < 10; ++i) {
328 #if _OPENMP >= 202111
329 #else
330 #pragma omp ordered depend(source) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}}
331 #pragma omp ordered depend(sink : i) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}}
332 #endif
333 }
334 #pragma omp parallel for ordered(2) // expected-note 3 {{'ordered' clause with specified parameter}}
335 for (int i = 0; i < 10; ++i) {
336 for (int j = 0; j < 10; ++j) {
337 #if _OPENMP >= 202111
338 #pragma omp ordered doacross // omp52-error {{expected '(' after 'doacross'}} omp52-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
339 #pragma omp ordered doacross( // omp52-error {{expected ')'}} omp52-error {{expected 'source' or 'sink' in OpenMP clause 'doacross'}} omp52-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} omp52-warning {{missing ':' or ')' after dependence-type - ignoring}} omp52-note {{to match this '('}}
340 #pragma omp ordered doacross(source // omp52-warning {{missing ':' or ')' after dependence-type - ignoring}} omp52-error {{expected ')'}} omp52-note {{to match this '('}}
341 #pragma omp ordered doacross(sink // omp52-error {{expected expression}} omp52-warning {{missing ':' or ')' after dependence-type - ignoring}} omp52-error {{expected ')'}} omp52-note {{to match this '('}} omp52-error {{expected 'i' loop iteration variable}}
342 #pragma omp ordered doacross(sink : // omp52-error {{expected ')'}} omp52-note {{to match this '('}} omp52-error {{expected expression}} omp52-error {{expected 'i' loop iteration variable}}
343 #pragma omp ordered doacross(sink : i // omp52-error {{expected ')'}} omp52-note {{to match this '('}} omp52-error {{expected 'j' loop iteration variable}}
344 #pragma omp ordered doacross(sink : i) // omp52-error {{expected 'j' loop iteration variable}}
345 #pragma omp ordered doacross(source:)
346 if (i == j)
347 #pragma omp ordered doacross(source:) // omp52-error {{'#pragma omp ordered' with 'doacross' clause cannot be an immediate substatement}}
348 ;
349 if (i == j)
350 #pragma omp ordered doacross(sink : i, j) // omp52-error {{'#pragma omp ordered' with 'doacross' clause cannot be an immediate substatement}}
351 ;
352 #pragma omp ordered doacross(source:) threads // omp52-error {{'doacross' clauses cannot be mixed with 'threads' clause}}
353 #pragma omp ordered simd doacross(source:) // omp52-error {{'doacross' clauses cannot be mixed with 'simd' clause}}
354 #pragma omp ordered doacross(source:) doacross(source:) // omp52-error {{directive '#pragma omp ordered' cannot contain more than one 'doacross' clause with 'source' dependence}}
355 #pragma omp ordered doacross(in : i) // omp52-error {{expected 'source' or 'sink' in OpenMP clause 'doacross'}} omp52-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
356 #pragma omp ordered doacross(sink : i, j) allocate(i) // omp52-error {{unexpected OpenMP clause 'allocate' in directive '#pragma omp ordered'}}
357 #pragma omp ordered doacross(sink : j, i) // omp52-error {{expected 'i' loop iteration variable}} omp52-error {{expected 'j' loop iteration variable}}
358 #pragma omp ordered doacross(sink : i, j, k) // omp52-error {{unexpected expression: number of expressions is larger than the number of associated loops}}
359 #pragma omp ordered doacross(sink : i+foo(), j/4) // omp52-error {{integral constant expression}} omp52-error {{expected '+' or '-' operation}}
360 #if __cplusplus >= 201103L
361 // omp52-note@-2 {{non-constexpr function 'foo' cannot be used in a constant expression}}
362 #endif
363 #pragma omp ordered doacross(sink : i*0, j-4)// omp52-error {{expected '+' or '-' operation}}
364 #pragma omp ordered doacross(sink : i-0, j+sizeof(int)) doacross(sink : i-0, j+sizeof(int))
365 #pragma omp ordered doacross(sink : i-0, j+sizeof(int)) doacross(source:) // omp52-error {{'doacross(source)' clause cannot be mixed with 'doacross(sink:vec)' clauses}}
366 #pragma omp ordered doacross(source:) doacross(sink : i-0, j+sizeof(int)) // omp52-error {{'doacross(sink:vec)' clauses cannot be mixed with 'doacross(source)' clause}}
367 #else
368 #pragma omp ordered depend // expected-error {{expected '(' after 'depend'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
369 #pragma omp ordered depend( // expected-error {{expected ')'}} expected-error {{expected 'source' or 'sink' in OpenMP clause 'depend'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} expected-warning {{missing ':' or ')' after dependency type - ignoring}} expected-note {{to match this '('}}
370 #pragma omp ordered depend(source // expected-error {{expected ')'}} expected-note {{to match this '('}}
371 #pragma omp ordered depend(sink // expected-error {{expected expression}} expected-warning {{missing ':' or ')' after dependency type - ignoring}} expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected 'i' loop iteration variable}}
372 #pragma omp ordered depend(sink : // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} expected-error {{expected 'i' loop iteration variable}}
373 #pragma omp ordered depend(sink : i // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected 'j' loop iteration variable}}
374 #pragma omp ordered depend(sink : i) // expected-error {{expected 'j' loop iteration variable}}
375 #pragma omp ordered depend(source)
376 if (i == j)
377 #pragma omp ordered depend(source) // expected-error {{'#pragma omp ordered' with 'depend' clause cannot be an immediate substatement}}
378 ;
379 if (i == j)
380 #pragma omp ordered depend(sink : i, j) // expected-error {{'#pragma omp ordered' with 'depend' clause cannot be an immediate substatement}}
381 ;
382 #pragma omp ordered depend(source) threads // expected-error {{'depend' clauses cannot be mixed with 'threads' clause}}
383 #pragma omp ordered simd depend(source) // expected-error {{'depend' clauses cannot be mixed with 'simd' clause}}
384 #pragma omp ordered depend(source) depend(source) // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'depend' clause with 'source' dependence}}
385 #pragma omp ordered depend(in : i) // expected-error {{expected 'source' or 'sink' in OpenMP clause 'depend'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
386 #pragma omp ordered depend(sink : i, j) allocate(i) // expected-error {{unexpected OpenMP clause 'allocate' in directive '#pragma omp ordered'}}
387 #pragma omp ordered depend(sink : j, i) // expected-error {{expected 'i' loop iteration variable}} expected-error {{expected 'j' loop iteration variable}}
388 #pragma omp ordered depend(sink : i, j, k) // expected-error {{unexpected expression: number of expressions is larger than the number of associated loops}}
389 #pragma omp ordered depend(sink : i+foo(), j/4) // expected-error {{integral constant expression}} expected-error {{expected '+' or '-' operation}}
390 #if __cplusplus >= 201103L
391 // expected-note@-2 {{non-constexpr function 'foo' cannot be used in a constant expression}}
392 #endif
393 #pragma omp ordered depend(sink : i*0, j-4)// expected-error {{expected '+' or '-' operation}}
394 #pragma omp ordered depend(sink : i-0, j+sizeof(int)) depend(sink : i-0, j+sizeof(int))
395 #pragma omp ordered depend(sink : i-0, j+sizeof(int)) depend(source) // expected-error {{'depend(source)' clause cannot be mixed with 'depend(sink:vec)' clauses}}
396 #pragma omp ordered depend(source) depend(sink : i-0, j+sizeof(int)) // expected-error {{'depend(sink:vec)' clauses cannot be mixed with 'depend(source)' clause}}
397 #endif
398 }
399 }
400
401 #pragma omp for ordered(2) // expected-note {{as specified in 'ordered' clause}}
402 for (int i = 0; i < 10; ++i) { // expected-error {{expected 2 for loops after '#pragma omp for', but found only 1}}
403 #if _OPENMP >= 202111
404 #pragma omp ordered doacross(sink : i)
405 #pragma omp ordered depend(source) // expected-warning {{'depend' clause for 'ordered' is deprecated; use 'doacross' instead}}
406 int j;
407 #pragma omp ordered doacross(sink : i, j) // omp52-error {{expected loop iteration variable}}
408 #else
409 #pragma omp ordered depend(sink : i)
410 int j;
411 #pragma omp ordered depend(sink : i, j) // expected-error {{expected loop iteration variable}}
412 #endif
413 foo();
414 }
415
416 return foo<int>(); // expected-note {{in instantiation of function template specialization 'foo<int>' requested here}}
417 }
418