| #![warn(clippy::manual_abs_diff)] | |
| use std::time::Duration; | |
| fn main() { | |
| let a: usize = 5; | |
| let b: usize = 3; | |
| let c: usize = 8; | |
| let d: usize = 11; | |
| let _ = if a > b { a - b } else { b - a }; | |
| //~^ manual_abs_diff | |
| let _ = if a < b { b - a } else { a - b }; | |
| //~^ manual_abs_diff | |
| let _ = if 5 > b { 5 - b } else { b - 5 }; | |
| //~^ manual_abs_diff | |
| let _ = if b > 5 { b - 5 } else { 5 - b }; | |
| //~^ manual_abs_diff | |
| let _ = if a >= b { a - b } else { b - a }; | |
| //~^ manual_abs_diff | |
| let _ = if a <= b { b - a } else { a - b }; | |
| //~^ manual_abs_diff | |
| #[allow(arithmetic_overflow)] | |
| { | |
| let _ = if a > b { b - a } else { a - b }; | |
| let _ = if a < b { a - b } else { b - a }; | |
| } | |
| let _ = if (a + b) > (c + d) { | |
| //~^ manual_abs_diff | |
| (a + b) - (c + d) | |
| } else { | |
| (c + d) - (a + b) | |
| }; | |
| let _ = if (a + b) < (c + d) { | |
| //~^ manual_abs_diff | |
| (c + d) - (a + b) | |
| } else { | |
| (a + b) - (c + d) | |
| }; | |
| const A: usize = 5; | |
| const B: usize = 3; | |
| // check const context | |
| const _: usize = if A > B { A - B } else { B - A }; | |
| //~^ manual_abs_diff | |
| let a = Duration::from_secs(3); | |
| let b = Duration::from_secs(5); | |
| let _ = if a > b { a - b } else { b - a }; | |
| //~^ manual_abs_diff | |
| let a: i32 = 3; | |
| let b: i32 = -5; | |
| let _ = if a > b { a - b } else { b - a }; | |
| let _ = if a > b { (a - b) as u32 } else { (b - a) as u32 }; | |
| //~^ manual_abs_diff | |
| } | |
| // FIXME: bunch of patterns that should be linted | |
| fn fixme() { | |
| let a: usize = 5; | |
| let b: usize = 3; | |
| let c: usize = 8; | |
| let d: usize = 11; | |
| { | |
| let out; | |
| if a > b { | |
| out = a - b; | |
| } else { | |
| out = b - a; | |
| } | |
| } | |
| { | |
| let mut out = 0; | |
| if a > b { | |
| out = a - b; | |
| } else if a < b { | |
| out = b - a; | |
| } | |
| } | |
| #[allow(clippy::implicit_saturating_sub)] | |
| let _ = if a > b { | |
| a - b | |
| } else if a < b { | |
| b - a | |
| } else { | |
| 0 | |
| }; | |
| let a: i32 = 3; | |
| let b: i32 = 5; | |
| let _: u32 = if a > b { a - b } else { b - a } as u32; | |
| } | |
| fn non_primitive_ty() { | |
| #[derive(Eq, PartialEq, PartialOrd)] | |
| struct S(i32); | |
| impl std::ops::Sub for S { | |
| type Output = S; | |
| fn sub(self, rhs: Self) -> Self::Output { | |
| Self(self.0 - rhs.0) | |
| } | |
| } | |
| let (a, b) = (S(10), S(20)); | |
| let _ = if a < b { b - a } else { a - b }; | |
| } | |
| fn issue15254(a: &usize, b: &usize) -> usize { | |
| if a < b { | |
| //~^ manual_abs_diff | |
| b - a | |
| } else { | |
| a - b | |
| } | |
| } |