137 lines
3.7 KiB
Rust
137 lines
3.7 KiB
Rust
//@aux-build:proc_macros.rs
|
|
#![warn(clippy::unnecessary_map_or)]
|
|
#![allow(clippy::no_effect)]
|
|
#![allow(clippy::eq_op)]
|
|
#![allow(clippy::unnecessary_lazy_evaluations)]
|
|
#![allow(clippy::nonminimal_bool)]
|
|
#[clippy::msrv = "1.70.0"]
|
|
#[macro_use]
|
|
extern crate proc_macros;
|
|
|
|
fn main() {
|
|
// should trigger
|
|
let _ = Some(5).map_or(false, |n| n == 5);
|
|
//~^ unnecessary_map_or
|
|
let _ = Some(5).map_or(true, |n| n != 5);
|
|
//~^ unnecessary_map_or
|
|
let _ = Some(5).map_or(false, |n| {
|
|
//~^ unnecessary_map_or
|
|
let _ = 1;
|
|
n == 5
|
|
});
|
|
let _ = Some(5).map_or(false, |n| {
|
|
//~^ unnecessary_map_or
|
|
let _ = n;
|
|
6 >= 5
|
|
});
|
|
let _ = Some(vec![5]).map_or(false, |n| n == [5]);
|
|
//~^ unnecessary_map_or
|
|
let _ = Some(vec![1]).map_or(false, |n| vec![2] == n);
|
|
//~^ unnecessary_map_or
|
|
let _ = Some(5).map_or(false, |n| n == n);
|
|
//~^ unnecessary_map_or
|
|
let _ = Some(5).map_or(false, |n| n == if 2 > 1 { n } else { 0 });
|
|
//~^ unnecessary_map_or
|
|
let _ = Ok::<Vec<i32>, i32>(vec![5]).map_or(false, |n| n == [5]);
|
|
//~^ unnecessary_map_or
|
|
let _ = Ok::<i32, i32>(5).map_or(false, |n| n == 5);
|
|
//~^ unnecessary_map_or
|
|
let _ = Some(5).map_or(false, |n| n == 5).then(|| 1);
|
|
//~^ unnecessary_map_or
|
|
let _ = Some(5).map_or(true, |n| n == 5);
|
|
//~^ unnecessary_map_or
|
|
let _ = Some(5).map_or(true, |n| 5 == n);
|
|
//~^ unnecessary_map_or
|
|
let _ = !Some(5).map_or(false, |n| n == 5);
|
|
//~^ unnecessary_map_or
|
|
let _ = Some(5).map_or(false, |n| n == 5) || false;
|
|
//~^ unnecessary_map_or
|
|
let _ = Some(5).map_or(false, |n| n == 5) as usize;
|
|
//~^ unnecessary_map_or
|
|
|
|
macro_rules! x {
|
|
() => {
|
|
Some(1)
|
|
};
|
|
}
|
|
// methods lints dont fire on macros
|
|
let _ = x!().map_or(false, |n| n == 1);
|
|
let _ = x!().map_or(false, |n| n == vec![1][0]);
|
|
|
|
msrv_1_69();
|
|
|
|
external! {
|
|
let _ = Some(5).map_or(false, |n| n == 5);
|
|
}
|
|
|
|
with_span! {
|
|
let _ = Some(5).map_or(false, |n| n == 5);
|
|
}
|
|
|
|
// check for presence of PartialEq, and alter suggestion to use `is_ok_and` if absent
|
|
struct S;
|
|
let r: Result<i32, S> = Ok(3);
|
|
let _ = r.map_or(false, |x| x == 7);
|
|
//~^ unnecessary_map_or
|
|
|
|
// lint constructs that are not comparaisons as well
|
|
let func = |_x| true;
|
|
let r: Result<i32, S> = Ok(3);
|
|
let _ = r.map_or(false, func);
|
|
//~^ unnecessary_map_or
|
|
let _ = Some(5).map_or(false, func);
|
|
//~^ unnecessary_map_or
|
|
let _ = Some(5).map_or(true, func);
|
|
//~^ unnecessary_map_or
|
|
|
|
#[derive(PartialEq)]
|
|
struct S2;
|
|
let r: Result<i32, S2> = Ok(4);
|
|
let _ = r.map_or(false, |x| x == 8);
|
|
//~^ unnecessary_map_or
|
|
|
|
// do not lint `Result::map_or(true, …)`
|
|
let r: Result<i32, S2> = Ok(4);
|
|
let _ = r.map_or(true, |x| x == 8);
|
|
}
|
|
|
|
#[clippy::msrv = "1.69.0"]
|
|
fn msrv_1_69() {
|
|
// is_some_and added in 1.70.0
|
|
let _ = Some(5).map_or(false, |n| n == if 2 > 1 { n } else { 0 });
|
|
}
|
|
|
|
#[clippy::msrv = "1.81.0"]
|
|
fn msrv_1_81() {
|
|
// is_none_or added in 1.82.0
|
|
let _ = Some(5).map_or(true, |n| n == if 2 > 1 { n } else { 0 });
|
|
}
|
|
|
|
fn with_refs(o: &mut Option<u32>) -> bool {
|
|
o.map_or(true, |n| n > 5) || (o as &Option<u32>).map_or(true, |n| n < 5)
|
|
//~^ unnecessary_map_or
|
|
//~| unnecessary_map_or
|
|
}
|
|
|
|
struct S;
|
|
|
|
impl std::ops::Deref for S {
|
|
type Target = Option<u32>;
|
|
fn deref(&self) -> &Self::Target {
|
|
&Some(0)
|
|
}
|
|
}
|
|
|
|
fn with_deref(o: &S) -> bool {
|
|
o.map_or(true, |n| n > 5)
|
|
//~^ unnecessary_map_or
|
|
}
|
|
|
|
fn issue14201(a: Option<String>, b: Option<String>, s: &String) -> bool {
|
|
let x = a.map_or(false, |a| a == *s);
|
|
//~^ unnecessary_map_or
|
|
let y = b.map_or(true, |b| b == *s);
|
|
//~^ unnecessary_map_or
|
|
x && y
|
|
}
|