]> git.lizzy.rs Git - rust.git/blob - tests/ui/unnecessary_lazy_eval.fixed
Auto merge of #5980 - matsujika:create-dir, 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
6 struct Deep(Option<usize>);
7
8 #[derive(Copy, Clone)]
9 struct SomeStruct {
10     some_field: usize,
11 }
12
13 impl SomeStruct {
14     fn return_some_field(&self) -> usize {
15         self.some_field
16     }
17 }
18
19 fn some_call<T: Default>() -> T {
20     T::default()
21 }
22
23 fn main() {
24     let astronomers_pi = 10;
25     let ext_arr: [usize; 1] = [2];
26     let ext_str = SomeStruct { some_field: 10 };
27
28     let mut opt = Some(42);
29     let ext_opt = Some(42);
30     let nested_opt = Some(Some(42));
31     let nested_tuple_opt = Some(Some((42, 43)));
32
33     // Should lint - Option
34     let _ = opt.unwrap_or(2);
35     let _ = opt.unwrap_or(astronomers_pi);
36     let _ = opt.unwrap_or(ext_str.some_field);
37     let _ = opt.unwrap_or(ext_arr[0]);
38     let _ = opt.and(ext_opt);
39     let _ = opt.or(ext_opt);
40     let _ = opt.or(None);
41     let _ = opt.get_or_insert(2);
42     let _ = opt.ok_or(2);
43     let _ = opt.ok_or(ext_arr[0]);
44
45     // Cases when unwrap is not called on a simple variable
46     let _ = Some(10).unwrap_or(2);
47     let _ = Some(10).and(ext_opt);
48     let _: Option<usize> = None.or(ext_opt);
49     let _ = None.get_or_insert(2);
50     let _: Result<usize, usize> = None.ok_or(2);
51     let _: Option<usize> = None.or(None);
52
53     let mut deep = Deep(Some(42));
54     let _ = deep.0.unwrap_or(2);
55     let _ = deep.0.and(ext_opt);
56     let _ = deep.0.or(None);
57     let _ = deep.0.get_or_insert(2);
58     let _ = deep.0.ok_or(2);
59
60     // Should not lint - Option
61     let _ = opt.unwrap_or_else(|| ext_str.return_some_field());
62     let _ = nested_opt.unwrap_or_else(|| Some(some_call()));
63     let _ = nested_tuple_opt.unwrap_or_else(|| Some((1, 2)));
64     let _ = nested_tuple_opt.unwrap_or_else(|| Some((some_call(), some_call())));
65     let _ = opt.or_else(some_call);
66     let _ = opt.or_else(|| some_call());
67     let _: Result<usize, usize> = opt.ok_or_else(|| some_call());
68     let _: Result<usize, usize> = opt.ok_or_else(some_call);
69     let _ = deep.0.get_or_insert_with(|| some_call());
70     let _ = deep.0.or_else(some_call);
71     let _ = deep.0.or_else(|| some_call());
72
73     // These are handled by bind_instead_of_map
74     let _ = Some(10).and_then(|idx| Some(ext_arr[idx]));
75     let _ = Some(10).and_then(|idx| Some(idx));
76     let _: Option<usize> = None.or_else(|| Some(3));
77     let _ = deep.0.or_else(|| Some(3));
78     let _ = opt.or_else(|| Some(3));
79
80     // Should lint - Result
81     let res: Result<usize, usize> = Err(5);
82     let res2: Result<usize, SomeStruct> = Err(SomeStruct { some_field: 5 });
83
84     let _ = res2.unwrap_or(2);
85     let _ = res2.unwrap_or(astronomers_pi);
86     let _ = res2.unwrap_or(ext_str.some_field);
87
88     // Should not lint - Result
89     let _ = res.unwrap_or_else(|err| err);
90     let _ = res.unwrap_or_else(|err| ext_arr[err]);
91     let _ = res2.unwrap_or_else(|err| err.some_field);
92     let _ = res2.unwrap_or_else(|err| err.return_some_field());
93     let _ = res2.unwrap_or_else(|_| ext_str.return_some_field());
94
95     let _: Result<usize, usize> = res.and_then(|x| Ok(x));
96     let _: Result<usize, usize> = res.and_then(|x| Err(x));
97
98     let _: Result<usize, usize> = res.or_else(|err| Ok(err));
99     let _: Result<usize, usize> = res.or_else(|err| Err(err));
100
101     // These are handled by bind_instead_of_map
102     let _: Result<usize, usize> = res.and_then(|_| Ok(2));
103     let _: Result<usize, usize> = res.and_then(|_| Ok(astronomers_pi));
104     let _: Result<usize, usize> = res.and_then(|_| Ok(ext_str.some_field));
105
106     let _: Result<usize, usize> = res.and_then(|_| Err(2));
107     let _: Result<usize, usize> = res.and_then(|_| Err(astronomers_pi));
108     let _: Result<usize, usize> = res.and_then(|_| Err(ext_str.some_field));
109
110     let _: Result<usize, usize> = res.or_else(|_| Ok(2));
111     let _: Result<usize, usize> = res.or_else(|_| Ok(astronomers_pi));
112     let _: Result<usize, usize> = res.or_else(|_| Ok(ext_str.some_field));
113
114     let _: Result<usize, usize> = res.or_else(|_| Err(2));
115     let _: Result<usize, usize> = res.or_else(|_| Err(astronomers_pi));
116     let _: Result<usize, usize> = res.or_else(|_| Err(ext_str.some_field));
117 }