//@run-rustfix #![allow(unused_assignments, unused_mut, clippy::assign_op_pattern)] #![warn(clippy::implicit_saturating_sub)] use std::cmp::PartialEq; use std::ops::SubAssign; // Mock type struct Mock; impl PartialEq for Mock { fn eq(&self, _: &u32) -> bool { true } } impl SubAssign for Mock { fn sub_assign(&mut self, _: u32) {} } fn main() { // Tests for unsigned integers let end_8: u8 = 10; let start_8: u8 = 5; let mut u_8: u8 = end_8 - start_8; // Lint if u_8 > 0 { u_8 = u_8 - 1; } match end_8 { 10 => { // Lint if u_8 > 0 { u_8 -= 1; } }, 11 => u_8 += 1, _ => u_8 = 0, } let end_16: u16 = 40; let start_16: u16 = 35; let mut u_16: u16 = end_16 - start_16; // Lint if u_16 > 0 { u_16 -= 1; } let mut end_32: u32 = 7010; let mut start_32: u32 = 7000; let mut u_32: u32 = end_32 - start_32; // Lint if u_32 != 0 { u_32 -= 1; } // No Lint if u_32 > 0 { u_16 += 1; } // No Lint if u_32 != 0 { end_32 -= 1; start_32 += 1; } let mut end_64: u64 = 75001; let mut start_64: u64 = 75000; let mut u_64: u64 = end_64 - start_64; // Lint if u_64 > 0 { u_64 -= 1; } // Lint if 0 < u_64 { u_64 -= 1; } // Lint if 0 != u_64 { u_64 -= 1; } // No Lint if u_64 >= 1 { u_64 -= 1; } // No Lint if u_64 > 0 { end_64 -= 1; } // Tests for usize let end_usize: usize = 8054; let start_usize: usize = 8050; let mut u_usize: usize = end_usize - start_usize; // Lint if u_usize > 0 { u_usize -= 1; } // Tests for signed integers let endi_8: i8 = 10; let starti_8: i8 = 50; let mut i_8: i8 = endi_8 - starti_8; // Lint if i_8 > i8::MIN { i_8 -= 1; } // Lint if i_8 > i8::MIN { i_8 -= 1; } // Lint if i_8 != i8::MIN { i_8 -= 1; } // Lint if i_8 != i8::MIN { i_8 -= 1; } let endi_16: i16 = 45; let starti_16: i16 = 44; let mut i_16: i16 = endi_16 - starti_16; // Lint if i_16 > i16::MIN { i_16 -= 1; } // Lint if i_16 > i16::MIN { i_16 -= 1; } // Lint if i_16 != i16::MIN { i_16 -= 1; } // Lint if i_16 != i16::MIN { i_16 -= 1; } let endi_32: i32 = 45; let starti_32: i32 = 44; let mut i_32: i32 = endi_32 - starti_32; // Lint if i_32 > i32::MIN { i_32 -= 1; } // Lint if i_32 > i32::MIN { i_32 -= 1; } // Lint if i_32 != i32::MIN { i_32 -= 1; } // Lint if i_32 != i32::MIN { i_32 -= 1; } let endi_64: i64 = 45; let starti_64: i64 = 44; let mut i_64: i64 = endi_64 - starti_64; // Lint if i64::MIN < i_64 { i_64 -= 1; } // Lint if i64::MIN != i_64 { i_64 -= 1; } // Lint if i64::MIN < i_64 { i_64 -= 1; } // No Lint if i_64 > 0 { i_64 -= 1; } // No Lint if i_64 != 0 { i_64 -= 1; } // issue #7831 // No Lint if u_32 > 0 { u_32 -= 1; } else { println!("side effect"); } // Extended tests let mut m = Mock; let mut u_32 = 3000; let a = 200; let mut _b = 8; if m != 0 { m -= 1; } if a > 0 { _b -= 1; } if 0 > a { _b -= 1; } if u_32 > 0 { u_32 -= 1; } else { println!("don't lint this"); } if u_32 > 0 { println!("don't lint this"); u_32 -= 1; } if u_32 > 42 { println!("brace yourself!"); } else if u_32 > 0 { u_32 -= 1; } }