Skip to content

Commit b1c784d

Browse files
committed
Fix false negatives by using expr_or_init
1 parent b47a322 commit b1c784d

File tree

3 files changed

+35
-8
lines changed

3 files changed

+35
-8
lines changed

clippy_lints/src/manual_slice_size_calculation.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use clippy_utils::diagnostics::span_lint_and_help;
2-
use clippy_utils::in_constant;
2+
use clippy_utils::{expr_or_init, in_constant};
33
use rustc_hir::{BinOpKind, Expr, ExprKind};
44
use rustc_lint::{LateContext, LateLintPass};
55
use rustc_middle::ty;
@@ -60,6 +60,9 @@ fn simplify<'tcx>(
6060
expr1: &'tcx Expr<'tcx>,
6161
expr2: &'tcx Expr<'tcx>,
6262
) -> Option<&'tcx Expr<'tcx>> {
63+
let expr1 = expr_or_init(cx, expr1);
64+
let expr2 = expr_or_init(cx, expr2);
65+
6366
simplify_half(cx, expr1, expr2).or_else(|| simplify_half(cx, expr2, expr1))
6467
}
6568

tests/ui/manual_slice_size_calculation.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ fn main() {
1212
let _ = size_of::<i32>() * s_i32.len(); // WARNING
1313
let _ = size_of::<i32>() * s_i32.len() * 5; // WARNING
1414

15+
let len = s_i32.len();
16+
let size = size_of::<i32>();
17+
let _ = len * size_of::<i32>(); // WARNING
18+
let _ = s_i32.len() * size; // WARNING
19+
let _ = len * size; // WARNING
20+
1521
// True negatives:
1622
let _ = size_of::<i32>() + s_i32.len(); // Ok, not a multiplication
1723
let _ = size_of::<i32>() * s_i32.partition_point(|_| true); // Ok, not len()
@@ -22,12 +28,6 @@ fn main() {
2228
// False negatives:
2329
let _ = 5 * size_of::<i32>() * s_i32.len(); // Ok (MISSED OPPORTUNITY)
2430
let _ = size_of::<i32>() * 5 * s_i32.len(); // Ok (MISSED OPPORTUNITY)
25-
26-
let len = s_i32.len();
27-
let size = size_of::<i32>();
28-
let _ = len * size_of::<i32>(); // Ok (MISSED OPPORTUNITY)
29-
let _ = s_i32.len() * size; // Ok (MISSED OPPORTUNITY)
30-
let _ = len * size; // Ok (MISSED OPPORTUNITY)
3131
}
3232

3333
const fn _const(s_i32: &[i32]) {

tests/ui/manual_slice_size_calculation.stderr

+25-1
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,29 @@ LL | let _ = size_of::<i32>() * s_i32.len() * 5; // WARNING
2323
|
2424
= help: consider using std::mem::size_of_value instead
2525

26-
error: aborting due to 3 previous errors
26+
error: manual slice size calculation
27+
--> $DIR/manual_slice_size_calculation.rs:17:13
28+
|
29+
LL | let _ = len * size_of::<i32>(); // WARNING
30+
| ^^^^^^^^^^^^^^^^^^^^^^
31+
|
32+
= help: consider using std::mem::size_of_value instead
33+
34+
error: manual slice size calculation
35+
--> $DIR/manual_slice_size_calculation.rs:18:13
36+
|
37+
LL | let _ = s_i32.len() * size; // WARNING
38+
| ^^^^^^^^^^^^^^^^^^
39+
|
40+
= help: consider using std::mem::size_of_value instead
41+
42+
error: manual slice size calculation
43+
--> $DIR/manual_slice_size_calculation.rs:19:13
44+
|
45+
LL | let _ = len * size; // WARNING
46+
| ^^^^^^^^^^
47+
|
48+
= help: consider using std::mem::size_of_value instead
49+
50+
error: aborting due to 6 previous errors
2751

0 commit comments

Comments
 (0)