]> git.lizzy.rs Git - rust.git/blob - tests/ui/useless_asref.rs
Add lint for useless `as_ref` calls
[rust.git] / tests / ui / useless_asref.rs
1 #![deny(useless_asref)]
2
3 struct FakeAsRef;
4
5 #[allow(should_implement_trait)]
6 impl FakeAsRef {
7     fn as_ref(&self) -> &Self { self }
8 }
9
10 struct MoreRef;
11
12 impl<'a, 'b, 'c> AsRef<&'a &'b &'c MoreRef> for MoreRef {
13     fn as_ref(&self) -> &&'a &'b &'c MoreRef {
14         &&&&MoreRef
15     }
16 }
17
18 fn foo_rstr(x: &str) { println!("{:?}", x); }
19 fn foo_rslice(x: &[i32]) { println!("{:?}", x); }
20 fn foo_mrslice(x: &mut [i32]) { println!("{:?}", x); }
21 fn foo_rrrrmr(_: &&&&MoreRef) { println!("so many refs"); }
22
23 fn not_ok() {
24     let rstr: &str = "hello";
25     let mut mrslice: &mut [i32] = &mut [1,2,3];
26
27     {
28         let rslice: &[i32] = &*mrslice;
29         foo_rstr(rstr.as_ref());
30         foo_rstr(rstr);
31         foo_rslice(rslice.as_ref());
32         foo_rslice(rslice);
33     }
34     {
35         foo_mrslice(mrslice.as_mut());
36         foo_mrslice(mrslice);
37         foo_rslice(mrslice.as_ref());
38         foo_rslice(mrslice);
39     }
40
41     {
42         let rrrrrstr = &&&&rstr;
43         let rrrrrslice = &&&&&*mrslice;
44         foo_rslice(rrrrrslice.as_ref());
45         foo_rslice(rrrrrslice);
46         foo_rstr(rrrrrstr.as_ref());
47         foo_rstr(rrrrrstr);
48     }
49     {
50         let mrrrrrslice = &mut &mut &mut &mut mrslice;
51         foo_mrslice(mrrrrrslice.as_mut());
52         foo_mrslice(mrrrrrslice);
53         foo_rslice(mrrrrrslice.as_ref());
54         foo_rslice(mrrrrrslice);
55     }
56     foo_rrrrmr((&&&&MoreRef).as_ref());
57 }
58
59 fn ok() {
60     let string = "hello".to_owned();
61     let mut arr = [1,2,3];
62     let mut vec = vec![1,2,3];
63
64     {
65         foo_rstr(string.as_ref());
66         foo_rslice(arr.as_ref());
67         foo_rslice(vec.as_ref());
68     }
69     {
70         foo_mrslice(arr.as_mut());
71         foo_mrslice(vec.as_mut());
72     }
73
74     {
75         let rrrrstring = &&&&string;
76         let rrrrarr = &&&&arr;
77         let rrrrvec = &&&&vec;
78         foo_rstr(rrrrstring.as_ref());
79         foo_rslice(rrrrarr.as_ref());
80         foo_rslice(rrrrvec.as_ref());
81     }
82     {
83         let mrrrrarr = &mut &mut &mut &mut arr;
84         let mrrrrvec = &mut &mut &mut &mut vec;
85         foo_mrslice(mrrrrarr.as_mut());
86         foo_mrslice(mrrrrvec.as_mut());
87     }
88     FakeAsRef.as_ref();
89     foo_rrrrmr(MoreRef.as_ref());
90 }
91 fn main() {
92     not_ok();
93     ok();
94 }