2 #![warn(clippy::unnecessary_lazy_evaluations)]
3 #![allow(clippy::redundant_closure)]
4 #![allow(clippy::bind_instead_of_map)]
5 #![allow(clippy::map_identity)]
7 struct Deep(Option<usize>);
15 fn return_some_field(&self) -> usize {
20 fn some_call<T: Default>() -> T {
24 struct Issue9427(i32);
26 impl Drop for Issue9427 {
28 println!("{}", self.0);
33 let astronomers_pi = 10;
34 let ext_arr: [usize; 1] = [2];
35 let ext_str = SomeStruct { some_field: 10 };
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)));
43 // Should lint - Option
44 let _ = opt.unwrap_or_else(|| 2);
45 let _ = opt.unwrap_or_else(|| astronomers_pi);
46 let _ = opt.unwrap_or_else(|| ext_str.some_field);
47 let _ = opt.unwrap_or_else(|| ext_arr[0]);
48 let _ = opt.and_then(|_| ext_opt);
49 let _ = opt.or_else(|| ext_opt);
50 let _ = opt.or_else(|| None);
51 let _ = opt.get_or_insert_with(|| 2);
52 let _ = opt.ok_or_else(|| 2);
53 let _ = nested_tuple_opt.unwrap_or_else(|| Some((1, 2)));
54 let _ = cond.then(|| astronomers_pi);
56 // Cases when unwrap is not called on a simple variable
57 let _ = Some(10).unwrap_or_else(|| 2);
58 let _ = Some(10).and_then(|_| ext_opt);
59 let _: Option<usize> = None.or_else(|| ext_opt);
60 let _ = None.get_or_insert_with(|| 2);
61 let _: Result<usize, usize> = None.ok_or_else(|| 2);
62 let _: Option<usize> = None.or_else(|| None);
64 let mut deep = Deep(Some(42));
65 let _ = deep.0.unwrap_or_else(|| 2);
66 let _ = deep.0.and_then(|_| ext_opt);
67 let _ = deep.0.or_else(|| None);
68 let _ = deep.0.get_or_insert_with(|| 2);
69 let _ = deep.0.ok_or_else(|| 2);
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]);
84 // Should not lint - bool
85 let _ = (0 == 1).then(|| Issue9427(0)); // Issue9427 has a significant drop
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));
91 // should lint, bind_instead_of_map doesn't apply
92 let _: Option<usize> = None.or_else(|| Some(3));
93 let _ = deep.0.or_else(|| Some(3));
94 let _ = opt.or_else(|| Some(3));
96 // Should lint - Result
97 let res: Result<usize, usize> = Err(5);
98 let res2: Result<usize, SomeStruct> = Err(SomeStruct { some_field: 5 });
100 let _ = res2.unwrap_or_else(|_| 2);
101 let _ = res2.unwrap_or_else(|_| astronomers_pi);
102 let _ = res2.unwrap_or_else(|_| ext_str.some_field);
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());
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));
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));
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));
123 // should lint, bind_instead_of_map doesn't apply
124 let _: Result<usize, usize> = res.and_then(|_| Err(2));
125 let _: Result<usize, usize> = res.and_then(|_| Err(astronomers_pi));
126 let _: Result<usize, usize> = res.and_then(|_| Err(ext_str.some_field));
128 let _: Result<usize, usize> = res.or_else(|_| Ok(2));
129 let _: Result<usize, usize> = res.or_else(|_| Ok(astronomers_pi));
130 let _: Result<usize, usize> = res.or_else(|_| Ok(ext_str.some_field));
131 let _: Result<usize, usize> = res.
138 or_else(|_| Ok(ext_str.some_field));
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));