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