diff options
Diffstat (limited to 'src/tools/clippy/tests/ui/arithmetic_side_effects.rs')
-rw-r--r-- | src/tools/clippy/tests/ui/arithmetic_side_effects.rs | 191 |
1 files changed, 179 insertions, 12 deletions
diff --git a/src/tools/clippy/tests/ui/arithmetic_side_effects.rs b/src/tools/clippy/tests/ui/arithmetic_side_effects.rs index f5390c746..b25e68f13 100644 --- a/src/tools/clippy/tests/ui/arithmetic_side_effects.rs +++ b/src/tools/clippy/tests/ui/arithmetic_side_effects.rs @@ -1,9 +1,75 @@ -#![allow(clippy::assign_op_pattern, clippy::unnecessary_owned_empty_strings)] -#![feature(inline_const, saturating_int_impl)] +#![allow( + clippy::assign_op_pattern, + clippy::erasing_op, + clippy::identity_op, + clippy::op_ref, + clippy::unnecessary_owned_empty_strings, + arithmetic_overflow, + unconditional_panic +)] +#![feature(const_mut_refs, inline_const, saturating_int_impl)] #![warn(clippy::arithmetic_side_effects)] use core::num::{Saturating, Wrapping}; +pub struct Custom; + +macro_rules! impl_arith { + ( $( $_trait:ident, $ty:ty, $method:ident; )* ) => { + $( + impl core::ops::$_trait<$ty> for Custom { + type Output = Self; + fn $method(self, _: $ty) -> Self::Output { Self } + } + )* + } +} + +impl_arith!( + Add, i32, add; + Div, i32, div; + Mul, i32, mul; + Sub, i32, sub; + + Add, f64, add; + Div, f64, div; + Mul, f64, mul; + Sub, f64, sub; +); + +pub fn association_with_structures_should_not_trigger_the_lint() { + enum Foo { + Bar = -2, + } + + impl Trait for Foo { + const ASSOC: i32 = { + let _: [i32; 1 + 1]; + fn foo() {} + 1 + 1 + }; + } + + struct Baz([i32; 1 + 1]); + + trait Trait { + const ASSOC: i32 = 1 + 1; + } + + type Alias = [i32; 1 + 1]; + + union Qux { + field: [i32; 1 + 1], + } + + let _: [i32; 1 + 1] = [0, 0]; + + let _: [i32; 1 + 1] = { + let a: [i32; 1 + 1] = [0, 0]; + a + }; +} + pub fn hard_coded_allowed() { let _ = 1f32 + 1f32; let _ = 1f64 + 1f64; @@ -26,7 +92,7 @@ pub fn hard_coded_allowed() { } #[rustfmt::skip] -pub fn non_overflowing_ops() { +pub fn const_ops_should_not_trigger_the_lint() { const _: i32 = { let mut n = 1; n += 1; n }; let _ = const { let mut n = 1; n += 1; n }; @@ -37,21 +103,122 @@ pub fn non_overflowing_ops() { let _ = const { let mut n = 1; n = 1 + n; n }; const _: i32 = 1 + 1; - let _ = 1 + 1; let _ = const { 1 + 1 }; - let mut _a = 1; - _a *= 1; - _a /= 1; + const _: i32 = { let mut n = 1; n = -1; n = -(-1); n = -n; n }; + let _ = const { let mut n = 1; n = -1; n = -(-1); n = -n; n }; } -#[rustfmt::skip] -pub fn overflowing_ops() { - let mut _a = 1; _a += 1; +pub fn non_overflowing_ops_or_ops_already_handled_by_the_compiler_should_not_trigger_the_lint() { + let mut _n = i32::MAX; + + // Assign + _n += 0; + _n += &0; + _n -= 0; + _n -= &0; + _n /= 99; + _n /= &99; + _n %= 99; + _n %= &99; + _n *= 0; + _n *= &0; + _n *= 1; + _n *= &1; + + // Binary + _n = _n + 0; + _n = _n + &0; + _n = 0 + _n; + _n = &0 + _n; + _n = _n - 0; + _n = _n - &0; + _n = 0 - _n; + _n = &0 - _n; + _n = _n / 99; + _n = _n / &99; + _n = _n % 99; + _n = _n % &99; + _n = _n * 0; + _n = _n * &0; + _n = 0 * _n; + _n = &0 * _n; + _n = _n * 1; + _n = _n * &1; + _n = 1 * _n; + _n = &1 * _n; + _n = 23 + 85; + + // Unary + _n = -1; + _n = -(-1); +} + +pub fn runtime_ops() { + let mut _n = i32::MAX; + + // Assign + _n += 1; + _n += &1; + _n -= 1; + _n -= &1; + _n /= 0; + _n /= &0; + _n %= 0; + _n %= &0; + _n *= 2; + _n *= &2; + + // Binary + _n = _n + 1; + _n = _n + &1; + _n = 1 + _n; + _n = &1 + _n; + _n = _n - 1; + _n = _n - &1; + _n = 1 - _n; + _n = &1 - _n; + _n = _n / 0; + _n = _n / &0; + _n = _n % 0; + _n = _n % &0; + _n = _n * 2; + _n = _n * &2; + _n = 2 * _n; + _n = &2 * _n; + _n = 23 + &85; + _n = &23 + 85; + _n = &23 + &85; - let mut _b = 1; _b = _b + 1; + // Custom + let _ = Custom + 0; + let _ = Custom + 1; + let _ = Custom + 2; + let _ = Custom + 0.0; + let _ = Custom + 1.0; + let _ = Custom + 2.0; + let _ = Custom - 0; + let _ = Custom - 1; + let _ = Custom - 2; + let _ = Custom - 0.0; + let _ = Custom - 1.0; + let _ = Custom - 2.0; + let _ = Custom / 0; + let _ = Custom / 1; + let _ = Custom / 2; + let _ = Custom / 0.0; + let _ = Custom / 1.0; + let _ = Custom / 2.0; + let _ = Custom * 0; + let _ = Custom * 1; + let _ = Custom * 2; + let _ = Custom * 0.0; + let _ = Custom * 1.0; + let _ = Custom * 2.0; - let mut _c = 1; _c = 1 + _c; + // Unary + _n = -_n; + _n = -&_n; } fn main() {} |