| //@aux-build:proc_macro_derive.rs | |
| #![feature(f128)] | |
| #![feature(f16)] | |
| #![expect( | |
| clippy::assign_op_pattern, | |
| clippy::erasing_op, | |
| clippy::identity_op, | |
| clippy::no_effect, | |
| clippy::op_ref, | |
| clippy::unnecessary_owned_empty_strings | |
| )] | |
| #![warn(clippy::arithmetic_side_effects)] | |
| extern crate proc_macro_derive; | |
| use core::num::{NonZero, Saturating, Wrapping}; | |
| use core::time::Duration; | |
| const ONE: i32 = 1; | |
| const ZERO: i32 = 0; | |
| #[derive(Clone, Copy)] | |
| pub struct Custom; | |
| #[derive(proc_macro_derive::ShadowDerive)] | |
| pub struct Nothing; | |
| macro_rules! impl_arith { | |
| ( $( $_trait:ident, $lhs:ty, $rhs:ty, $method:ident; )* ) => { | |
| $( | |
| impl core::ops::$_trait<$lhs> for $rhs { | |
| type Output = Custom; | |
| fn $method(self, _: $lhs) -> Self::Output { todo!() } | |
| } | |
| )* | |
| } | |
| } | |
| macro_rules! impl_assign_arith { | |
| ( $( $_trait:ident, $lhs:ty, $rhs:ty, $method:ident; )* ) => { | |
| $( | |
| impl core::ops::$_trait<$lhs> for $rhs { | |
| fn $method(&mut self, _: $lhs) {} | |
| } | |
| )* | |
| } | |
| } | |
| impl_arith!( | |
| Add, Custom, Custom, add; | |
| Div, Custom, Custom, div; | |
| Mul, Custom, Custom, mul; | |
| Rem, Custom, Custom, rem; | |
| Shl, Custom, Custom, shl; | |
| Shr, Custom, Custom, shr; | |
| Sub, Custom, Custom, sub; | |
| Add, Custom, &Custom, add; | |
| Div, Custom, &Custom, div; | |
| Mul, Custom, &Custom, mul; | |
| Rem, Custom, &Custom, rem; | |
| Shl, Custom, &Custom, shl; | |
| Shr, Custom, &Custom, shr; | |
| Sub, Custom, &Custom, sub; | |
| Add, &Custom, Custom, add; | |
| Div, &Custom, Custom, div; | |
| Mul, &Custom, Custom, mul; | |
| Rem, &Custom, Custom, rem; | |
| Shl, &Custom, Custom, shl; | |
| Shr, &Custom, Custom, shr; | |
| Sub, &Custom, Custom, sub; | |
| Add, &Custom, &Custom, add; | |
| Div, &Custom, &Custom, div; | |
| Mul, &Custom, &Custom, mul; | |
| Rem, &Custom, &Custom, rem; | |
| Shl, &Custom, &Custom, shl; | |
| Shr, &Custom, &Custom, shr; | |
| Sub, &Custom, &Custom, sub; | |
| ); | |
| impl_assign_arith!( | |
| AddAssign, Custom, Custom, add_assign; | |
| DivAssign, Custom, Custom, div_assign; | |
| MulAssign, Custom, Custom, mul_assign; | |
| RemAssign, Custom, Custom, rem_assign; | |
| ShlAssign, Custom, Custom, shl_assign; | |
| ShrAssign, Custom, Custom, shr_assign; | |
| SubAssign, Custom, Custom, sub_assign; | |
| AddAssign, Custom, &Custom, add_assign; | |
| DivAssign, Custom, &Custom, div_assign; | |
| MulAssign, Custom, &Custom, mul_assign; | |
| RemAssign, Custom, &Custom, rem_assign; | |
| ShlAssign, Custom, &Custom, shl_assign; | |
| ShrAssign, Custom, &Custom, shr_assign; | |
| SubAssign, Custom, &Custom, sub_assign; | |
| AddAssign, &Custom, Custom, add_assign; | |
| DivAssign, &Custom, Custom, div_assign; | |
| MulAssign, &Custom, Custom, mul_assign; | |
| RemAssign, &Custom, Custom, rem_assign; | |
| ShlAssign, &Custom, Custom, shl_assign; | |
| ShrAssign, &Custom, Custom, shr_assign; | |
| SubAssign, &Custom, Custom, sub_assign; | |
| AddAssign, &Custom, &Custom, add_assign; | |
| DivAssign, &Custom, &Custom, div_assign; | |
| MulAssign, &Custom, &Custom, mul_assign; | |
| RemAssign, &Custom, &Custom, rem_assign; | |
| ShlAssign, &Custom, &Custom, shl_assign; | |
| ShrAssign, &Custom, &Custom, shr_assign; | |
| SubAssign, &Custom, &Custom, sub_assign; | |
| ); | |
| impl core::ops::Neg for Custom { | |
| type Output = Custom; | |
| fn neg(self) -> Self::Output { | |
| todo!() | |
| } | |
| } | |
| impl core::ops::Neg for &Custom { | |
| type Output = Custom; | |
| fn neg(self) -> Self::Output { | |
| todo!() | |
| } | |
| } | |
| 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 _ = 1f16 + 1f16; | |
| //~^ arithmetic_side_effects | |
| let _ = 1f32 + 1f32; | |
| let _ = 1f64 + 1f64; | |
| let _ = 1f128 + 1f128; | |
| //~^ arithmetic_side_effects | |
| let _ = Saturating(0u32) + Saturating(0u32); | |
| let _ = String::new() + ""; | |
| let _ = String::new() + &String::new(); | |
| let _ = Wrapping(0u32) + Wrapping(0u32); | |
| let saturating: Saturating<u32> = Saturating(0u32); | |
| let string: String = String::new(); | |
| let wrapping: Wrapping<u32> = Wrapping(0u32); | |
| let inferred_saturating = saturating + saturating; | |
| let inferred_string = string + ""; | |
| let inferred_wrapping = wrapping + wrapping; | |
| let _ = inferred_saturating + inferred_saturating; | |
| let _ = inferred_string + ""; | |
| let _ = inferred_wrapping + inferred_wrapping; | |
| } | |
| #[rustfmt::skip] | |
| 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 }; | |
| const _: i32 = { let mut n = 1; n = n + 1; n }; | |
| let _ = const { let mut n = 1; n = n + 1; n }; | |
| const _: i32 = { let mut n = 1; n = 1 + n; n }; | |
| let _ = const { let mut n = 1; n = 1 + n; n }; | |
| const _: i32 = 1 + 1; | |
| let _ = const { 1 + 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 }; | |
| } | |
| 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 += ZERO; | |
| _n += &ZERO; | |
| _n -= ZERO; | |
| _n -= &ZERO; | |
| _n /= 99; | |
| _n /= &99; | |
| _n %= 99; | |
| _n %= &99; | |
| _n *= 0; | |
| _n *= &0; | |
| _n *= 1; | |
| _n *= &1; | |
| _n *= ZERO; | |
| _n *= &ZERO; | |
| _n *= ONE; | |
| _n *= &ONE; | |
| _n += -0; | |
| _n += &-0; | |
| _n -= -0; | |
| _n -= &-0; | |
| _n += -ZERO; | |
| _n += &-ZERO; | |
| _n -= -ZERO; | |
| _n -= &-ZERO; | |
| _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 + ZERO; | |
| _n = _n + &ZERO; | |
| _n = ZERO + _n; | |
| _n = &ZERO + _n; | |
| _n = _n - 0; | |
| _n = _n - &0; | |
| _n = 0 - _n; | |
| _n = &0 - _n; | |
| _n = _n - ZERO; | |
| _n = _n - &ZERO; | |
| _n = ZERO - _n; | |
| _n = &ZERO - _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 = ZERO * _n; | |
| _n = &ZERO * _n; | |
| _n = _n * ONE; | |
| _n = _n * &ONE; | |
| _n = 1 * _n; | |
| _n = &1 * _n; | |
| _n = 23 + 85; | |
| // Method | |
| _n.saturating_div(1); | |
| _n.wrapping_div(1); | |
| _n.wrapping_rem(1); | |
| _n.wrapping_rem_euclid(1); | |
| _n.saturating_div(1); | |
| _n.checked_div(1); | |
| _n.checked_rem(1); | |
| _n.checked_rem_euclid(1); | |
| // Unary | |
| _n = -2147483647; | |
| _n = -i32::MAX; | |
| _n = -i32::MIN; | |
| _n = -&2147483647; | |
| _n = -&i32::MAX; | |
| _n = -&i32::MIN; | |
| } | |
| pub fn unknown_ops_or_runtime_ops_that_can_overflow() { | |
| let mut _n = i32::MAX; | |
| let mut _custom = Custom; | |
| // Assign | |
| _n += 1; | |
| //~^ arithmetic_side_effects | |
| _n += &1; | |
| //~^ arithmetic_side_effects | |
| _n -= 1; | |
| //~^ arithmetic_side_effects | |
| _n -= &1; | |
| //~^ arithmetic_side_effects | |
| _n /= 0; | |
| //~^ arithmetic_side_effects | |
| _n /= &0; | |
| //~^ arithmetic_side_effects | |
| _n %= 0; | |
| //~^ arithmetic_side_effects | |
| _n %= &0; | |
| //~^ arithmetic_side_effects | |
| _n *= 2; | |
| //~^ arithmetic_side_effects | |
| _n *= &2; | |
| //~^ arithmetic_side_effects | |
| _n += -1; | |
| //~^ arithmetic_side_effects | |
| _n += &-1; | |
| //~^ arithmetic_side_effects | |
| _n -= -1; | |
| //~^ arithmetic_side_effects | |
| _n -= &-1; | |
| //~^ arithmetic_side_effects | |
| _n /= -0; | |
| //~^ arithmetic_side_effects | |
| _n /= &-0; | |
| //~^ arithmetic_side_effects | |
| _n %= -0; | |
| //~^ arithmetic_side_effects | |
| _n %= &-0; | |
| //~^ arithmetic_side_effects | |
| _n *= -2; | |
| //~^ arithmetic_side_effects | |
| _n *= &-2; | |
| //~^ arithmetic_side_effects | |
| _custom += Custom; | |
| //~^ arithmetic_side_effects | |
| _custom += &Custom; | |
| //~^ arithmetic_side_effects | |
| _custom -= Custom; | |
| //~^ arithmetic_side_effects | |
| _custom -= &Custom; | |
| //~^ arithmetic_side_effects | |
| _custom /= Custom; | |
| //~^ arithmetic_side_effects | |
| _custom /= &Custom; | |
| //~^ arithmetic_side_effects | |
| _custom %= Custom; | |
| //~^ arithmetic_side_effects | |
| _custom %= &Custom; | |
| //~^ arithmetic_side_effects | |
| _custom *= Custom; | |
| //~^ arithmetic_side_effects | |
| _custom *= &Custom; | |
| //~^ arithmetic_side_effects | |
| _custom >>= Custom; | |
| //~^ arithmetic_side_effects | |
| _custom >>= &Custom; | |
| //~^ arithmetic_side_effects | |
| _custom <<= Custom; | |
| //~^ arithmetic_side_effects | |
| _custom <<= &Custom; | |
| //~^ arithmetic_side_effects | |
| _custom += -Custom; | |
| //~^ arithmetic_side_effects | |
| _custom += &-Custom; | |
| //~^ arithmetic_side_effects | |
| _custom -= -Custom; | |
| //~^ arithmetic_side_effects | |
| _custom -= &-Custom; | |
| //~^ arithmetic_side_effects | |
| _custom /= -Custom; | |
| //~^ arithmetic_side_effects | |
| _custom /= &-Custom; | |
| //~^ arithmetic_side_effects | |
| _custom %= -Custom; | |
| //~^ arithmetic_side_effects | |
| _custom %= &-Custom; | |
| //~^ arithmetic_side_effects | |
| _custom *= -Custom; | |
| //~^ arithmetic_side_effects | |
| _custom *= &-Custom; | |
| //~^ arithmetic_side_effects | |
| _custom >>= -Custom; | |
| //~^ arithmetic_side_effects | |
| _custom >>= &-Custom; | |
| //~^ arithmetic_side_effects | |
| _custom <<= -Custom; | |
| //~^ arithmetic_side_effects | |
| _custom <<= &-Custom; | |
| //~^ arithmetic_side_effects | |
| // Binary | |
| _n = _n + 1; | |
| //~^ arithmetic_side_effects | |
| _n = _n + &1; | |
| //~^ arithmetic_side_effects | |
| _n = 1 + _n; | |
| //~^ arithmetic_side_effects | |
| _n = &1 + _n; | |
| //~^ arithmetic_side_effects | |
| _n = _n - 1; | |
| //~^ arithmetic_side_effects | |
| _n = _n - &1; | |
| //~^ arithmetic_side_effects | |
| _n = 1 - _n; | |
| //~^ arithmetic_side_effects | |
| _n = &1 - _n; | |
| //~^ arithmetic_side_effects | |
| _n = _n / 0; | |
| //~^ arithmetic_side_effects | |
| _n = _n / &0; | |
| //~^ arithmetic_side_effects | |
| _n = _n % 0; | |
| //~^ arithmetic_side_effects | |
| _n = _n % &0; | |
| //~^ arithmetic_side_effects | |
| _n = _n * 2; | |
| //~^ arithmetic_side_effects | |
| _n = _n * &2; | |
| //~^ arithmetic_side_effects | |
| _n = 2 * _n; | |
| //~^ arithmetic_side_effects | |
| _n = &2 * _n; | |
| //~^ arithmetic_side_effects | |
| _n = 23 + &85; | |
| //~^ arithmetic_side_effects | |
| _n = &23 + 85; | |
| //~^ arithmetic_side_effects | |
| _n = &23 + &85; | |
| //~^ arithmetic_side_effects | |
| _custom = _custom + _custom; | |
| //~^ arithmetic_side_effects | |
| _custom = _custom + &_custom; | |
| //~^ arithmetic_side_effects | |
| _custom = Custom + _custom; | |
| //~^ arithmetic_side_effects | |
| _custom = &Custom + _custom; | |
| //~^ arithmetic_side_effects | |
| _custom = _custom - Custom; | |
| //~^ arithmetic_side_effects | |
| _custom = _custom - &Custom; | |
| //~^ arithmetic_side_effects | |
| _custom = Custom - _custom; | |
| //~^ arithmetic_side_effects | |
| _custom = &Custom - _custom; | |
| //~^ arithmetic_side_effects | |
| _custom = _custom / Custom; | |
| //~^ arithmetic_side_effects | |
| _custom = _custom / &Custom; | |
| //~^ arithmetic_side_effects | |
| _custom = _custom % Custom; | |
| //~^ arithmetic_side_effects | |
| _custom = _custom % &Custom; | |
| //~^ arithmetic_side_effects | |
| _custom = _custom * Custom; | |
| //~^ arithmetic_side_effects | |
| _custom = _custom * &Custom; | |
| //~^ arithmetic_side_effects | |
| _custom = Custom * _custom; | |
| //~^ arithmetic_side_effects | |
| _custom = &Custom * _custom; | |
| //~^ arithmetic_side_effects | |
| _custom = Custom + &Custom; | |
| //~^ arithmetic_side_effects | |
| _custom = &Custom + Custom; | |
| //~^ arithmetic_side_effects | |
| _custom = &Custom + &Custom; | |
| //~^ arithmetic_side_effects | |
| _custom = _custom >> _custom; | |
| //~^ arithmetic_side_effects | |
| _custom = _custom >> &_custom; | |
| //~^ arithmetic_side_effects | |
| _custom = Custom << _custom; | |
| //~^ arithmetic_side_effects | |
| _custom = &Custom << _custom; | |
| //~^ arithmetic_side_effects | |
| // Method | |
| _n.saturating_div(0); | |
| //~^ arithmetic_side_effects | |
| _n.wrapping_div(0); | |
| //~^ arithmetic_side_effects | |
| _n.wrapping_rem(0); | |
| //~^ arithmetic_side_effects | |
| _n.wrapping_rem_euclid(0); | |
| //~^ arithmetic_side_effects | |
| _n.saturating_div(_n); | |
| //~^ arithmetic_side_effects | |
| _n.wrapping_div(_n); | |
| //~^ arithmetic_side_effects | |
| _n.wrapping_rem(_n); | |
| //~^ arithmetic_side_effects | |
| _n.wrapping_rem_euclid(_n); | |
| //~^ arithmetic_side_effects | |
| _n.saturating_div(*Box::new(_n)); | |
| //~^ arithmetic_side_effects | |
| // Unary | |
| _n = -_n; | |
| //~^ arithmetic_side_effects | |
| _n = -&_n; | |
| //~^ arithmetic_side_effects | |
| _custom = -_custom; | |
| //~^ arithmetic_side_effects | |
| _custom = -&_custom; | |
| //~^ arithmetic_side_effects | |
| _ = -*Box::new(_n); | |
| //~^ arithmetic_side_effects | |
| } | |
| // Copied and pasted from the `integer_arithmetic` lint for comparison. | |
| pub fn integer_arithmetic() { | |
| let mut i = 1i32; | |
| let mut var1 = 0i32; | |
| let mut var2 = -1i32; | |
| 1 + i; | |
| //~^ arithmetic_side_effects | |
| i * 2; | |
| //~^ arithmetic_side_effects | |
| 1 % i / 2; | |
| //~^ arithmetic_side_effects | |
| i - 2 + 2 - i; | |
| //~^ arithmetic_side_effects | |
| -i; | |
| //~^ arithmetic_side_effects | |
| i >> 1; | |
| i << 1; | |
| -1; | |
| -(-1); | |
| i & 1; | |
| i | 1; | |
| i ^ 1; | |
| i += 1; | |
| //~^ arithmetic_side_effects | |
| i -= 1; | |
| //~^ arithmetic_side_effects | |
| i *= 2; | |
| //~^ arithmetic_side_effects | |
| i /= 2; | |
| i /= 0; | |
| //~^ arithmetic_side_effects | |
| i /= -1; | |
| i /= var1; | |
| //~^ arithmetic_side_effects | |
| i /= var2; | |
| //~^ arithmetic_side_effects | |
| i %= 2; | |
| i %= 0; | |
| //~^ arithmetic_side_effects | |
| i %= -1; | |
| i %= var1; | |
| //~^ arithmetic_side_effects | |
| i %= var2; | |
| //~^ arithmetic_side_effects | |
| i <<= 3; | |
| i >>= 2; | |
| i |= 1; | |
| i &= 1; | |
| i ^= i; | |
| } | |
| pub fn issue_10583(a: u16) -> u16 { | |
| 10 / a | |
| //~^ arithmetic_side_effects | |
| } | |
| pub fn issue_10767() { | |
| let n = &1.0; | |
| n + n; | |
| 3.1_f32 + &1.2_f32; | |
| &3.4_f32 + 1.5_f32; | |
| &3.5_f32 + &1.3_f32; | |
| } | |
| pub fn issue_10792() { | |
| struct One { | |
| a: u32, | |
| } | |
| struct Two { | |
| b: u32, | |
| c: u64, | |
| } | |
| const ONE: One = One { a: 1 }; | |
| const TWO: Two = Two { b: 2, c: 3 }; | |
| let _ = 10 / ONE.a; | |
| let _ = 10 / TWO.b; | |
| let _ = 10 / TWO.c; | |
| } | |
| pub fn issue_11145() { | |
| let mut x: Wrapping<u32> = Wrapping(0_u32); | |
| x += 1; | |
| } | |
| pub fn issue_11262() { | |
| let one = 1; | |
| let zero = 0; | |
| let _ = 2 / one; | |
| let _ = 2 / zero; | |
| } | |
| pub fn issue_11392() { | |
| fn example_div(unsigned: usize, nonzero_unsigned: NonZero<usize>) -> usize { | |
| unsigned / nonzero_unsigned | |
| } | |
| fn example_rem(unsigned: usize, nonzero_unsigned: NonZero<usize>) -> usize { | |
| unsigned % nonzero_unsigned | |
| } | |
| let (unsigned, nonzero_unsigned) = (0, NonZero::new(1).unwrap()); | |
| example_div(unsigned, nonzero_unsigned); | |
| example_rem(unsigned, nonzero_unsigned); | |
| } | |
| pub fn issue_11393() { | |
| fn example_div(x: Wrapping<i32>, maybe_zero: Wrapping<i32>) -> Wrapping<i32> { | |
| x / maybe_zero | |
| //~^ arithmetic_side_effects | |
| } | |
| fn example_rem(x: Wrapping<i32>, maybe_zero: Wrapping<i32>) -> Wrapping<i32> { | |
| x % maybe_zero | |
| //~^ arithmetic_side_effects | |
| } | |
| let [x, maybe_zero] = [1, 0].map(Wrapping); | |
| example_div(x, maybe_zero); | |
| example_rem(x, maybe_zero); | |
| } | |
| pub fn issue_12318() { | |
| use core::ops::{AddAssign, DivAssign, MulAssign, RemAssign, SubAssign}; | |
| let mut one: i32 = 1; | |
| one.add_assign(1); | |
| //~^ arithmetic_side_effects | |
| one.div_assign(1); | |
| one.mul_assign(1); | |
| one.rem_assign(1); | |
| one.sub_assign(1); | |
| //~^ arithmetic_side_effects | |
| } | |
| pub fn issue_15225() { | |
| use core::num::{NonZero, NonZeroU8}; | |
| let one = const { NonZeroU8::new(1).unwrap() }; | |
| let _ = one.get() - 1; | |
| let one: NonZero<u8> = const { NonZero::new(1).unwrap() }; | |
| let _ = one.get() - 1; | |
| type AliasedType = u8; | |
| let one: NonZero<AliasedType> = const { NonZero::new(1).unwrap() }; | |
| let _ = one.get() - 1; | |
| } | |
| pub fn explicit_methods() { | |
| use core::ops::Add; | |
| let one: i32 = 1; | |
| one.add(&one); | |
| //~^ arithmetic_side_effects | |
| Box::new(one).add(one); | |
| //~^ arithmetic_side_effects | |
| } | |
| pub fn issue_15943(days: u8) -> Duration { | |
| Duration::from_secs(86400 * u64::from(days)) | |
| } | |
| pub fn type_conversion_add() { | |
| let _ = u128::MAX + u128::from(1u8); | |
| //~^ arithmetic_side_effects | |
| let _ = 1u128 + u128::from(1u16); | |
| let _ = 1u128 + u128::from(1u32); | |
| let _ = 1u128 + u128::from(1u64); | |
| let _ = 1u64 + u64::from(1u8); | |
| let _ = 1u64 + u64::from(1u16); | |
| let _ = 1u64 + u64::from(1u32); | |
| let _ = 1u32 + u32::from(1u8); | |
| let _ = 1u32 + u32::from(1u16); | |
| let _ = 1u16 + u16::from(1u8); | |
| } | |
| pub fn type_conversion_mul() { | |
| let _ = u128::MAX * u128::from(1u8); | |
| //~^ arithmetic_side_effects | |
| let _ = 1u128 * u128::from(1u16); | |
| let _ = 1u128 * u128::from(1u32); | |
| let _ = 1u128 * u128::from(1u64); | |
| let _ = 1u64 * u64::from(1u8); | |
| let _ = 1u64 * u64::from(1u16); | |
| let _ = 1u64 * u64::from(1u32); | |
| let _ = 1u32 * u32::from(1u8); | |
| let _ = 1u32 * u32::from(1u16); | |
| let _ = 1u16 * u16::from(1u8); | |
| } | |
| pub fn type_conversion_does_not_escape_its_context() { | |
| struct Foo; | |
| impl Foo { | |
| fn from(n: u8) -> u64 { | |
| u64::from(n) | |
| } | |
| } | |
| let _ = Duration::from_secs(86400 * Foo::from(1)); | |
| //~^ arithmetic_side_effects | |
| fn shift(x: u8) -> u64 { | |
| 1 << u64::from(x) | |
| } | |
| let _ = Duration::from_secs(86400 * shift(1)); | |
| //~^ arithmetic_side_effects | |
| } | |
| pub fn issue_17005() { | |
| fn id_u8() -> u8 { | |
| 0 | |
| } | |
| fn id_u16() -> u16 { | |
| 0 | |
| } | |
| fn id_u32() -> u32 { | |
| 0 | |
| } | |
| // cast from a smaller unsigned type, sum cannot overflow | |
| let _ = 1u32 + id_u8() as u32; | |
| let _ = 1u32 + id_u16() as u32; | |
| let _ = 1u64 + id_u8() as u64; | |
| let _ = 1u64 + id_u16() as u64; | |
| let _ = 1u64 + id_u32() as u64; | |
| let _ = 0xf301_0000u32 + id_u16() as u32; | |
| } | |
| fn main() {} |