]> git.proxmox.com Git - rustc.git/blob - src/test/ui/deprecation/deprecation-lint.rs
6b3e9a8ad8116dae8fb811c9150ce84183158d66
[rustc.git] / src / test / ui / deprecation / deprecation-lint.rs
1 // aux-build:deprecation-lint.rs
2 // ignore-tidy-linelength
3
4 #![deny(deprecated)]
5 #![allow(warnings)]
6
7 #[macro_use]
8 extern crate deprecation_lint;
9
10 mod cross_crate {
11 use deprecation_lint::*;
12
13 fn test() {
14 type Foo = MethodTester;
15 let foo = MethodTester;
16
17 deprecated(); //~ ERROR use of deprecated item 'deprecation_lint::deprecated'
18 foo.method_deprecated(); //~ ERROR use of deprecated item 'deprecation_lint::MethodTester::method_deprecated'
19 Foo::method_deprecated(&foo); //~ ERROR use of deprecated item 'deprecation_lint::MethodTester::method_deprecated'
20 <Foo>::method_deprecated(&foo); //~ ERROR use of deprecated item 'deprecation_lint::MethodTester::method_deprecated'
21 foo.trait_deprecated(); //~ ERROR use of deprecated item 'deprecation_lint::Trait::trait_deprecated'
22 Trait::trait_deprecated(&foo); //~ ERROR use of deprecated item 'deprecation_lint::Trait::trait_deprecated'
23 <Foo>::trait_deprecated(&foo); //~ ERROR use of deprecated item 'deprecation_lint::Trait::trait_deprecated'
24 <Foo as Trait>::trait_deprecated(&foo); //~ ERROR use of deprecated item 'deprecation_lint::Trait::trait_deprecated'
25
26 deprecated_text(); //~ ERROR use of deprecated item 'deprecation_lint::deprecated_text': text
27 foo.method_deprecated_text(); //~ ERROR use of deprecated item 'deprecation_lint::MethodTester::method_deprecated_text': text
28 Foo::method_deprecated_text(&foo); //~ ERROR use of deprecated item 'deprecation_lint::MethodTester::method_deprecated_text': text
29 <Foo>::method_deprecated_text(&foo); //~ ERROR use of deprecated item 'deprecation_lint::MethodTester::method_deprecated_text': text
30 foo.trait_deprecated_text(); //~ ERROR use of deprecated item 'deprecation_lint::Trait::trait_deprecated_text': text
31 Trait::trait_deprecated_text(&foo); //~ ERROR use of deprecated item 'deprecation_lint::Trait::trait_deprecated_text': text
32 <Foo>::trait_deprecated_text(&foo); //~ ERROR use of deprecated item 'deprecation_lint::Trait::trait_deprecated_text': text
33 <Foo as Trait>::trait_deprecated_text(&foo); //~ ERROR use of deprecated item 'deprecation_lint::Trait::trait_deprecated_text': text
34
35 let _ = DeprecatedStruct { //~ ERROR use of deprecated item 'deprecation_lint::DeprecatedStruct': text
36 i: 0 //~ ERROR use of deprecated item 'deprecation_lint::DeprecatedStruct::i': text
37 };
38
39 let _ = DeprecatedUnitStruct; //~ ERROR use of deprecated item 'deprecation_lint::DeprecatedUnitStruct': text
40
41 let _ = Enum::DeprecatedVariant; //~ ERROR use of deprecated item 'deprecation_lint::Enum::DeprecatedVariant': text
42
43 let _ = DeprecatedTupleStruct (1); //~ ERROR use of deprecated item 'deprecation_lint::DeprecatedTupleStruct': text
44
45 let _ = nested::DeprecatedStruct { //~ ERROR use of deprecated item 'deprecation_lint::nested::DeprecatedStruct': text
46 i: 0 //~ ERROR use of deprecated item 'deprecation_lint::nested::DeprecatedStruct::i': text
47 };
48
49 let _ = nested::DeprecatedUnitStruct; //~ ERROR use of deprecated item 'deprecation_lint::nested::DeprecatedUnitStruct': text
50
51 let _ = nested::Enum::DeprecatedVariant; //~ ERROR use of deprecated item 'deprecation_lint::nested::Enum::DeprecatedVariant': text
52
53 let _ = nested::DeprecatedTupleStruct (1); //~ ERROR use of deprecated item 'deprecation_lint::nested::DeprecatedTupleStruct': text
54
55 // At the moment, the lint checker only checks stability in
56 // in the arguments of macros.
57 // Eventually, we will want to lint the contents of the
58 // macro in the module *defining* it. Also, stability levels
59 // on macros themselves are not yet linted.
60 macro_test_arg!(deprecated_text()); //~ ERROR use of deprecated item 'deprecation_lint::deprecated_text': text
61 macro_test_arg!(macro_test_arg!(deprecated_text())); //~ ERROR use of deprecated item 'deprecation_lint::deprecated_text': text
62 }
63
64 fn test_method_param<Foo: Trait>(foo: Foo) {
65 foo.trait_deprecated(); //~ ERROR use of deprecated item 'deprecation_lint::Trait::trait_deprecated'
66 Trait::trait_deprecated(&foo); //~ ERROR use of deprecated item 'deprecation_lint::Trait::trait_deprecated'
67 <Foo>::trait_deprecated(&foo); //~ ERROR use of deprecated item 'deprecation_lint::Trait::trait_deprecated'
68 <Foo as Trait>::trait_deprecated(&foo); //~ ERROR use of deprecated item 'deprecation_lint::Trait::trait_deprecated'
69 foo.trait_deprecated_text(); //~ ERROR use of deprecated item 'deprecation_lint::Trait::trait_deprecated_text': text
70 Trait::trait_deprecated_text(&foo); //~ ERROR use of deprecated item 'deprecation_lint::Trait::trait_deprecated_text': text
71 <Foo>::trait_deprecated_text(&foo); //~ ERROR use of deprecated item 'deprecation_lint::Trait::trait_deprecated_text': text
72 <Foo as Trait>::trait_deprecated_text(&foo); //~ ERROR use of deprecated item 'deprecation_lint::Trait::trait_deprecated_text': text
73 }
74
75 fn test_method_object(foo: &Trait) {
76 foo.trait_deprecated(); //~ ERROR use of deprecated item 'deprecation_lint::Trait::trait_deprecated'
77 foo.trait_deprecated_text(); //~ ERROR use of deprecated item 'deprecation_lint::Trait::trait_deprecated_text': text
78 }
79
80 struct S;
81
82 impl DeprecatedTrait for S {} //~ ERROR use of deprecated item 'deprecation_lint::DeprecatedTrait': text
83 trait LocalTrait : DeprecatedTrait { } //~ ERROR use of deprecated item 'deprecation_lint::DeprecatedTrait': text
84
85 pub fn foo() {
86 let x = Stable {
87 override2: 3,
88 //~^ ERROR use of deprecated item 'deprecation_lint::Stable::override2': text
89 };
90
91 let _ = x.override2;
92 //~^ ERROR use of deprecated item 'deprecation_lint::Stable::override2': text
93
94 let Stable {
95 override2: _
96 //~^ ERROR use of deprecated item 'deprecation_lint::Stable::override2': text
97 } = x;
98 // all fine
99 let Stable { .. } = x;
100
101 let x = Stable2(1, 2, 3);
102
103 let _ = x.2;
104 //~^ ERROR use of deprecated item 'deprecation_lint::Stable2::2': text
105
106 let Stable2(_,
107 _,
108 _)
109 //~^ ERROR use of deprecated item 'deprecation_lint::Stable2::2': text
110 = x;
111 // all fine
112 let Stable2(..) = x;
113
114 let x = Deprecated {
115 //~^ ERROR use of deprecated item 'deprecation_lint::Deprecated': text
116 inherit: 1,
117 //~^ ERROR use of deprecated item 'deprecation_lint::Deprecated::inherit': text
118 };
119
120 let _ = x.inherit;
121 //~^ ERROR use of deprecated item 'deprecation_lint::Deprecated::inherit': text
122
123 let Deprecated {
124 //~^ ERROR use of deprecated item 'deprecation_lint::Deprecated': text
125 inherit: _,
126 //~^ ERROR use of deprecated item 'deprecation_lint::Deprecated::inherit': text
127 } = x;
128
129 let Deprecated
130 //~^ ERROR use of deprecated item 'deprecation_lint::Deprecated': text
131 { .. } = x;
132
133 let x = Deprecated2(1, 2, 3);
134 //~^ ERROR use of deprecated item 'deprecation_lint::Deprecated2': text
135
136 let _ = x.0;
137 //~^ ERROR use of deprecated item 'deprecation_lint::Deprecated2::0': text
138 let _ = x.1;
139 //~^ ERROR use of deprecated item 'deprecation_lint::Deprecated2::1': text
140 let _ = x.2;
141 //~^ ERROR use of deprecated item 'deprecation_lint::Deprecated2::2': text
142
143 let Deprecated2
144 //~^ ERROR use of deprecated item 'deprecation_lint::Deprecated2': text
145 (_,
146 //~^ ERROR use of deprecated item 'deprecation_lint::Deprecated2::0': text
147 _,
148 //~^ ERROR use of deprecated item 'deprecation_lint::Deprecated2::1': text
149 _)
150 //~^ ERROR use of deprecated item 'deprecation_lint::Deprecated2::2': text
151 = x;
152 let Deprecated2
153 //~^ ERROR use of deprecated item 'deprecation_lint::Deprecated2': text
154 // the patterns are all fine:
155 (..) = x;
156 }
157 }
158
159 mod inheritance {
160 use deprecation_lint::*;
161
162 fn test_inheritance() {
163 deprecated_mod::deprecated(); //~ ERROR use of deprecated item 'deprecation_lint::deprecated_mod::deprecated': text
164 }
165 }
166
167 mod this_crate {
168 #[deprecated(since = "1.0.0", note = "text")]
169 pub fn deprecated() {}
170 #[deprecated(since = "1.0.0", note = "text")]
171 pub fn deprecated_text() {}
172
173 #[deprecated(since = "99.99.99", note = "text")]
174 pub fn deprecated_future() {}
175 #[deprecated(since = "99.99.99", note = "text")]
176 pub fn deprecated_future_text() {}
177
178 pub struct MethodTester;
179
180 impl MethodTester {
181 #[deprecated(since = "1.0.0", note = "text")]
182 pub fn method_deprecated(&self) {}
183 #[deprecated(since = "1.0.0", note = "text")]
184 pub fn method_deprecated_text(&self) {}
185 }
186
187 pub trait Trait {
188 #[deprecated(since = "1.0.0", note = "text")]
189 fn trait_deprecated(&self) {}
190 #[deprecated(since = "1.0.0", note = "text")]
191 fn trait_deprecated_text(&self) {}
192 }
193
194 impl Trait for MethodTester {}
195
196 #[deprecated(since = "1.0.0", note = "text")]
197 pub struct DeprecatedStruct {
198 i: isize
199 }
200 pub struct UnstableStruct {
201 i: isize
202 }
203 pub struct StableStruct {
204 i: isize
205 }
206
207 #[deprecated(since = "1.0.0", note = "text")]
208 pub struct DeprecatedUnitStruct;
209
210 pub enum Enum {
211 #[deprecated(since = "1.0.0", note = "text")]
212 DeprecatedVariant,
213 }
214
215 #[deprecated(since = "1.0.0", note = "text")]
216 pub struct DeprecatedTupleStruct(isize);
217
218 mod nested {
219 #[deprecated(since = "1.0.0", note = "text")]
220 pub struct DeprecatedStruct {
221 i: isize
222 }
223
224 #[deprecated(since = "1.0.0", note = "text")]
225 pub struct DeprecatedUnitStruct;
226
227 pub enum Enum {
228 #[deprecated(since = "1.0.0", note = "text")]
229 DeprecatedVariant,
230 }
231
232 #[deprecated(since = "1.0.0", note = "text")]
233 pub struct DeprecatedTupleStruct(pub isize);
234 }
235
236 fn test() {
237 use self::nested;
238
239 // Only the deprecated cases of the following should generate
240 // errors, because other stability attributes now have meaning
241 // only *across* crates, not within a single crate.
242
243 type Foo = MethodTester;
244 let foo = MethodTester;
245
246 deprecated(); //~ ERROR use of deprecated item 'this_crate::deprecated'
247 foo.method_deprecated(); //~ ERROR use of deprecated item 'this_crate::MethodTester::method_deprecated'
248 Foo::method_deprecated(&foo); //~ ERROR use of deprecated item 'this_crate::MethodTester::method_deprecated'
249 <Foo>::method_deprecated(&foo); //~ ERROR use of deprecated item 'this_crate::MethodTester::method_deprecated'
250 foo.trait_deprecated(); //~ ERROR use of deprecated item 'this_crate::Trait::trait_deprecated'
251 Trait::trait_deprecated(&foo); //~ ERROR use of deprecated item 'this_crate::Trait::trait_deprecated'
252 <Foo>::trait_deprecated(&foo); //~ ERROR use of deprecated item 'this_crate::Trait::trait_deprecated'
253 <Foo as Trait>::trait_deprecated(&foo); //~ ERROR use of deprecated item 'this_crate::Trait::trait_deprecated'
254
255 deprecated_text(); //~ ERROR use of deprecated item 'this_crate::deprecated_text': text
256 foo.method_deprecated_text(); //~ ERROR use of deprecated item 'this_crate::MethodTester::method_deprecated_text': text
257 Foo::method_deprecated_text(&foo); //~ ERROR use of deprecated item 'this_crate::MethodTester::method_deprecated_text': text
258 <Foo>::method_deprecated_text(&foo); //~ ERROR use of deprecated item 'this_crate::MethodTester::method_deprecated_text': text
259 foo.trait_deprecated_text(); //~ ERROR use of deprecated item 'this_crate::Trait::trait_deprecated_text': text
260 Trait::trait_deprecated_text(&foo); //~ ERROR use of deprecated item 'this_crate::Trait::trait_deprecated_text': text
261 <Foo>::trait_deprecated_text(&foo); //~ ERROR use of deprecated item 'this_crate::Trait::trait_deprecated_text': text
262 <Foo as Trait>::trait_deprecated_text(&foo); //~ ERROR use of deprecated item 'this_crate::Trait::trait_deprecated_text': text
263
264 deprecated_future(); // Fine; no error.
265 deprecated_future_text(); // Fine; no error.
266
267 let _ = DeprecatedStruct {
268 //~^ ERROR use of deprecated item 'this_crate::DeprecatedStruct': text
269 i: 0 //~ ERROR use of deprecated item 'this_crate::DeprecatedStruct::i': text
270 };
271
272 let _ = DeprecatedUnitStruct; //~ ERROR use of deprecated item 'this_crate::DeprecatedUnitStruct': text
273
274 let _ = Enum::DeprecatedVariant; //~ ERROR use of deprecated item 'this_crate::Enum::DeprecatedVariant': text
275
276 let _ = DeprecatedTupleStruct (1); //~ ERROR use of deprecated item 'this_crate::DeprecatedTupleStruct': text
277
278 let _ = nested::DeprecatedStruct {
279 //~^ ERROR use of deprecated item 'this_crate::nested::DeprecatedStruct': text
280 i: 0 //~ ERROR use of deprecated item 'this_crate::nested::DeprecatedStruct::i': text
281 };
282
283 let _ = nested::DeprecatedUnitStruct; //~ ERROR use of deprecated item 'this_crate::nested::DeprecatedUnitStruct': text
284
285 let _ = nested::Enum::DeprecatedVariant; //~ ERROR use of deprecated item 'this_crate::nested::Enum::DeprecatedVariant': text
286
287 let _ = nested::DeprecatedTupleStruct (1); //~ ERROR use of deprecated item 'this_crate::nested::DeprecatedTupleStruct': text
288 }
289
290 fn test_method_param<Foo: Trait>(foo: Foo) {
291 foo.trait_deprecated(); //~ ERROR use of deprecated item 'this_crate::Trait::trait_deprecated'
292 Trait::trait_deprecated(&foo); //~ ERROR use of deprecated item 'this_crate::Trait::trait_deprecated'
293 <Foo>::trait_deprecated(&foo); //~ ERROR use of deprecated item 'this_crate::Trait::trait_deprecated'
294 <Foo as Trait>::trait_deprecated(&foo); //~ ERROR use of deprecated item 'this_crate::Trait::trait_deprecated'
295 foo.trait_deprecated_text(); //~ ERROR use of deprecated item 'this_crate::Trait::trait_deprecated_text': text
296 Trait::trait_deprecated_text(&foo); //~ ERROR use of deprecated item 'this_crate::Trait::trait_deprecated_text': text
297 <Foo>::trait_deprecated_text(&foo); //~ ERROR use of deprecated item 'this_crate::Trait::trait_deprecated_text': text
298 <Foo as Trait>::trait_deprecated_text(&foo); //~ ERROR use of deprecated item 'this_crate::Trait::trait_deprecated_text': text
299 }
300
301 fn test_method_object(foo: &Trait) {
302 foo.trait_deprecated(); //~ ERROR use of deprecated item 'this_crate::Trait::trait_deprecated'
303 foo.trait_deprecated_text(); //~ ERROR use of deprecated item 'this_crate::Trait::trait_deprecated_text': text
304 }
305
306 #[deprecated(since = "1.0.0", note = "text")]
307 fn test_fn_body() {
308 fn fn_in_body() {}
309 fn_in_body();
310 }
311
312 fn test_fn_closure_body() {
313 let _ = || {
314 #[deprecated]
315 fn bar() { }
316 bar(); //~ ERROR use of deprecated item 'this_crate::test_fn_closure_body::{{closure}}::bar'
317 };
318 }
319
320 impl MethodTester {
321 #[deprecated(since = "1.0.0", note = "text")]
322 fn test_method_body(&self) {
323 fn fn_in_body() {}
324 fn_in_body();
325 }
326 }
327
328 #[deprecated(since = "1.0.0", note = "text")]
329 pub trait DeprecatedTrait {
330 fn dummy(&self) { }
331 }
332
333 struct S;
334
335 impl DeprecatedTrait for S { } //~ ERROR use of deprecated item 'this_crate::DeprecatedTrait': text
336
337 trait LocalTrait : DeprecatedTrait { } //~ ERROR use of deprecated item 'this_crate::DeprecatedTrait': text
338 }
339
340 mod this_crate2 {
341 struct Stable {
342 #[deprecated(since = "1.0.0", note = "text")]
343 override2: u8,
344 }
345
346 struct Stable2(u8,
347 u8,
348 #[deprecated(since = "1.0.0", note = "text")] u8);
349
350 #[deprecated(since = "1.0.0", note = "text")]
351 struct Deprecated {
352 inherit: u8,
353 }
354
355 #[deprecated(since = "1.0.0", note = "text")]
356 struct Deprecated2(u8,
357 u8,
358 u8);
359
360 pub fn foo() {
361 let x = Stable {
362 override2: 3,
363 //~^ ERROR use of deprecated item 'this_crate2::Stable::override2': text
364 };
365
366 let _ = x.override2;
367 //~^ ERROR use of deprecated item 'this_crate2::Stable::override2': text
368
369 let Stable {
370 override2: _
371 //~^ ERROR use of deprecated item 'this_crate2::Stable::override2': text
372 } = x;
373 // all fine
374 let Stable { .. } = x;
375
376 let x = Stable2(1, 2, 3);
377
378 let _ = x.2;
379 //~^ ERROR use of deprecated item 'this_crate2::Stable2::2': text
380
381 let Stable2(_,
382 _,
383 _)
384 //~^ ERROR use of deprecated item 'this_crate2::Stable2::2': text
385 = x;
386 // all fine
387 let Stable2(..) = x;
388
389 let x = Deprecated {
390 //~^ ERROR use of deprecated item 'this_crate2::Deprecated': text
391 inherit: 1,
392 //~^ ERROR use of deprecated item 'this_crate2::Deprecated::inherit': text
393 };
394
395 let _ = x.inherit;
396 //~^ ERROR use of deprecated item 'this_crate2::Deprecated::inherit': text
397
398 let Deprecated {
399 //~^ ERROR use of deprecated item 'this_crate2::Deprecated': text
400 inherit: _,
401 //~^ ERROR use of deprecated item 'this_crate2::Deprecated::inherit': text
402 } = x;
403
404 let Deprecated
405 //~^ ERROR use of deprecated item 'this_crate2::Deprecated': text
406 // the patterns are all fine:
407 { .. } = x;
408
409 let x = Deprecated2(1, 2, 3);
410 //~^ ERROR use of deprecated item 'this_crate2::Deprecated2': text
411
412 let _ = x.0;
413 //~^ ERROR use of deprecated item 'this_crate2::Deprecated2::0': text
414 let _ = x.1;
415 //~^ ERROR use of deprecated item 'this_crate2::Deprecated2::1': text
416 let _ = x.2;
417 //~^ ERROR use of deprecated item 'this_crate2::Deprecated2::2': text
418
419 let Deprecated2
420 //~^ ERROR use of deprecated item 'this_crate2::Deprecated2': text
421 (_,
422 //~^ ERROR use of deprecated item 'this_crate2::Deprecated2::0': text
423 _,
424 //~^ ERROR use of deprecated item 'this_crate2::Deprecated2::1': text
425 _)
426 //~^ ERROR use of deprecated item 'this_crate2::Deprecated2::2': text
427 = x;
428 let Deprecated2
429 //~^ ERROR use of deprecated item 'this_crate2::Deprecated2': text
430 // the patterns are all fine:
431 (..) = x;
432 }
433 }
434
435 fn main() {}