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