Auto merge of - Ryan1729:patch-1, r=flip1995

Add the other overloadable operations to suspicious_arithmetic_impl

In  I idly mused that the other user-overloadable operations could be added to this lint. Knowing that the lint was arguably incomplete was gnawing at the back of my mind, so I figured that I might as well make this PR, particularly given the change needed was so small.

changelog: Start warning on suspicious implementations of the `BitAnd`, `BitOr`, `BitXor`, `Rem`, `Shl`, and `Shr` traits.
This commit is contained in:
bors 2020-08-12 17:00:48 +00:00
commit 439bae62a4
3 changed files with 100 additions and 6 deletions

View file

@ -86,12 +86,20 @@ impl<'tcx> LateLintPass<'tcx> for SuspiciousImpl {
cx,
expr,
binop.node,
&["Add", "Sub", "Mul", "Div"],
&[
"Add", "Sub", "Mul", "Div", "Rem", "BitAnd", "BitOr", "BitXor", "Shl", "Shr",
],
&[
hir::BinOpKind::Add,
hir::BinOpKind::Sub,
hir::BinOpKind::Mul,
hir::BinOpKind::Div,
hir::BinOpKind::Rem,
hir::BinOpKind::BitAnd,
hir::BinOpKind::BitOr,
hir::BinOpKind::BitXor,
hir::BinOpKind::Shl,
hir::BinOpKind::Shr,
],
) {
span_lint(

View file

@ -1,5 +1,7 @@
#![warn(clippy::suspicious_arithmetic_impl)]
use std::ops::{Add, AddAssign, BitOrAssign, Div, DivAssign, Mul, MulAssign, Sub};
use std::ops::{
Add, AddAssign, BitAnd, BitOr, BitOrAssign, BitXor, Div, DivAssign, Mul, MulAssign, Rem, Shl, Shr, Sub,
};
#[derive(Copy, Clone)]
struct Foo(u32);
@ -61,6 +63,54 @@ impl Div for Foo {
}
}
impl Rem for Foo {
type Output = Foo;
fn rem(self, other: Self) -> Self {
Foo(self.0 / other.0)
}
}
impl BitAnd for Foo {
type Output = Foo;
fn bitand(self, other: Self) -> Self {
Foo(self.0 | other.0)
}
}
impl BitOr for Foo {
type Output = Foo;
fn bitor(self, other: Self) -> Self {
Foo(self.0 ^ other.0)
}
}
impl BitXor for Foo {
type Output = Foo;
fn bitxor(self, other: Self) -> Self {
Foo(self.0 & other.0)
}
}
impl Shl for Foo {
type Output = Foo;
fn shl(self, other: Self) -> Self {
Foo(self.0 >> other.0)
}
}
impl Shr for Foo {
type Output = Foo;
fn shr(self, other: Self) -> Self {
Foo(self.0 << other.0)
}
}
struct Bar(i32);
impl Add for Bar {

View file

@ -1,5 +1,5 @@
error: suspicious use of binary operator in `Add` impl
--> $DIR/suspicious_arithmetic_impl.rs:11:20
--> $DIR/suspicious_arithmetic_impl.rs:13:20
|
LL | Foo(self.0 - other.0)
| ^
@ -7,7 +7,7 @@ LL | Foo(self.0 - other.0)
= note: `-D clippy::suspicious-arithmetic-impl` implied by `-D warnings`
error: suspicious use of binary operator in `AddAssign` impl
--> $DIR/suspicious_arithmetic_impl.rs:17:23
--> $DIR/suspicious_arithmetic_impl.rs:19:23
|
LL | *self = *self - other;
| ^
@ -15,10 +15,46 @@ LL | *self = *self - other;
= note: `#[deny(clippy::suspicious_op_assign_impl)]` on by default
error: suspicious use of binary operator in `MulAssign` impl
--> $DIR/suspicious_arithmetic_impl.rs:30:16
--> $DIR/suspicious_arithmetic_impl.rs:32:16
|
LL | self.0 /= other.0;
| ^^
error: aborting due to 3 previous errors
error: suspicious use of binary operator in `Rem` impl
--> $DIR/suspicious_arithmetic_impl.rs:70:20
|
LL | Foo(self.0 / other.0)
| ^
error: suspicious use of binary operator in `BitAnd` impl
--> $DIR/suspicious_arithmetic_impl.rs:78:20
|
LL | Foo(self.0 | other.0)
| ^
error: suspicious use of binary operator in `BitOr` impl
--> $DIR/suspicious_arithmetic_impl.rs:86:20
|
LL | Foo(self.0 ^ other.0)
| ^
error: suspicious use of binary operator in `BitXor` impl
--> $DIR/suspicious_arithmetic_impl.rs:94:20
|
LL | Foo(self.0 & other.0)
| ^
error: suspicious use of binary operator in `Shl` impl
--> $DIR/suspicious_arithmetic_impl.rs:102:20
|
LL | Foo(self.0 >> other.0)
| ^^
error: suspicious use of binary operator in `Shr` impl
--> $DIR/suspicious_arithmetic_impl.rs:110:20
|
LL | Foo(self.0 << other.0)
| ^^
error: aborting due to 9 previous errors