// run-rustfix #![warn(clippy::manual_filter)] #![allow(unused_variables, dead_code)] fn main() { Some(0).filter(|&x| x <= 0); Some(1).filter(|&x| x <= 0); Some(2).filter(|&x| x <= 0); Some(3).filter(|&x| x > 0); let y = Some(4); y.filter(|&x| x <= 0); Some(5).filter(|&x| x > 0); Some(6).as_ref().filter(|&x| x > &0); let external_cond = true; Some(String::new()).filter(|x| external_cond); Some(7).filter(|&x| external_cond); Some(8).filter(|&x| x != 0); Some(9).filter(|&x| x > 10 && x < 100); const fn f1() { // Don't lint, `.filter` is not const match Some(10) { Some(x) => { if x > 10 && x < 100 { Some(x) } else { None } }, None => None, }; } #[allow(clippy::blocks_in_if_conditions)] Some(11).filter(|&x| { println!("foo"); x > 10 && x < 100 }); match Some(12) { // Don't Lint, statement is lost by `.filter` Some(x) => { if x > 10 && x < 100 { println!("foo"); Some(x) } else { None } }, None => None, }; match Some(13) { // Don't Lint, because of `None => Some(1)` Some(x) => { if x > 10 && x < 100 { println!("foo"); Some(x) } else { None } }, None => Some(1), }; unsafe fn f(x: u32) -> bool { true } let _ = Some(14).filter(|&x| unsafe { f(x) }); let _ = Some(15).filter(|&x| unsafe { f(x) }); #[allow(clippy::redundant_pattern_matching)] if let Some(_) = Some(16) { Some(16) } else { Some(16).filter(|&x| x % 2 == 0) }; match Some((17, 17)) { // Not linted for now could be Some((x, y)) => { if y != x { Some((x, y)) } else { None } }, None => None, }; struct NamedTuple { pub x: u8, pub y: (i32, u32), } match Some(NamedTuple { // Not linted for now could be x: 17, y: (18, 19), }) { Some(NamedTuple { x, y }) => { if y.1 != x as u32 { Some(NamedTuple { x, y }) } else { None } }, None => None, }; }