|
| 1 | +use clippy_config::Conf; |
1 | 2 | use clippy_utils::diagnostics::span_lint_and_sugg;
|
| 3 | +use clippy_utils::msrvs::{self, Msrv}; |
2 | 4 | use clippy_utils::source::snippet_with_context;
|
3 | 5 | use clippy_utils::{expr_or_init, is_in_const_context, std_or_core};
|
4 | 6 | use rustc_errors::Applicability;
|
5 | 7 | use rustc_hir::{BinOpKind, Expr, ExprKind};
|
6 | 8 | use rustc_lint::{LateContext, LateLintPass};
|
7 | 9 | use rustc_middle::ty;
|
8 |
| -use rustc_session::declare_lint_pass; |
| 10 | +use rustc_session::impl_lint_pass; |
9 | 11 | use rustc_span::symbol::sym;
|
10 | 12 |
|
11 | 13 | declare_clippy_lint! {
|
@@ -36,16 +38,25 @@ declare_clippy_lint! {
|
36 | 38 | complexity,
|
37 | 39 | "manual slice size calculation"
|
38 | 40 | }
|
39 |
| -declare_lint_pass!(ManualSliceSizeCalculation => [MANUAL_SLICE_SIZE_CALCULATION]); |
| 41 | +impl_lint_pass!(ManualSliceSizeCalculation => [MANUAL_SLICE_SIZE_CALCULATION]); |
| 42 | + |
| 43 | +pub struct ManualSliceSizeCalculation { |
| 44 | + msrv: Msrv, |
| 45 | +} |
| 46 | + |
| 47 | +impl ManualSliceSizeCalculation { |
| 48 | + pub fn new(conf: &Conf) -> Self { |
| 49 | + Self { msrv: conf.msrv } |
| 50 | + } |
| 51 | +} |
40 | 52 |
|
41 | 53 | impl<'tcx> LateLintPass<'tcx> for ManualSliceSizeCalculation {
|
42 | 54 | fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx Expr<'tcx>) {
|
43 | 55 | if let ExprKind::Binary(ref op, left, right) = expr.kind
|
44 | 56 | && BinOpKind::Mul == op.node
|
45 | 57 | && !expr.span.from_expansion()
|
46 |
| - // Does not apply inside const because size_of_val is not cost in stable. |
47 |
| - && !is_in_const_context(cx) |
48 | 58 | && let Some((receiver, refs_count)) = simplify(cx, left, right)
|
| 59 | + && (!is_in_const_context(cx) || self.msrv.meets(cx, msrvs::CONST_SIZE_OF_VAL)) |
49 | 60 | {
|
50 | 61 | let ctxt = expr.span.ctxt();
|
51 | 62 | let mut app = Applicability::MachineApplicable;
|
|
0 commit comments