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 {
25 let astronomers_pi = 10;
26 let ext_arr: [usize; 1] = [2];
27 let ext_str = SomeStruct { some_field: 10 };
29 let mut opt = Some(42);
30 let ext_opt = Some(42);
31 let nested_opt = Some(Some(42));
32 let nested_tuple_opt = Some(Some((42, 43)));
35 // Should lint - Option
36 let _ = opt.unwrap_or(2);
37 let _ = opt.unwrap_or(astronomers_pi);
38 let _ = opt.unwrap_or(ext_str.some_field);
39 let _ = opt.unwrap_or_else(|| ext_arr[0]);
40 let _ = opt.and(ext_opt);
41 let _ = opt.or(ext_opt);
43 let _ = opt.get_or_insert(2);
45 let _ = nested_tuple_opt.unwrap_or(Some((1, 2)));
46 let _ = cond.then_some(astronomers_pi);
48 // Cases when unwrap is not called on a simple variable
49 let _ = Some(10).unwrap_or(2);
50 let _ = Some(10).and(ext_opt);
51 let _: Option<usize> = None.or(ext_opt);
52 let _ = None.get_or_insert(2);
53 let _: Result<usize, usize> = None.ok_or(2);
54 let _: Option<usize> = None.or(None);
56 let mut deep = Deep(Some(42));
57 let _ = deep.0.unwrap_or(2);
58 let _ = deep.0.and(ext_opt);
59 let _ = deep.0.or(None);
60 let _ = deep.0.get_or_insert(2);
61 let _ = deep.0.ok_or(2);
63 // Should not lint - Option
64 let _ = opt.unwrap_or_else(|| ext_str.return_some_field());
65 let _ = nested_opt.unwrap_or_else(|| Some(some_call()));
66 let _ = nested_tuple_opt.unwrap_or_else(|| Some((some_call(), some_call())));
67 let _ = opt.or_else(some_call);
68 let _ = opt.or_else(|| some_call());
69 let _: Result<usize, usize> = opt.ok_or_else(|| some_call());
70 let _: Result<usize, usize> = opt.ok_or_else(some_call);
71 let _ = deep.0.get_or_insert_with(|| some_call());
72 let _ = deep.0.or_else(some_call);
73 let _ = deep.0.or_else(|| some_call());
74 let _ = opt.ok_or_else(|| ext_arr[0]);
76 // should not lint, bind_instead_of_map takes priority
77 let _ = Some(10).and_then(|idx| Some(ext_arr[idx]));
78 let _ = Some(10).and_then(|idx| Some(idx));
80 // should lint, bind_instead_of_map doesn't apply
81 let _: Option<usize> = None.or(Some(3));
82 let _ = deep.0.or(Some(3));
83 let _ = opt.or(Some(3));
85 // Should lint - Result
86 let res: Result<usize, usize> = Err(5);
87 let res2: Result<usize, SomeStruct> = Err(SomeStruct { some_field: 5 });
89 let _ = res2.unwrap_or(2);
90 let _ = res2.unwrap_or(astronomers_pi);
91 let _ = res2.unwrap_or(ext_str.some_field);
93 // Should not lint - Result
94 let _ = res.unwrap_or_else(|err| err);
95 let _ = res.unwrap_or_else(|err| ext_arr[err]);
96 let _ = res2.unwrap_or_else(|err| err.some_field);
97 let _ = res2.unwrap_or_else(|err| err.return_some_field());
98 let _ = res2.unwrap_or_else(|_| ext_str.return_some_field());
100 // should not lint, bind_instead_of_map takes priority
101 let _: Result<usize, usize> = res.and_then(|x| Ok(x));
102 let _: Result<usize, usize> = res.or_else(|err| Err(err));
104 let _: Result<usize, usize> = res.and_then(|_| Ok(2));
105 let _: Result<usize, usize> = res.and_then(|_| Ok(astronomers_pi));
106 let _: Result<usize, usize> = res.and_then(|_| Ok(ext_str.some_field));
108 let _: Result<usize, usize> = res.or_else(|_| Err(2));
109 let _: Result<usize, usize> = res.or_else(|_| Err(astronomers_pi));
110 let _: Result<usize, usize> = res.or_else(|_| Err(ext_str.some_field));
112 // should lint, bind_instead_of_map doesn't apply
113 let _: Result<usize, usize> = res.and(Err(2));
114 let _: Result<usize, usize> = res.and(Err(astronomers_pi));
115 let _: Result<usize, usize> = res.and(Err(ext_str.some_field));
117 let _: Result<usize, usize> = res.or(Ok(2));
118 let _: Result<usize, usize> = res.or(Ok(astronomers_pi));
119 let _: Result<usize, usize> = res.or(Ok(ext_str.some_field));
120 let _: Result<usize, usize> = res.
127 or(Ok(ext_str.some_field));
129 // neither bind_instead_of_map nor unnecessary_lazy_eval applies here
130 let _: Result<usize, usize> = res.and_then(|x| Err(x));
131 let _: Result<usize, usize> = res.or_else(|err| Ok(err));