2 #![warn(clippy::unnecessary_lazy_evaluation)]
3 #![allow(clippy::redundant_closure)]
4 #![allow(clippy::bind_instead_of_map)]
6 struct Deep(Option<usize>);
14 fn return_some_field(&self) -> usize {
19 fn some_call<T: Default>() -> T {
24 let astronomers_pi = 10;
25 let ext_arr: [usize; 1] = [2];
26 let ext_str = SomeStruct { some_field: 10 };
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)));
33 // Should lint - Option
34 let _ = opt.unwrap_or_else(|| 2);
35 let _ = opt.unwrap_or_else(|| astronomers_pi);
36 let _ = opt.unwrap_or_else(|| ext_str.some_field);
37 let _ = opt.unwrap_or_else(|| ext_arr[0]);
38 let _ = opt.and_then(|_| ext_opt);
39 let _ = opt.or_else(|| ext_opt);
40 let _ = opt.or_else(|| None);
41 let _ = opt.get_or_insert_with(|| 2);
42 let _ = opt.ok_or_else(|| 2);
43 let _ = opt.ok_or_else(|| ext_arr[0]);
45 // Cases when unwrap is not called on a simple variable
46 let _ = Some(10).unwrap_or_else(|| 2);
47 let _ = Some(10).and_then(|_| ext_opt);
48 let _: Option<usize> = None.or_else(|| ext_opt);
49 let _ = None.get_or_insert_with(|| 2);
50 let _: Result<usize, usize> = None.ok_or_else(|| 2);
51 let _: Option<usize> = None.or_else(|| None);
53 let mut deep = Deep(Some(42));
54 let _ = deep.0.unwrap_or_else(|| 2);
55 let _ = deep.0.and_then(|_| ext_opt);
56 let _ = deep.0.or_else(|| None);
57 let _ = deep.0.get_or_insert_with(|| 2);
58 let _ = deep.0.ok_or_else(|| 2);
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());
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));
80 // Should lint - Result
81 let res: Result<usize, usize> = Err(5);
82 let res2: Result<usize, SomeStruct> = Err(SomeStruct { some_field: 5 });
84 let _ = res2.unwrap_or_else(|_| 2);
85 let _ = res2.unwrap_or_else(|_| astronomers_pi);
86 let _ = res2.unwrap_or_else(|_| ext_str.some_field);
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());
95 let _: Result<usize, usize> = res.and_then(|x| Ok(x));
96 let _: Result<usize, usize> = res.and_then(|x| Err(x));
98 let _: Result<usize, usize> = res.or_else(|err| Ok(err));
99 let _: Result<usize, usize> = res.or_else(|err| Err(err));
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));
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));
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));
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));