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