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 
20 template <class T>
foo()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 ordered simd simd // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'simd' clause}}
65   {
66     foo();
67   }
68   #pragma omp simd
69   for (int i = 0; i < 10; ++i) {
70     #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
71     {
72       foo();
73     }
74   }
75   #pragma omp simd
76   for (int i = 0; i < 10; ++i) {
77     #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
78     {
79       foo();
80     }
81   }
82   #pragma omp for 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 for 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 parallel for simd
97   for (int i = 0; i < 10; ++i) {
98     #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
99     {
100       foo();
101     }
102   }
103   #pragma omp parallel for simd
104   for (int i = 0; i < 10; ++i) {
105     #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
106     {
107       foo();
108     }
109     #pragma omp ordered depend(source) // expected-error {{OpenMP constructs may not be nested inside a simd region}}
110   }
111 #pragma omp parallel for ordered
112   for (int i = 0; i < 10; ++i) {
113     #pragma omp ordered depend(source) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}}
114     #pragma omp ordered depend(sink : i) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}}
115   }
116 #pragma omp parallel for ordered(2) // expected-note 5 {{'ordered' clause with specified parameter}}
117   for (int i = 0; i < 10; ++i) {
118     for (int j = 0; j < 10; ++j) {
119 #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}}
120 #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 '('}}
121 #pragma omp ordered depend(source // expected-error {{expected ')'}} expected-note {{to match this '('}}
122 #pragma omp ordered depend(sink // expected-error {{expected expression}} expected-warning {{missing ':' or ')' after dependency type - ignoring}} expected-error {{expected ')'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} expected-note {{to match this '('}}
123 #pragma omp ordered depend(sink : // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
124 #pragma omp ordered depend(sink : i // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected 'j' loop iteration variable}}
125 #pragma omp ordered depend(sink : i) // expected-error {{expected 'j' loop iteration variable}}
126 #pragma omp ordered depend(source)
127                            if (i == j)
128 #pragma omp ordered depend(source) // expected-error {{'#pragma omp ordered' with 'depend' clause cannot be an immediate substatement}}
129                              ;
130                            if (i == j)
131 #pragma omp ordered depend(sink : i, j) // expected-error {{'#pragma omp ordered' with 'depend' clause cannot be an immediate substatement}}
132                              ;
133 #pragma omp ordered depend(source) threads // expected-error {{'depend' clauses cannot be mixed with 'threads' clause}}
134 #pragma omp ordered simd depend(source) // expected-error {{'depend' clauses cannot be mixed with 'simd' clause}}
135 #pragma omp ordered depend(source) depend(source) // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'depend' clause with 'source' dependence}}
136 #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}}
137 #pragma omp ordered depend(sink : i, j)
138 #pragma omp ordered depend(sink : j, i) // expected-error {{expected 'i' loop iteration variable}} expected-error {{expected 'j' loop iteration variable}}
139 #pragma omp ordered depend(sink : i, j, k) // expected-error {{unexpected expression: number of expressions is larger than the number of associated loops}}
140 #pragma omp ordered depend(sink : i+foo(), j/4) // expected-error {{expression is not an integral constant expression}} expected-error {{expected '+' or '-' operation}}
141 #if __cplusplus >= 201103L
142 // expected-note@-2 {{non-constexpr function 'foo' cannot be used in a constant expression}}
143 #endif
144 #pragma omp ordered depend(sink : i*0, j-4)// expected-error {{expected '+' or '-' operation}}
145 #pragma omp ordered depend(sink : i-0, j+sizeof(T)) depend(sink : i-0, j+sizeof(T))
146 #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}}
147 #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}}
148     }
149   }
150 #pragma omp ordered depend(source) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}}
151 #pragma omp ordered depend(sink:k) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}}
152   return T();
153 }
154 
foo()155 int foo() {
156 #if __cplusplus >= 201103L
157 // expected-note@-2 2 {{declared here}}
158 #endif
159 int k;
160   #pragma omp for ordered
161   for (int i = 0; i < 10; ++i) {
162     L1:
163       foo();
164     #pragma omp ordered
165     {
166       foo();
167       goto L1; // expected-error {{use of undeclared label 'L1'}}
168     }
169   }
170   #pragma omp for ordered
171   for (int i = 0; i < 10; ++i) {
172     foo();
173     goto L2; // expected-error {{use of undeclared label 'L2'}}
174     #pragma omp ordered
175     {
176       L2:
177       foo();
178     }
179   }
180   #pragma omp for ordered
181   for (int i = 0; i < 10; ++i) {
182     #pragma omp ordered threads threads // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'threads' clause}}
183     {
184       foo();
185     }
186   }
187   #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}}
188   for (int i = 0; i < 10; ++i) {
189     #pragma omp ordered // expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
190     {
191       foo();
192     }
193   }
194   #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}}
195   for (int i = 0; i < 10; ++i) {
196     #pragma omp ordered threads // expected-error {{'ordered' directive with 'threads' clause cannot be closely nested inside ordered region with specified parameter}}
197     {
198       foo();
199     }
200   }
201   #pragma omp ordered simd simd // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'simd' clause}}
202   {
203     foo();
204   }
205   #pragma omp simd
206   for (int i = 0; i < 10; ++i) {
207     #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
208     {
209       foo();
210     }
211   }
212   #pragma omp simd
213   for (int i = 0; i < 10; ++i) {
214     #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
215     {
216       foo();
217     }
218   }
219   #pragma omp for simd
220   for (int i = 0; i < 10; ++i) {
221     #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
222     {
223       foo();
224     }
225   }
226   #pragma omp for simd
227   for (int i = 0; i < 10; ++i) {
228     #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
229     {
230       foo();
231     }
232   }
233   #pragma omp parallel for simd
234   for (int i = 0; i < 10; ++i) {
235     #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
236     {
237       foo();
238     }
239   }
240   #pragma omp parallel for simd
241   for (int i = 0; i < 10; ++i) {
242     #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
243     {
244       foo();
245     }
246     #pragma omp ordered depend(source) // expected-error {{OpenMP constructs may not be nested inside a simd region}}
247   }
248 #pragma omp parallel for ordered
249   for (int i = 0; i < 10; ++i) {
250     #pragma omp ordered depend(source) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}}
251     #pragma omp ordered depend(sink : i) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}}
252   }
253 #pragma omp parallel for ordered(2) // expected-note 5 {{'ordered' clause with specified parameter}}
254   for (int i = 0; i < 10; ++i) {
255     for (int j = 0; j < 10; ++j) {
256 #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}}
257 #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 '('}}
258 #pragma omp ordered depend(source // expected-error {{expected ')'}} expected-note {{to match this '('}}
259 #pragma omp ordered depend(sink // expected-error {{expected expression}} expected-warning {{missing ':' or ')' after dependency type - ignoring}} expected-error {{expected ')'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} expected-note {{to match this '('}}
260 #pragma omp ordered depend(sink : // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
261 #pragma omp ordered depend(sink : i // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected 'j' loop iteration variable}}
262 #pragma omp ordered depend(sink : i) // expected-error {{expected 'j' loop iteration variable}}
263 #pragma omp ordered depend(source)
264                            if (i == j)
265 #pragma omp ordered depend(source) // expected-error {{'#pragma omp ordered' with 'depend' clause cannot be an immediate substatement}}
266                              ;
267                            if (i == j)
268 #pragma omp ordered depend(sink : i, j) // expected-error {{'#pragma omp ordered' with 'depend' clause cannot be an immediate substatement}}
269                              ;
270 #pragma omp ordered depend(source) threads // expected-error {{'depend' clauses cannot be mixed with 'threads' clause}}
271 #pragma omp ordered simd depend(source) // expected-error {{'depend' clauses cannot be mixed with 'simd' clause}}
272 #pragma omp ordered depend(source) depend(source) // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'depend' clause with 'source' dependence}}
273 #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}}
274 #pragma omp ordered depend(sink : i, j) allocate(i) // expected-error {{unexpected OpenMP clause 'allocate' in directive '#pragma omp ordered'}}
275 #pragma omp ordered depend(sink : j, i) // expected-error {{expected 'i' loop iteration variable}} expected-error {{expected 'j' loop iteration variable}}
276 #pragma omp ordered depend(sink : i, j, k) // expected-error {{unexpected expression: number of expressions is larger than the number of associated loops}}
277 #pragma omp ordered depend(sink : i+foo(), j/4) // expected-error {{expression is not an integral constant expression}} expected-error {{expected '+' or '-' operation}}
278 #if __cplusplus >= 201103L
279 // expected-note@-2 {{non-constexpr function 'foo' cannot be used in a constant expression}}
280 #endif
281 #pragma omp ordered depend(sink : i*0, j-4)// expected-error {{expected '+' or '-' operation}}
282 #pragma omp ordered depend(sink : i-0, j+sizeof(int)) depend(sink : i-0, j+sizeof(int))
283 #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}}
284 #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}}
285     }
286   }
287 
288 #pragma omp for ordered(2) // expected-note {{as specified in 'ordered' clause}}
289   for (int i = 0; i < 10; ++i) { // expected-error {{expected 2 for loops after '#pragma omp for', but found only 1}}
290 #pragma omp ordered depend(sink : i)
291     int j;
292 #pragma omp ordered depend(sink : i, j) // expected-error {{expected loop iteration variable}}
293     foo();
294   }
295 
296   return foo<int>(); // expected-note {{in instantiation of function template specialization 'foo<int>' requested here}}
297 }
298