Skip to content

Commit 170da89

Browse files
committed
Dereference argument of manual_div_ceil() if needed
1 parent 5b23bd4 commit 170da89

File tree

4 files changed

+25
-6
lines changed

4 files changed

+25
-6
lines changed

clippy_lints/src/manual_div_ceil.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use clippy_config::Conf;
22
use clippy_utils::diagnostics::span_lint_and_sugg;
33
use clippy_utils::msrvs::{self, Msrv};
4-
use clippy_utils::source::snippet_with_context;
54
use clippy_utils::sugg::{Sugg, has_enclosing_paren};
65
use clippy_utils::{SpanlessEq, sym};
76
use rustc_ast::{BinOpKind, LitIntType, LitKind, UnOp};
@@ -165,6 +164,7 @@ fn build_suggestion(
165164
applicability: &mut Applicability,
166165
) {
167166
let dividend_sugg = Sugg::hir_with_applicability(cx, lhs, "..", applicability).maybe_paren();
167+
let rhs_ty = cx.typeck_results().expr_ty(rhs);
168168
let type_suffix = if cx.typeck_results().expr_ty(lhs).is_numeric()
169169
&& matches!(
170170
lhs.kind,
@@ -182,7 +182,7 @@ fn build_suggestion(
182182
}
183183
)
184184
) {
185-
format!("_{}", cx.typeck_results().expr_ty(rhs))
185+
format!("_{rhs_ty}")
186186
} else {
187187
String::new()
188188
};
@@ -199,17 +199,20 @@ fn build_suggestion(
199199
} else {
200200
format!("{dividend_sugg_str}{type_suffix}")
201201
};
202-
let divisor_snippet = snippet_with_context(cx, rhs.span, expr.span.ctxt(), "..", applicability);
203202

204-
let sugg = format!("{suggestion_before_div_ceil}.div_ceil({})", divisor_snippet.0);
203+
// Dereference the RHS if it is a reference type
204+
let divisor_snippet = match Sugg::hir_with_context(cx, rhs, expr.span.ctxt(), "_", applicability) {
205+
sugg if rhs_ty.is_ref() => sugg.deref(),
206+
sugg => sugg,
207+
};
205208

206209
span_lint_and_sugg(
207210
cx,
208211
MANUAL_DIV_CEIL,
209212
expr.span,
210213
"manually reimplementing `div_ceil`",
211214
"consider using `.div_ceil()`",
212-
sugg,
215+
format!("{suggestion_before_div_ceil}.div_ceil({divisor_snippet})"),
213216
*applicability,
214217
);
215218
}

tests/ui/manual_div_ceil.fixed

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,3 +100,8 @@ fn issue_13950() {
100100
let _ = (-8 + y) / -7;
101101
let _ = (y - 8) / -7;
102102
}
103+
104+
fn issue_15705(size: u64, c: &u64) {
105+
let _ = size.div_ceil(*c);
106+
//~^ manual_div_ceil
107+
}

tests/ui/manual_div_ceil.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,3 +100,8 @@ fn issue_13950() {
100100
let _ = (-8 + y) / -7;
101101
let _ = (y - 8) / -7;
102102
}
103+
104+
fn issue_15705(size: u64, c: &u64) {
105+
let _ = (size + c - 1) / c;
106+
//~^ manual_div_ceil
107+
}

tests/ui/manual_div_ceil.stderr

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,5 +125,11 @@ error: manually reimplementing `div_ceil`
125125
LL | let _ = (7 + x) / 8;
126126
| ^^^^^^^^^^^ help: consider using `.div_ceil()`: `x.div_ceil(8)`
127127

128-
error: aborting due to 19 previous errors
128+
error: manually reimplementing `div_ceil`
129+
--> tests/ui/manual_div_ceil.rs:105:13
130+
|
131+
LL | let _ = (size + c - 1) / c;
132+
| ^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `size.div_ceil(*c)`
133+
134+
error: aborting due to 20 previous errors
129135

0 commit comments

Comments
 (0)