Skip to content

Commit 5c2de90

Browse files
committed
[arithmetic_side_effects] Fix #10252
1 parent fd2d8be commit 5c2de90

File tree

5 files changed

+333
-123
lines changed

5 files changed

+333
-123
lines changed

clippy_lints/src/operators/arithmetic_side_effects.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,15 +141,22 @@ impl ArithmeticSideEffects {
141141
return;
142142
}
143143
let has_valid_op = if Self::is_integral(lhs_ty) && Self::is_integral(rhs_ty) {
144+
if let hir::BinOpKind::Shl | hir::BinOpKind::Shr = op.node {
145+
// At least for integers, shifts are already handled by the CTFE
146+
return;
147+
}
144148
let (actual_lhs, lhs_ref_counter) = peel_hir_expr_refs(lhs);
145149
let (actual_rhs, rhs_ref_counter) = peel_hir_expr_refs(rhs);
146150
match (Self::literal_integer(actual_lhs), Self::literal_integer(actual_rhs)) {
147151
(None, None) => false,
148152
(None, Some(n)) | (Some(n), None) => match (&op.node, n) {
149-
(hir::BinOpKind::Div | hir::BinOpKind::Rem, 0) => false,
153+
// Division and module are always valid if applied to non-zero integers
154+
(hir::BinOpKind::Div | hir::BinOpKind::Rem, local_n) if local_n != 0 => true,
155+
// Addition or subtracting zeros is always a no-op
150156
(hir::BinOpKind::Add | hir::BinOpKind::Sub, 0)
151-
| (hir::BinOpKind::Div | hir::BinOpKind::Rem, _)
152-
| (hir::BinOpKind::Mul, 0 | 1) => true,
157+
// Multiplication by 1 or 0 will never overflow
158+
| (hir::BinOpKind::Mul, 0 | 1)
159+
=> true,
153160
_ => false,
154161
},
155162
(Some(_), Some(_)) => {

tests/ui/arithmetic_side_effects.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,24 +42,32 @@ impl_arith!(
4242
Div, Custom, Custom, div;
4343
Mul, Custom, Custom, mul;
4444
Rem, Custom, Custom, rem;
45+
Shl, Custom, Custom, shl;
46+
Shr, Custom, Custom, shr;
4547
Sub, Custom, Custom, sub;
4648

4749
Add, Custom, &Custom, add;
4850
Div, Custom, &Custom, div;
4951
Mul, Custom, &Custom, mul;
5052
Rem, Custom, &Custom, rem;
53+
Shl, Custom, &Custom, shl;
54+
Shr, Custom, &Custom, shr;
5155
Sub, Custom, &Custom, sub;
5256

5357
Add, &Custom, Custom, add;
5458
Div, &Custom, Custom, div;
5559
Mul, &Custom, Custom, mul;
5660
Rem, &Custom, Custom, rem;
61+
Shl, &Custom, Custom, shl;
62+
Shr, &Custom, Custom, shr;
5763
Sub, &Custom, Custom, sub;
5864

5965
Add, &Custom, &Custom, add;
6066
Div, &Custom, &Custom, div;
6167
Mul, &Custom, &Custom, mul;
6268
Rem, &Custom, &Custom, rem;
69+
Shl, &Custom, &Custom, shl;
70+
Shr, &Custom, &Custom, shr;
6371
Sub, &Custom, &Custom, sub;
6472
);
6573

@@ -68,24 +76,32 @@ impl_assign_arith!(
6876
DivAssign, Custom, Custom, div_assign;
6977
MulAssign, Custom, Custom, mul_assign;
7078
RemAssign, Custom, Custom, rem_assign;
79+
ShlAssign, Custom, Custom, shl_assign;
80+
ShrAssign, Custom, Custom, shr_assign;
7181
SubAssign, Custom, Custom, sub_assign;
7282

7383
AddAssign, Custom, &Custom, add_assign;
7484
DivAssign, Custom, &Custom, div_assign;
7585
MulAssign, Custom, &Custom, mul_assign;
7686
RemAssign, Custom, &Custom, rem_assign;
87+
ShlAssign, Custom, &Custom, shl_assign;
88+
ShrAssign, Custom, &Custom, shr_assign;
7789
SubAssign, Custom, &Custom, sub_assign;
7890

7991
AddAssign, &Custom, Custom, add_assign;
8092
DivAssign, &Custom, Custom, div_assign;
8193
MulAssign, &Custom, Custom, mul_assign;
8294
RemAssign, &Custom, Custom, rem_assign;
95+
ShlAssign, &Custom, Custom, shl_assign;
96+
ShrAssign, &Custom, Custom, shr_assign;
8397
SubAssign, &Custom, Custom, sub_assign;
8498

8599
AddAssign, &Custom, &Custom, add_assign;
86100
DivAssign, &Custom, &Custom, div_assign;
87101
MulAssign, &Custom, &Custom, mul_assign;
88102
RemAssign, &Custom, &Custom, rem_assign;
103+
ShlAssign, &Custom, &Custom, shl_assign;
104+
ShrAssign, &Custom, &Custom, shr_assign;
89105
SubAssign, &Custom, &Custom, sub_assign;
90106
);
91107

@@ -270,6 +286,10 @@ pub fn unknown_ops_or_runtime_ops_that_can_overflow() {
270286
_custom %= &Custom;
271287
_custom *= Custom;
272288
_custom *= &Custom;
289+
_custom >>= Custom;
290+
_custom >>= &Custom;
291+
_custom <<= Custom;
292+
_custom <<= &Custom;
273293
_custom += -Custom;
274294
_custom += &-Custom;
275295
_custom -= -Custom;
@@ -280,6 +300,10 @@ pub fn unknown_ops_or_runtime_ops_that_can_overflow() {
280300
_custom %= &-Custom;
281301
_custom *= -Custom;
282302
_custom *= &-Custom;
303+
_custom >>= -Custom;
304+
_custom >>= &-Custom;
305+
_custom <<= -Custom;
306+
_custom <<= &-Custom;
283307

284308
// Binary
285309
_n = _n + 1;
@@ -320,6 +344,10 @@ pub fn unknown_ops_or_runtime_ops_that_can_overflow() {
320344
_custom = Custom + &Custom;
321345
_custom = &Custom + Custom;
322346
_custom = &Custom + &Custom;
347+
_custom = _custom >> _custom;
348+
_custom = _custom >> &_custom;
349+
_custom = Custom << _custom;
350+
_custom = &Custom << _custom;
323351

324352
// Unary
325353
_n = -_n;

0 commit comments

Comments
 (0)