//@aux-build:proc_macro_derive.rs #![warn(clippy::integer_arithmetic, clippy::float_arithmetic)] #![allow(clippy::no_effect, clippy::unnecessary_operation, clippy::op_ref)] extern crate proc_macro_derive; #[derive(proc_macro_derive::ShadowDerive)] pub struct Nothing; #[rustfmt::skip] fn main() { let mut i = 1i32; let mut var1 = 13i32; let mut var2 = -1i32; 1 + i; i * 2; 1 % i / 2; // no error, this is part of the expression in the preceding line i - 2 + 2 - i; -i; i >> 1; i << 1; // no error, overflows are checked by `overflowing_literals` -1; -(-1); i & 1; // no wrapping i | 1; i ^ 1; i += 1; i -= 1; i *= 2; i /= 2; i /= 0; i /= -1; i /= var1; i /= var2; i %= 2; i %= 0; i %= -1; i %= var1; i %= var2; i <<= 3; i >>= 2; // no errors i |= 1; i &= 1; i ^= i; // No errors for the following items because they are constant expressions enum Foo { Bar = -2, } struct Baz([i32; 1 + 1]); union Qux { field: [i32; 1 + 1], } type Alias = [i32; 1 + 1]; const FOO: i32 = -2; static BAR: i32 = -2; let _: [i32; 1 + 1] = [0, 0]; let _: [i32; 1 + 1] = { let a: [i32; 1 + 1] = [0, 0]; a }; trait Trait { const ASSOC: i32 = 1 + 1; } impl Trait for Foo { const ASSOC: i32 = { let _: [i32; 1 + 1]; fn foo() {} 1 + 1 }; } } // warn on references as well! (#5328) pub fn int_arith_ref() { 3 + &1; &3 + 1; &3 + &1; } pub fn foo(x: &i32) -> i32 { let a = 5; a + x } pub fn bar(x: &i32, y: &i32) -> i32 { x + y } pub fn baz(x: i32, y: &i32) -> i32 { x + y } pub fn qux(x: i32, y: i32) -> i32 { (&x + &y) }