rust-clippy/tests/ui/arithmetic.rs
Matthias Krüger c7c7ab23aa integer_arithmetic: detect integer arithmetic on references.
Also fixes the same for float_arithmetic.

changelog: integer_arithmetic,float_arithmetic: fix false negatives with references on integers

Fixes #5328
2020-03-18 14:52:01 +01:00

146 lines
2.3 KiB
Rust

#![warn(clippy::integer_arithmetic, clippy::float_arithmetic)]
#![allow(
unused,
clippy::shadow_reuse,
clippy::shadow_unrelated,
clippy::no_effect,
clippy::unnecessary_operation,
clippy::op_ref,
clippy::trivially_copy_pass_by_ref
)]
#[rustfmt::skip]
fn main() {
let mut i = 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;
// no error, overflows are checked by `overflowing_literals`
-1;
-(-1);
i & 1; // no wrapping
i | 1;
i ^ 1;
i >> 1;
i << 1;
i += 1;
i -= 1;
i *= 2;
i /= 2;
i %= 2;
// no errors
i <<= 3;
i >>= 2;
i |= 1;
i &= 1;
i ^= i;
let mut f = 1.0f32;
f * 2.0;
1.0 + f;
f * 2.0;
f / 2.0;
f - 2.0 * 4.2;
-f;
f += 1.0;
f -= 1.0;
f *= 2.0;
f /= 2.0;
// no error, overflows are checked by `overflowing_literals`
-1.;
-(-1.);
// 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)
}
// also warn about floating point arith with references involved
pub fn float_arith_ref() {
3.1_f32 + &1.2_f32;
&3.4_f32 + 1.5_f32;
&3.5_f32 + &1.3_f32;
}
pub fn float_foo(f: &f32) -> f32 {
let a = 5.1;
a + f
}
pub fn float_bar(f1: &f32, f2: &f32) -> f32 {
f1 + f2
}
pub fn float_baz(f1: f32, f2: &f32) -> f32 {
f1 + f2
}
pub fn float_qux(f1: f32, f2: f32) -> f32 {
(&f1 + &f2)
}