Skip to content

Commit ea4ebed

Browse files
committed
Auto merge of rust-lang#10309 - c410-f3r:arith, r=giraffate
[arithmetic_side_effects] Fix rust-lang#10252 Fix rust-lang#10252 At least for integers, shifts are already handled by the compiler. ---- changelog: [`arithmetic_side_effects`]: No longer lints on right or left shifts with constant integers, as the compiler warns about them. [rust-lang#10309](rust-lang/rust-clippy#10309) <!-- changelog_checked-->
2 parents 56fbfe5 + c439373 commit ea4ebed

File tree

3 files changed

+206
-123
lines changed

3 files changed

+206
-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
@@ -143,6 +143,10 @@ impl ArithmeticSideEffects {
143143
return;
144144
}
145145
let has_valid_op = if Self::is_integral(lhs_ty) && Self::is_integral(rhs_ty) {
146+
if let hir::BinOpKind::Shl | hir::BinOpKind::Shr = op.node {
147+
// At least for integers, shifts are already handled by the CTFE
148+
return;
149+
}
146150
let (actual_lhs, lhs_ref_counter) = peel_hir_expr_refs(lhs);
147151
let (actual_rhs, rhs_ref_counter) = peel_hir_expr_refs(rhs);
148152
match (
@@ -151,10 +155,13 @@ impl ArithmeticSideEffects {
151155
) {
152156
(None, None) => false,
153157
(None, Some(n)) | (Some(n), None) => match (&op.node, n) {
154-
(hir::BinOpKind::Div | hir::BinOpKind::Rem, 0) => false,
158+
// Division and module are always valid if applied to non-zero integers
159+
(hir::BinOpKind::Div | hir::BinOpKind::Rem, local_n) if local_n != 0 => true,
160+
// Addition or subtracting zeros is always a no-op
155161
(hir::BinOpKind::Add | hir::BinOpKind::Sub, 0)
156-
| (hir::BinOpKind::Div | hir::BinOpKind::Rem, _)
157-
| (hir::BinOpKind::Mul, 0 | 1) => true,
162+
// Multiplication by 1 or 0 will never overflow
163+
| (hir::BinOpKind::Mul, 0 | 1)
164+
=> true,
158165
_ => false,
159166
},
160167
(Some(_), Some(_)) => {

tests/ui/arithmetic_side_effects.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,24 +45,32 @@ impl_arith!(
4545
Div, Custom, Custom, div;
4646
Mul, Custom, Custom, mul;
4747
Rem, Custom, Custom, rem;
48+
Shl, Custom, Custom, shl;
49+
Shr, Custom, Custom, shr;
4850
Sub, Custom, Custom, sub;
4951

5052
Add, Custom, &Custom, add;
5153
Div, Custom, &Custom, div;
5254
Mul, Custom, &Custom, mul;
5355
Rem, Custom, &Custom, rem;
56+
Shl, Custom, &Custom, shl;
57+
Shr, Custom, &Custom, shr;
5458
Sub, Custom, &Custom, sub;
5559

5660
Add, &Custom, Custom, add;
5761
Div, &Custom, Custom, div;
5862
Mul, &Custom, Custom, mul;
5963
Rem, &Custom, Custom, rem;
64+
Shl, &Custom, Custom, shl;
65+
Shr, &Custom, Custom, shr;
6066
Sub, &Custom, Custom, sub;
6167

6268
Add, &Custom, &Custom, add;
6369
Div, &Custom, &Custom, div;
6470
Mul, &Custom, &Custom, mul;
6571
Rem, &Custom, &Custom, rem;
72+
Shl, &Custom, &Custom, shl;
73+
Shr, &Custom, &Custom, shr;
6674
Sub, &Custom, &Custom, sub;
6775
);
6876

@@ -71,24 +79,32 @@ impl_assign_arith!(
7179
DivAssign, Custom, Custom, div_assign;
7280
MulAssign, Custom, Custom, mul_assign;
7381
RemAssign, Custom, Custom, rem_assign;
82+
ShlAssign, Custom, Custom, shl_assign;
83+
ShrAssign, Custom, Custom, shr_assign;
7484
SubAssign, Custom, Custom, sub_assign;
7585

7686
AddAssign, Custom, &Custom, add_assign;
7787
DivAssign, Custom, &Custom, div_assign;
7888
MulAssign, Custom, &Custom, mul_assign;
7989
RemAssign, Custom, &Custom, rem_assign;
90+
ShlAssign, Custom, &Custom, shl_assign;
91+
ShrAssign, Custom, &Custom, shr_assign;
8092
SubAssign, Custom, &Custom, sub_assign;
8193

8294
AddAssign, &Custom, Custom, add_assign;
8395
DivAssign, &Custom, Custom, div_assign;
8496
MulAssign, &Custom, Custom, mul_assign;
8597
RemAssign, &Custom, Custom, rem_assign;
98+
ShlAssign, &Custom, Custom, shl_assign;
99+
ShrAssign, &Custom, Custom, shr_assign;
86100
SubAssign, &Custom, Custom, sub_assign;
87101

88102
AddAssign, &Custom, &Custom, add_assign;
89103
DivAssign, &Custom, &Custom, div_assign;
90104
MulAssign, &Custom, &Custom, mul_assign;
91105
RemAssign, &Custom, &Custom, rem_assign;
106+
ShlAssign, &Custom, &Custom, shl_assign;
107+
ShrAssign, &Custom, &Custom, shr_assign;
92108
SubAssign, &Custom, &Custom, sub_assign;
93109
);
94110

@@ -297,6 +313,10 @@ pub fn unknown_ops_or_runtime_ops_that_can_overflow() {
297313
_custom %= &Custom;
298314
_custom *= Custom;
299315
_custom *= &Custom;
316+
_custom >>= Custom;
317+
_custom >>= &Custom;
318+
_custom <<= Custom;
319+
_custom <<= &Custom;
300320
_custom += -Custom;
301321
_custom += &-Custom;
302322
_custom -= -Custom;
@@ -307,6 +327,10 @@ pub fn unknown_ops_or_runtime_ops_that_can_overflow() {
307327
_custom %= &-Custom;
308328
_custom *= -Custom;
309329
_custom *= &-Custom;
330+
_custom >>= -Custom;
331+
_custom >>= &-Custom;
332+
_custom <<= -Custom;
333+
_custom <<= &-Custom;
310334

311335
// Binary
312336
_n = _n + 1;
@@ -347,6 +371,10 @@ pub fn unknown_ops_or_runtime_ops_that_can_overflow() {
347371
_custom = Custom + &Custom;
348372
_custom = &Custom + Custom;
349373
_custom = &Custom + &Custom;
374+
_custom = _custom >> _custom;
375+
_custom = _custom >> &_custom;
376+
_custom = Custom << _custom;
377+
_custom = &Custom << _custom;
350378

351379
// Unary
352380
_n = -_n;

0 commit comments

Comments
 (0)