]> git.lizzy.rs Git - rust.git/blob - src/test/ui/deprecation/deprecation-lint.rs
fix rebase fallout
[rust.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() {}