]> git.lizzy.rs Git - rust.git/blob - tests/ui/unnecessary_lazy_eval.fixed
Auto merge of #9516 - flip1995:rustup, r=flip1995
[rust.git] / tests / ui / unnecessary_lazy_eval.fixed
1 // run-rustfix
2 #![warn(clippy::unnecessary_lazy_evaluations)]
3 #![allow(clippy::redundant_closure)]
4 #![allow(clippy::bind_instead_of_map)]
5 #![allow(clippy::map_identity)]
6
7 struct Deep(Option<usize>);
8
9 #[derive(Copy, Clone)]
10 struct SomeStruct {
11     some_field: usize,
12 }
13
14 impl SomeStruct {
15     fn return_some_field(&self) -> usize {
16         self.some_field
17     }
18 }
19
20 fn some_call<T: Default>() -> T {
21     T::default()
22 }
23
24 struct Issue9427(i32);
25
26 impl Drop for Issue9427 {
27     fn drop(&mut self) {
28         println!("{}", self.0);
29     }
30 }
31
32 fn main() {
33     let astronomers_pi = 10;
34     let ext_arr: [usize; 1] = [2];
35     let ext_str = SomeStruct { some_field: 10 };
36
37     let mut opt = Some(42);
38     let ext_opt = Some(42);
39     let nested_opt = Some(Some(42));
40     let nested_tuple_opt = Some(Some((42, 43)));
41     let cond = true;
42
43     // Should lint - Option
44     let _ = opt.unwrap_or(2);
45     let _ = opt.unwrap_or(astronomers_pi);
46     let _ = opt.unwrap_or(ext_str.some_field);
47     let _ = opt.unwrap_or_else(|| ext_arr[0]);
48     let _ = opt.and(ext_opt);
49     let _ = opt.or(ext_opt);
50     let _ = opt.or(None);
51     let _ = opt.get_or_insert(2);
52     let _ = opt.ok_or(2);
53     let _ = nested_tuple_opt.unwrap_or(Some((1, 2)));
54     let _ = cond.then_some(astronomers_pi);
55
56     // Cases when unwrap is not called on a simple variable
57     let _ = Some(10).unwrap_or(2);
58     let _ = Some(10).and(ext_opt);
59     let _: Option<usize> = None.or(ext_opt);
60     let _ = None.get_or_insert(2);
61     let _: Result<usize, usize> = None.ok_or(2);
62     let _: Option<usize> = None.or(None);
63
64     let mut deep = Deep(Some(42));
65     let _ = deep.0.unwrap_or(2);
66     let _ = deep.0.and(ext_opt);
67     let _ = deep.0.or(None);
68     let _ = deep.0.get_or_insert(2);
69     let _ = deep.0.ok_or(2);
70
71     // Should not lint - Option
72     let _ = opt.unwrap_or_else(|| ext_str.return_some_field());
73     let _ = nested_opt.unwrap_or_else(|| Some(some_call()));
74     let _ = nested_tuple_opt.unwrap_or_else(|| Some((some_call(), some_call())));
75     let _ = opt.or_else(some_call);
76     let _ = opt.or_else(|| some_call());
77     let _: Result<usize, usize> = opt.ok_or_else(|| some_call());
78     let _: Result<usize, usize> = opt.ok_or_else(some_call);
79     let _ = deep.0.get_or_insert_with(|| some_call());
80     let _ = deep.0.or_else(some_call);
81     let _ = deep.0.or_else(|| some_call());
82     let _ = opt.ok_or_else(|| ext_arr[0]);
83
84     // Should not lint - bool
85     let _ = (0 == 1).then(|| Issue9427(0)); // Issue9427 has a significant drop
86
87     // should not lint, bind_instead_of_map takes priority
88     let _ = Some(10).and_then(|idx| Some(ext_arr[idx]));
89     let _ = Some(10).and_then(|idx| Some(idx));
90
91     // should lint, bind_instead_of_map doesn't apply
92     let _: Option<usize> = None.or(Some(3));
93     let _ = deep.0.or(Some(3));
94     let _ = opt.or(Some(3));
95
96     // Should lint - Result
97     let res: Result<usize, usize> = Err(5);
98     let res2: Result<usize, SomeStruct> = Err(SomeStruct { some_field: 5 });
99
100     let _ = res2.unwrap_or(2);
101     let _ = res2.unwrap_or(astronomers_pi);
102     let _ = res2.unwrap_or(ext_str.some_field);
103
104     // Should not lint - Result
105     let _ = res.unwrap_or_else(|err| err);
106     let _ = res.unwrap_or_else(|err| ext_arr[err]);
107     let _ = res2.unwrap_or_else(|err| err.some_field);
108     let _ = res2.unwrap_or_else(|err| err.return_some_field());
109     let _ = res2.unwrap_or_else(|_| ext_str.return_some_field());
110
111     // should not lint, bind_instead_of_map takes priority
112     let _: Result<usize, usize> = res.and_then(|x| Ok(x));
113     let _: Result<usize, usize> = res.or_else(|err| Err(err));
114
115     let _: Result<usize, usize> = res.and_then(|_| Ok(2));
116     let _: Result<usize, usize> = res.and_then(|_| Ok(astronomers_pi));
117     let _: Result<usize, usize> = res.and_then(|_| Ok(ext_str.some_field));
118
119     let _: Result<usize, usize> = res.or_else(|_| Err(2));
120     let _: Result<usize, usize> = res.or_else(|_| Err(astronomers_pi));
121     let _: Result<usize, usize> = res.or_else(|_| Err(ext_str.some_field));
122
123     // should lint, bind_instead_of_map doesn't apply
124     let _: Result<usize, usize> = res.and(Err(2));
125     let _: Result<usize, usize> = res.and(Err(astronomers_pi));
126     let _: Result<usize, usize> = res.and(Err(ext_str.some_field));
127
128     let _: Result<usize, usize> = res.or(Ok(2));
129     let _: Result<usize, usize> = res.or(Ok(astronomers_pi));
130     let _: Result<usize, usize> = res.or(Ok(ext_str.some_field));
131     let _: Result<usize, usize> = res.
132         // some lines
133         // some lines
134         // some lines
135         // some lines
136         // some lines
137         // some lines
138         or(Ok(ext_str.some_field));
139
140     // neither bind_instead_of_map nor unnecessary_lazy_eval applies here
141     let _: Result<usize, usize> = res.and_then(|x| Err(x));
142     let _: Result<usize, usize> = res.or_else(|err| Ok(err));
143 }