af91e6ea8c
Show duplicate diagnostics in UI tests by default Duplicated diagnostics can indicate where redundant work is being done, this PR doesn't fix any of that but does indicate in which tests they're occurring for future investigation or to catch issues in future lints changelog: none
183 lines
4.6 KiB
Rust
183 lines
4.6 KiB
Rust
//@no-rustfix: overlapping suggestions
|
|
//@compile-flags: -Zdeduplicate-diagnostics=yes
|
|
|
|
#![feature(lint_reasons)]
|
|
#![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;
|
|
//~^ ERROR: this boolean expression can be simplified
|
|
//~| NOTE: `-D clippy::nonminimal-bool` implied by `-D warnings`
|
|
let _ = !false;
|
|
//~^ ERROR: this boolean expression can be simplified
|
|
let _ = !!a;
|
|
//~^ ERROR: this boolean expression can be simplified
|
|
let _ = false || a;
|
|
//~^ ERROR: this boolean expression can be simplified
|
|
// don't lint on cfgs
|
|
let _ = cfg!(you_shall_not_not_pass) && a;
|
|
let _ = a || !b || !c || !d || !e;
|
|
let _ = !(!a && b);
|
|
//~^ ERROR: this boolean expression can be simplified
|
|
let _ = !(!a || b);
|
|
//~^ ERROR: this boolean expression can be simplified
|
|
let _ = !a && !(b && c);
|
|
//~^ ERROR: this boolean expression can be simplified
|
|
}
|
|
|
|
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;
|
|
//~^ ERROR: this boolean expression can be simplified
|
|
let _ = a == b || c == 5 || a == b;
|
|
//~^ ERROR: this boolean expression can be simplified
|
|
let _ = a == b && c == 5 && b == a;
|
|
//~^ ERROR: this boolean expression can be simplified
|
|
let _ = a != b || !(a != b || c == d);
|
|
//~^ ERROR: this boolean expression can be simplified
|
|
let _ = a != b && !(a != b && c == d);
|
|
//~^ ERROR: this boolean expression can be simplified
|
|
}
|
|
|
|
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 {
|
|
//~^ ERROR: this boolean expression can be simplified
|
|
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) {} //~ ERROR: this boolean expression can be simplified
|
|
if !(a == 12) {} //~ ERROR: this boolean expression can be simplified
|
|
if !(12 != a) {} //~ ERROR: this boolean expression can be simplified
|
|
if !(a != 12) {} //~ ERROR: this boolean expression can be simplified
|
|
|
|
let b = true;
|
|
let c = false;
|
|
if !b == true {} //~ ERROR: this boolean expression can be simplified
|
|
if !b != true {} //~ ERROR: this boolean expression can be simplified
|
|
if true == !b {} //~ ERROR: this boolean expression can be simplified
|
|
if true != !b {} //~ ERROR: this boolean expression can be simplified
|
|
if !b == !c {} //~ ERROR: this boolean expression can be simplified
|
|
if !b != !c {} //~ ERROR: this boolean expression can be simplified
|
|
}
|
|
|
|
fn issue_12371(x: usize) -> bool {
|
|
// Should not warn!
|
|
!x != 0
|
|
}
|