| //@no-rustfix: overlapping suggestions |
| #![allow( |
| unused, |
| clippy::diverging_sub_expression, |
| clippy::needless_if, |
| clippy::redundant_pattern_matching |
| )] |
| #![warn(clippy::nonminimal_bool)] |
| #![allow(clippy::useless_vec)] |
| |
| fn main() { |
| let a: bool = unimplemented!(); |
| let b: bool = unimplemented!(); |
| let c: bool = unimplemented!(); |
| let d: bool = unimplemented!(); |
| let e: bool = unimplemented!(); |
| let _ = !true; |
| //~^ nonminimal_bool |
| |
| let _ = !false; |
| //~^ nonminimal_bool |
| |
| let _ = !!a; |
| //~^ nonminimal_bool |
| |
| let _ = false || a; |
| //~^ nonminimal_bool |
| |
| // don't lint on cfgs |
| let _ = cfg!(you_shall_not_not_pass) && a; |
| let _ = a || !b || !c || !d || !e; |
| let _ = !(!a && b); |
| //~^ nonminimal_bool |
| |
| let _ = !(!a || b); |
| //~^ nonminimal_bool |
| |
| let _ = !a && !(b && c); |
| //~^ nonminimal_bool |
| } |
| |
| fn equality_stuff() { |
| let a: i32 = unimplemented!(); |
| let b: i32 = unimplemented!(); |
| let c: i32 = unimplemented!(); |
| let d: i32 = unimplemented!(); |
| let _ = a == b && c == 5 && a == b; |
| //~^ nonminimal_bool |
| |
| let _ = a == b || c == 5 || a == b; |
| //~^ nonminimal_bool |
| |
| let _ = a == b && c == 5 && b == a; |
| //~^ nonminimal_bool |
| |
| let _ = a != b || !(a != b || c == d); |
| //~^ nonminimal_bool |
| |
| let _ = a != b && !(a != b && c == d); |
| //~^ nonminimal_bool |
| } |
| |
| fn issue3847(a: u32, b: u32) -> bool { |
| const THRESHOLD: u32 = 1_000; |
| |
| if a < THRESHOLD && b >= THRESHOLD || a >= THRESHOLD && b < THRESHOLD { |
| return false; |
| } |
| true |
| } |
| |
| fn issue4548() { |
| fn f(_i: u32, _j: u32) -> u32 { |
| unimplemented!(); |
| } |
| |
| let i = 0; |
| let j = 0; |
| |
| if i != j && f(i, j) != 0 || i == j && f(i, j) != 1 {} |
| } |
| |
| fn check_expect() { |
| let a: bool = unimplemented!(); |
| #[expect(clippy::nonminimal_bool)] |
| let _ = !!a; |
| } |
| |
| fn issue9428() { |
| if matches!(true, true) && true { |
| //~^ nonminimal_bool |
| |
| println!("foo"); |
| } |
| } |
| |
| fn issue_10523() { |
| macro_rules! a { |
| ($v:expr) => { |
| $v.is_some() |
| }; |
| } |
| let x: Option<u32> = None; |
| if !a!(x) {} |
| } |
| |
| fn issue_10523_1() { |
| macro_rules! a { |
| ($v:expr) => { |
| !$v.is_some() |
| }; |
| } |
| let x: Option<u32> = None; |
| if a!(x) {} |
| } |
| |
| fn issue_10523_2() { |
| macro_rules! a { |
| () => { |
| !None::<u32>.is_some() |
| }; |
| } |
| if a!() {} |
| } |
| |
| fn issue_10435() { |
| let x = vec![0]; |
| let y = vec![1]; |
| let z = vec![2]; |
| |
| // vvv Should not lint |
| #[allow(clippy::nonminimal_bool)] |
| if !x.is_empty() && !(y.is_empty() || z.is_empty()) { |
| println!("{}", line!()); |
| } |
| |
| // vvv Should not lint (#10435 talks about a bug where it lints) |
| #[allow(clippy::nonminimal_bool)] |
| if !(x == [0]) { |
| println!("{}", line!()); |
| } |
| } |
| |
| fn issue10836() { |
| struct Foo(bool); |
| impl std::ops::Not for Foo { |
| type Output = bool; |
| |
| fn not(self) -> Self::Output { |
| !self.0 |
| } |
| } |
| |
| // Should not lint |
| let _: bool = !!Foo(true); |
| } |
| |
| fn issue11932() { |
| let x: i32 = unimplemented!(); |
| |
| #[allow(clippy::nonminimal_bool)] |
| let _ = x % 2 == 0 || { |
| // Should not lint |
| assert!(x > 0); |
| x % 3 == 0 |
| }; |
| } |
| |
| fn issue_5794() { |
| let a = 0; |
| if !(12 == a) {} |
| //~^ nonminimal_bool |
| if !(a == 12) {} |
| //~^ nonminimal_bool |
| if !(12 != a) {} |
| //~^ nonminimal_bool |
| if !(a != 12) {} |
| //~^ nonminimal_bool |
| |
| let b = true; |
| let c = false; |
| if !b == true {} |
| //~^ nonminimal_bool |
| //~| bool_comparison |
| //~| bool_comparison |
| if !b != true {} |
| //~^ nonminimal_bool |
| //~| bool_comparison |
| if true == !b {} |
| //~^ nonminimal_bool |
| //~| bool_comparison |
| //~| bool_comparison |
| if true != !b {} |
| //~^ nonminimal_bool |
| //~| bool_comparison |
| if !b == !c {} |
| //~^ nonminimal_bool |
| if !b != !c {} |
| //~^ nonminimal_bool |
| } |
| |
| fn issue_12371(x: usize) -> bool { |
| // Should not warn! |
| !x != 0 |
| } |
| |
| // Not linted because it is slow to do so |
| // https://github.com/rust-lang/rust-clippy/issues/13206 |
| fn many_ops(a: bool, b: bool, c: bool, d: bool, e: bool, f: bool) -> bool { |
| (a && c && f) || (!a && b && !d) || (!b && !c && !e) || (d && e && !f) |
| } |
| |
| fn issue14184(a: f32, b: bool) { |
| if !(a < 2.0 && !b) { |
| //~^ nonminimal_bool |
| println!("Hi"); |
| } |
| } |
| |
| mod issue14404 { |
| enum TyKind { |
| Ref(i32, i32, i32), |
| Other, |
| } |
| |
| struct Expr; |
| |
| fn is_mutable(expr: &Expr) -> bool { |
| todo!() |
| } |
| |
| fn should_not_give_macro(ty: TyKind, expr: Expr) { |
| if !(matches!(ty, TyKind::Ref(_, _, _)) && !is_mutable(&expr)) { |
| //~^ nonminimal_bool |
| todo!() |
| } |
| } |
| } |
| |
| fn dont_simplify_double_not_if_types_differ() { |
| struct S; |
| |
| impl std::ops::Not for S { |
| type Output = bool; |
| fn not(self) -> bool { |
| true |
| } |
| } |
| |
| // The lint must propose `if !!S`, not `if S`. |
| // FIXME: `bool_comparison` will propose to use `S == true` |
| // which is invalid. |
| if !S != true {} |
| //~^ nonminimal_bool |
| //~| bool_comparison |
| } |