#![allow(dead_code)] #![warn(clippy::manual_find_map)] #![allow(clippy::redundant_closure)] // FIXME suggestion may have redundant closure #![allow(clippy::useless_vec)] #![allow(clippy::struct_field_names)] fn main() { // is_some(), unwrap() let _ = (0..).find_map(|a| to_opt(a)); // ref pattern, expect() let _ = (0..).find_map(|a| to_opt(a)); // is_ok(), unwrap_or() let _ = (0..).find_map(|a| to_res(a).ok()); let _ = (1..5) .find_map(|y| *to_ref(to_opt(y))); let _ = (1..5) .find_map(|y| *to_ref(to_opt(y))); let _ = (1..5) .find_map(|y| to_ref(to_res(y)).ok()); let _ = (1..5) .find_map(|y| to_ref(to_res(y)).ok()); } #[rustfmt::skip] fn simple_equal() { iter::>().find_map(|x| x); iter::<&Option>().find_map(|x| *x); iter::<&&Option>().find_map(|x| **x); iter::>().find_map(|x| x.cloned()); iter::<&Option<&u8>>().find_map(|x| x.cloned()); iter::<&Option>().find_map(|x| x.as_deref()); iter::>().find_map(|y| to_ref(y).cloned()); iter::>().find_map(|x| x.ok()); iter::<&Result>().find_map(|x| x.ok()); iter::<&&Result>().find_map(|x| x.ok()); iter::>().find_map(|x| x.cloned().ok()); iter::<&Result<&u8, ()>>().find_map(|x| x.cloned().ok()); iter::<&Result>().find_map(|x| x.as_deref().ok()); iter::>().find_map(|y| to_ref(y).cloned().ok()); } fn no_lint() { // no shared code let _ = (0..).filter(|n| *n > 1).map(|n| n + 1); // very close but different since filter() provides a reference let _ = (0..).find(|n| to_opt(n).is_some()).map(|a| to_opt(a).unwrap()); // similar but different let _ = (0..).find(|n| to_opt(n).is_some()).map(|n| to_res(n).unwrap()); let _ = (0..) .find(|n| to_opt(n).map(|n| n + 1).is_some()) .map(|a| to_opt(a).unwrap()); } fn iter() -> impl Iterator { std::iter::empty() } fn to_opt(_: T) -> Option { unimplemented!() } fn to_res(_: T) -> Result { unimplemented!() } fn to_ref<'a, T>(_: T) -> &'a T { unimplemented!() } struct Issue8920<'a> { option_field: Option, result_field: Result, ref_field: Option<&'a usize>, } fn issue_8920() { let mut vec = vec![Issue8920 { option_field: Some(String::from("str")), result_field: Ok(String::from("str")), ref_field: Some(&1), }]; let _ = vec .iter() .find_map(|f| f.option_field.clone()); let _ = vec .iter() .find_map(|f| f.ref_field.cloned()); let _ = vec .iter() .find_map(|f| f.ref_field.copied()); let _ = vec .iter() .find_map(|f| f.result_field.clone().ok()); let _ = vec .iter() .find_map(|f| f.result_field.as_ref().ok()); let _ = vec .iter() .find_map(|f| f.result_field.as_deref().ok()); let _ = vec .iter_mut() .find_map(|f| f.result_field.as_mut().ok()); let _ = vec .iter_mut() .find_map(|f| f.result_field.as_deref_mut().ok()); let _ = vec .iter() .find_map(|f| f.result_field.to_owned().ok()); }