Emit lint when rhs is negative

This commit is contained in:
Tianyi Song 2022-03-27 21:48:15 +08:00
parent a944ccb677
commit 52b563b283
3 changed files with 20 additions and 5 deletions

View file

@ -54,7 +54,7 @@ impl<'tcx> LateLintPass<'tcx> for IdentityOp {
check(cx, left, -1, e.span, right.span);
check(cx, right, -1, e.span, left.span);
},
BinOpKind::Rem => check_modulo(cx, left, right, e.span, left.span),
BinOpKind::Rem => check_remainder(cx, left, right, e.span, left.span),
_ => (),
}
}
@ -71,11 +71,11 @@ fn is_allowed(cx: &LateContext<'_>, cmp: BinOp, left: &Expr<'_>, right: &Expr<'_
&& constant_simple(cx, cx.typeck_results(), left) == Some(Constant::Int(1)))
}
fn check_modulo(cx: &LateContext<'_>, left: &Expr<'_>, right: &Expr<'_>, span: Span, arg: Span) {
fn check_remainder(cx: &LateContext<'_>, left: &Expr<'_>, right: &Expr<'_>, span: Span, arg: Span) {
let lhs_const = constant_full_int(cx, cx.typeck_results(), left);
let rhs_const = constant_full_int(cx, cx.typeck_results(), right);
if match (lhs_const, rhs_const) {
(Some(FullInt::S(lv)), Some(FullInt::S(rv))) => lv.abs() < rv,
(Some(FullInt::S(lv)), Some(FullInt::S(rv))) => lv.abs() < rv.abs(),
(Some(FullInt::U(lv)), Some(FullInt::U(rv))) => lv < rv,
_ => return,
} {

View file

@ -69,7 +69,10 @@ fn main() {
2 % 3;
-2 % 3;
2 % -3 + x;
-2 % -3 + x;
x + 1 % 3;
(x + 1) % 3; // no error
4 % 3; // no error
4 % -3; // no error
}

View file

@ -90,11 +90,23 @@ error: the operation is ineffective. Consider reducing it to `-2`
LL | -2 % 3;
| ^^^^^^
error: the operation is ineffective. Consider reducing it to `2`
--> $DIR/identity_op.rs:72:5
|
LL | 2 % -3 + x;
| ^^^^^^
error: the operation is ineffective. Consider reducing it to `-2`
--> $DIR/identity_op.rs:73:5
|
LL | -2 % -3 + x;
| ^^^^^^^
error: the operation is ineffective. Consider reducing it to `1`
--> $DIR/identity_op.rs:72:9
--> $DIR/identity_op.rs:74:9
|
LL | x + 1 % 3;
| ^^^^^
error: aborting due to 16 previous errors
error: aborting due to 18 previous errors