| #![warn(clippy::needless_bool)] | |
| #![allow( | |
| unused, | |
| dead_code, | |
| clippy::no_effect, | |
| clippy::if_same_then_else, | |
| clippy::equatable_if_let, | |
| clippy::needless_ifs, | |
| clippy::needless_return, | |
| clippy::self_named_constructors, | |
| clippy::struct_field_names | |
| )] | |
| use std::cell::Cell; | |
| macro_rules! bool_comparison_trigger { | |
| ($($i:ident: $def:expr, $stb:expr );+ $(;)*) => ( | |
| #[derive(Clone)] | |
| pub struct Trigger { | |
| $($i: (Cell<bool>, bool, bool)),+ | |
| } | |
| #[allow(dead_code)] | |
| impl Trigger { | |
| pub fn trigger(&self, key: &str) -> bool { | |
| $( | |
| if let stringify!($i) = key { | |
| return self.$i.1 && self.$i.2 == $def; | |
| } | |
| )+ | |
| false | |
| } | |
| } | |
| ) | |
| } | |
| fn main() { | |
| let x = true; | |
| let y = false; | |
| x; | |
| //~^^^^^ needless_bool | |
| !x; | |
| //~^^^^^ needless_bool | |
| !(x && y); | |
| //~^^^^^ needless_bool | |
| let a = 0; | |
| let b = 1; | |
| a != b; | |
| //~^^^^^ needless_bool | |
| a == b; | |
| //~^^^^^ needless_bool | |
| a >= b; | |
| //~^^^^^ needless_bool | |
| a > b; | |
| //~^^^^^ needless_bool | |
| a <= b; | |
| //~^^^^^ needless_bool | |
| a < b; | |
| //~^^^^^ needless_bool | |
| if x { | |
| x | |
| } else { | |
| false | |
| }; // would also be questionable, but we don't catch this yet | |
| bool_ret3(x); | |
| bool_ret4(x); | |
| bool_ret5(x, x); | |
| bool_ret6(x, x); | |
| needless_bool(x); | |
| needless_bool2(x); | |
| needless_bool3(x); | |
| needless_bool_condition(); | |
| if a == b { | |
| true | |
| } else { | |
| // Do not lint as this comment might be important | |
| false | |
| }; | |
| } | |
| fn bool_ret3(x: bool) -> bool { | |
| return x; | |
| //~^^^^^ needless_bool | |
| } | |
| fn bool_ret4(x: bool) -> bool { | |
| return !x; | |
| //~^^^^^ needless_bool | |
| } | |
| fn bool_ret5(x: bool, y: bool) -> bool { | |
| return x && y; | |
| //~^^^^^ needless_bool | |
| } | |
| fn bool_ret6(x: bool, y: bool) -> bool { | |
| return !(x && y); | |
| //~^^^^^ needless_bool | |
| } | |
| fn needless_bool(x: bool) { | |
| if x {}; | |
| //~^ bool_comparison | |
| } | |
| fn needless_bool2(x: bool) { | |
| if !x {}; | |
| //~^ bool_comparison | |
| } | |
| fn needless_bool3(x: bool) { | |
| bool_comparison_trigger! { | |
| test_one: false, false; | |
| test_three: false, false; | |
| test_two: true, true; | |
| } | |
| if x {}; | |
| //~^ bool_comparison | |
| if !x {}; | |
| //~^ bool_comparison | |
| } | |
| fn needless_bool_in_the_suggestion_wraps_the_predicate_of_if_else_statement_in_brackets() { | |
| let b = false; | |
| let returns_bool = || false; | |
| let x = if b { | |
| true | |
| } else { !returns_bool() }; | |
| //~^^^^^ needless_bool | |
| } | |
| unsafe fn no(v: u8) -> u8 { | |
| v | |
| } | |
| #[allow(clippy::unnecessary_operation)] | |
| fn needless_bool_condition() -> bool { | |
| (unsafe { no(4) } & 1 != 0); | |
| //~^^^^^ needless_bool | |
| let _brackets_unneeded = unsafe { no(4) } & 1 != 0; | |
| //~^ needless_bool | |
| fn foo() -> bool { | |
| // parentheses are needed here | |
| (unsafe { no(4) } & 1 != 0) | |
| //~^ needless_bool | |
| } | |
| foo() | |
| } | |
| fn issue12846() { | |
| let a = true; | |
| let b = false; | |
| // parentheses are needed here | |
| let _x = (a && b).then(|| todo!()); | |
| //~^ needless_bool | |
| let _x = (a && b) as u8; | |
| //~^ needless_bool | |
| // parentheses are not needed here | |
| let _x = a.then(|| todo!()); | |
| //~^ needless_bool | |
| } |