| #![warn(clippy::manual_range_contains)] |
| #![allow(unused)] |
| #![allow(clippy::no_effect)] |
| #![allow(clippy::short_circuit_statement)] |
| #![allow(clippy::unnecessary_operation)] |
| #![allow(clippy::impossible_comparisons)] |
| #![allow(clippy::redundant_comparisons)] |
| |
| fn main() { |
| let x = 9_i32; |
| |
| // order shouldn't matter |
| (8..12).contains(&x); |
| //~^ manual_range_contains |
| (21..42).contains(&x); |
| //~^ manual_range_contains |
| (1..100).contains(&x); |
| //~^ manual_range_contains |
| |
| // also with inclusive ranges |
| (9..=99).contains(&x); |
| //~^ manual_range_contains |
| (1..=33).contains(&x); |
| //~^ manual_range_contains |
| (1..=999).contains(&x); |
| //~^ manual_range_contains |
| |
| // and the outside |
| !(8..12).contains(&x); |
| //~^ manual_range_contains |
| !(21..42).contains(&x); |
| //~^ manual_range_contains |
| !(1..100).contains(&x); |
| //~^ manual_range_contains |
| |
| // also with the outside of inclusive ranges |
| !(9..=99).contains(&x); |
| //~^ manual_range_contains |
| !(1..=33).contains(&x); |
| //~^ manual_range_contains |
| !(1..=999).contains(&x); |
| //~^ manual_range_contains |
| |
| // not a range.contains |
| x > 8 && x < 12; // lower bound not inclusive |
| x < 8 && x <= 12; // same direction |
| x >= 12 && 12 >= x; // same bounds |
| x < 8 && x > 12; // wrong direction |
| |
| x <= 8 || x >= 12; |
| x >= 8 || x >= 12; |
| x < 12 || 12 < x; |
| x >= 8 || x <= 12; |
| |
| // Fix #6315 |
| let y = 3.; |
| (0. ..1.).contains(&y); |
| //~^ manual_range_contains |
| y < 0. || y > 1.; // no lint: float `||` differs in NaN handling (fix #16706) |
| |
| // handle negatives #8721 |
| (-10..=10).contains(&x); |
| //~^ manual_range_contains |
| x >= 10 && x <= -10; |
| (-3. ..=3.).contains(&y); |
| //~^ manual_range_contains |
| y >= 3. && y <= -3.; |
| |
| // Fix #8745 |
| let z = 42; |
| (0..=10).contains(&x) && (0..=10).contains(&z); |
| //~^ manual_range_contains |
| //~| manual_range_contains |
| !(0..10).contains(&x) || !(0..10).contains(&z); |
| //~^ manual_range_contains |
| //~| manual_range_contains |
| // Make sure operators in parens don't give a breaking suggestion |
| ((x % 2 == 0) || (x < 0)) || (x >= 10); |
| } |
| |
| // Fix #6373 |
| pub const fn in_range(a: i32) -> bool { |
| 3 <= a && a <= 20 |
| } |
| |
| #[clippy::msrv = "1.34"] |
| fn msrv_1_34() { |
| let x = 5; |
| x >= 8 && x < 34; |
| } |
| |
| #[clippy::msrv = "1.35"] |
| fn msrv_1_35() { |
| let x = 5; |
| (8..35).contains(&x); |
| //~^ manual_range_contains |
| } |
| |
| // Fix #16706 |
| fn float_nan_no_lint() { |
| let q = 0.5_f64; |
| // these still lint — float && (in-range) is fine, NaN semantics match |
| (0.0..1.0).contains(&q); |
| //~^ manual_range_contains |
| (0.0..=1.0).contains(&q); |
| //~^ manual_range_contains |
| |
| // these do NOT lint — float || (out-of-range) NaN semantics differ |
| q < 0.0 || q > 1.0; // no lint |
| q < 0.0 || q >= 1.0; // no lint |
| |
| let r = 0.5_f32; |
| (0.0..1.0).contains(&r); |
| //~^ manual_range_contains |
| |
| r < 0.0 || r > 1.0; // no lint |
| } |