1 #![warn(clippy::integer_arithmetic, clippy::float_arithmetic)]
2 #![allow(clippy::no_effect, clippy::unnecessary_operation, clippy::op_ref)]
3
4 #[rustfmt::skip]
main()5 fn main() {
6 let mut i = 1i32;
7 let mut var1 = 0i32;
8 let mut var2 = -1i32;
9 1 + i;
10 i * 2;
11 1 %
12 i / 2; // no error, this is part of the expression in the preceding line
13 i - 2 + 2 - i;
14 -i;
15 i >> 1;
16 i << 1;
17
18 // no error, overflows are checked by `overflowing_literals`
19 -1;
20 -(-1);
21
22 i & 1; // no wrapping
23 i | 1;
24 i ^ 1;
25
26 i += 1;
27 i -= 1;
28 i *= 2;
29 i /= 2;
30 i /= 0;
31 i /= -1;
32 i /= var1;
33 i /= var2;
34 i %= 2;
35 i %= 0;
36 i %= -1;
37 i %= var1;
38 i %= var2;
39 i <<= 3;
40 i >>= 2;
41
42 // no errors
43 i |= 1;
44 i &= 1;
45 i ^= i;
46
47 // No errors for the following items because they are constant expressions
48 enum Foo {
49 Bar = -2,
50 }
51 struct Baz([i32; 1 + 1]);
52 union Qux {
53 field: [i32; 1 + 1],
54 }
55 type Alias = [i32; 1 + 1];
56
57 const FOO: i32 = -2;
58 static BAR: i32 = -2;
59
60 let _: [i32; 1 + 1] = [0, 0];
61
62 let _: [i32; 1 + 1] = {
63 let a: [i32; 1 + 1] = [0, 0];
64 a
65 };
66
67 trait Trait {
68 const ASSOC: i32 = 1 + 1;
69 }
70
71 impl Trait for Foo {
72 const ASSOC: i32 = {
73 let _: [i32; 1 + 1];
74 fn foo() {}
75 1 + 1
76 };
77 }
78 }
79
80 // warn on references as well! (#5328)
int_arith_ref()81 pub fn int_arith_ref() {
82 3 + &1;
83 &3 + 1;
84 &3 + &1;
85 }
86
foo(x: &i32) -> i3287 pub fn foo(x: &i32) -> i32 {
88 let a = 5;
89 a + x
90 }
91
bar(x: &i32, y: &i32) -> i3292 pub fn bar(x: &i32, y: &i32) -> i32 {
93 x + y
94 }
95
baz(x: i32, y: &i32) -> i3296 pub fn baz(x: i32, y: &i32) -> i32 {
97 x + y
98 }
99
qux(x: i32, y: i32) -> i32100 pub fn qux(x: i32, y: i32) -> i32 {
101 (&x + &y)
102 }
103