3 #![warn(clippy::manual_find_map)]
4 #![allow(clippy::redundant_closure)] // FIXME suggestion may have redundant closure
8 let _ = (0..).find_map(|a| to_opt(a));
10 // ref pattern, expect()
11 let _ = (0..).find_map(|a| to_opt(a));
13 // is_ok(), unwrap_or()
14 let _ = (0..).find_map(|a| to_res(a).ok());
17 .find_map(|y| *to_ref(to_opt(y)));
19 .find_map(|y| *to_ref(to_opt(y)));
22 .find_map(|y| to_ref(to_res(y)).ok());
24 .find_map(|y| to_ref(to_res(y)).ok());
29 iter::<Option<u8>>().find_map(|x| x);
30 iter::<&Option<u8>>().find_map(|x| *x);
31 iter::<&&Option<u8>>().find_map(|x| **x);
32 iter::<Option<&u8>>().find_map(|x| x.cloned());
33 iter::<&Option<&u8>>().find_map(|x| x.cloned());
34 iter::<&Option<String>>().find_map(|x| x.as_deref());
35 iter::<Option<&String>>().find_map(|y| to_ref(y).cloned());
37 iter::<Result<u8, ()>>().find_map(|x| x.ok());
38 iter::<&Result<u8, ()>>().find_map(|x| x.ok());
39 iter::<&&Result<u8, ()>>().find_map(|x| x.ok());
40 iter::<Result<&u8, ()>>().find_map(|x| x.cloned().ok());
41 iter::<&Result<&u8, ()>>().find_map(|x| x.cloned().ok());
42 iter::<&Result<String, ()>>().find_map(|x| x.as_deref().ok());
43 iter::<Result<&String, ()>>().find_map(|y| to_ref(y).cloned().ok());
48 let _ = (0..).filter(|n| *n > 1).map(|n| n + 1);
50 // very close but different since filter() provides a reference
51 let _ = (0..).find(|n| to_opt(n).is_some()).map(|a| to_opt(a).unwrap());
53 // similar but different
54 let _ = (0..).find(|n| to_opt(n).is_some()).map(|n| to_res(n).unwrap());
56 .find(|n| to_opt(n).map(|n| n + 1).is_some())
57 .map(|a| to_opt(a).unwrap());
60 fn iter<T>() -> impl Iterator<Item = T> {
64 fn to_opt<T>(_: T) -> Option<T> {
68 fn to_res<T>(_: T) -> Result<T, ()> {
72 fn to_ref<'a, T>(_: T) -> &'a T {
76 struct Issue8920<'a> {
77 option_field: Option<String>,
78 result_field: Result<String, ()>,
79 ref_field: Option<&'a usize>,
83 let mut vec = vec![Issue8920 {
84 option_field: Some(String::from("str")),
85 result_field: Ok(String::from("str")),
91 .find_map(|f| f.option_field.clone());
95 .find_map(|f| f.ref_field.cloned());
99 .find_map(|f| f.ref_field.copied());
103 .find_map(|f| f.result_field.clone().ok());
107 .find_map(|f| f.result_field.as_ref().ok());
111 .find_map(|f| f.result_field.as_deref().ok());
115 .find_map(|f| f.result_field.as_mut().ok());
119 .find_map(|f| f.result_field.as_deref_mut().ok());
123 .find_map(|f| f.result_field.to_owned().ok());