fix: manual_div_ceil wrongly unmangled macros

This commit is contained in:
Linshu Yang
2026-01-05 20:23:48 +00:00
committed by linshuy2
parent 31f04c7098
commit 93bf95b230
4 changed files with 49 additions and 24 deletions
@@ -148,7 +148,8 @@ fn build_suggestion(
rhs: &Expr<'_>,
applicability: &mut Applicability,
) {
let dividend_sugg = Sugg::hir_with_applicability(cx, lhs, "..", applicability).maybe_paren();
let ctxt = expr.span.ctxt();
let dividend_sugg = Sugg::hir_with_context(cx, lhs, ctxt, "..", applicability).maybe_paren();
let rhs_ty = cx.typeck_results().expr_ty(rhs);
let type_suffix = if cx.typeck_results().expr_ty(lhs).is_numeric()
&& matches!(
@@ -186,7 +187,7 @@ fn build_suggestion(
};
// Dereference the RHS if it is a reference type
let divisor_snippet = match Sugg::hir_with_context(cx, rhs, expr.span.ctxt(), "_", applicability) {
let divisor_snippet = match Sugg::hir_with_context(cx, rhs, ctxt, "_", applicability) {
sugg if rhs_ty.is_ref() => sugg.deref(),
sugg => sugg,
};
+9
View File
@@ -16,6 +16,12 @@ macro_rules! eight {
};
}
macro_rules! plus_one {
($val:expr) => {
($val + 1)
};
}
fn main() {
let x = 7_u32;
let y = 4_u32;
@@ -55,6 +61,9 @@ fn main() {
// Also test if RHS should be result of macro expansion
let _ = 33u32.div_ceil(eight!());
//~^ manual_div_ceil
let _ = plus_one!(x).div_ceil(y);
//~^ manual_div_ceil
}
fn issue_13843() {
+9
View File
@@ -16,6 +16,12 @@ macro_rules! eight {
};
}
macro_rules! plus_one {
($val:expr) => {
($val + 1)
};
}
fn main() {
let x = 7_u32;
let y = 4_u32;
@@ -55,6 +61,9 @@ fn main() {
// Also test if RHS should be result of macro expansion
let _ = (33u32 + 7) / eight!();
//~^ manual_div_ceil
let _ = (plus_one!(x) + (y - 1)) / y;
//~^ manual_div_ceil
}
fn issue_13843() {
+28 -22
View File
@@ -1,5 +1,5 @@
error: manually reimplementing `div_ceil`
--> tests/ui/manual_div_ceil.rs:25:13
--> tests/ui/manual_div_ceil.rs:31:13
|
LL | let _ = (x + (y - 1)) / y;
| ^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `x.div_ceil(y)`
@@ -8,25 +8,25 @@ LL | let _ = (x + (y - 1)) / y;
= help: to override `-D warnings` add `#[allow(clippy::manual_div_ceil)]`
error: manually reimplementing `div_ceil`
--> tests/ui/manual_div_ceil.rs:27:13
--> tests/ui/manual_div_ceil.rs:33:13
|
LL | let _ = ((y - 1) + x) / y;
| ^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `x.div_ceil(y)`
error: manually reimplementing `div_ceil`
--> tests/ui/manual_div_ceil.rs:29:13
--> tests/ui/manual_div_ceil.rs:35:13
|
LL | let _ = (x + y - 1) / y;
| ^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `x.div_ceil(y)`
error: manually reimplementing `div_ceil`
--> tests/ui/manual_div_ceil.rs:32:13
--> tests/ui/manual_div_ceil.rs:38:13
|
LL | let _ = (7_u32 + (4 - 1)) / 4;
| ^^^^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `7_u32.div_ceil(4)`
error: manually reimplementing `div_ceil`
--> tests/ui/manual_div_ceil.rs:34:13
--> tests/ui/manual_div_ceil.rs:40:13
|
LL | let _ = (7_i32 as u32 + (4 - 1)) / 4;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `(7_i32 as u32).div_ceil(4)`
@@ -54,100 +54,106 @@ LL | y!();
= note: this error originates in the macro `y` (in Nightly builds, run with -Z macro-backtrace for more info)
error: manually reimplementing `div_ceil`
--> tests/ui/manual_div_ceil.rs:56:13
--> tests/ui/manual_div_ceil.rs:62:13
|
LL | let _ = (33u32 + 7) / eight!();
| ^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `33u32.div_ceil(eight!())`
error: manually reimplementing `div_ceil`
--> tests/ui/manual_div_ceil.rs:62:13
--> tests/ui/manual_div_ceil.rs:65:13
|
LL | let _ = (plus_one!(x) + (y - 1)) / y;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `plus_one!(x).div_ceil(y)`
error: manually reimplementing `div_ceil`
--> tests/ui/manual_div_ceil.rs:71:13
|
LL | let _ = (2048 + x - 1) / x;
| ^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `2048_usize.div_ceil(x)`
error: manually reimplementing `div_ceil`
--> tests/ui/manual_div_ceil.rs:66:13
--> tests/ui/manual_div_ceil.rs:75:13
|
LL | let _ = (2048usize + x - 1) / x;
| ^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `2048usize.div_ceil(x)`
error: manually reimplementing `div_ceil`
--> tests/ui/manual_div_ceil.rs:70:13
--> tests/ui/manual_div_ceil.rs:79:13
|
LL | let _ = (2048_usize + x - 1) / x;
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `2048_usize.div_ceil(x)`
error: manually reimplementing `div_ceil`
--> tests/ui/manual_div_ceil.rs:74:13
--> tests/ui/manual_div_ceil.rs:83:13
|
LL | let _ = (x + 4 - 1) / 4;
| ^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `x.div_ceil(4)`
error: manually reimplementing `div_ceil`
--> tests/ui/manual_div_ceil.rs:77:18
--> tests/ui/manual_div_ceil.rs:86:18
|
LL | let _: u32 = (2048 + 6 - 1) / 6;
| ^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `2048_u32.div_ceil(6)`
error: manually reimplementing `div_ceil`
--> tests/ui/manual_div_ceil.rs:79:20
--> tests/ui/manual_div_ceil.rs:88:20
|
LL | let _: usize = (2048 + 6 - 1) / 6;
| ^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `2048_usize.div_ceil(6)`
error: manually reimplementing `div_ceil`
--> tests/ui/manual_div_ceil.rs:81:18
--> tests/ui/manual_div_ceil.rs:90:18
|
LL | let _: u32 = (0x2048 + 0x6 - 1) / 0x6;
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `0x2048_u32.div_ceil(0x6)`
error: manually reimplementing `div_ceil`
--> tests/ui/manual_div_ceil.rs:84:13
--> tests/ui/manual_div_ceil.rs:93:13
|
LL | let _ = (2048 + 6u32 - 1) / 6u32;
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `2048_u32.div_ceil(6u32)`
error: manually reimplementing `div_ceil`
--> tests/ui/manual_div_ceil.rs:87:13
--> tests/ui/manual_div_ceil.rs:96:13
|
LL | let _ = (1_000_000 + 6u32 - 1) / 6u32;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `1_000_000_u32.div_ceil(6u32)`
error: manually reimplementing `div_ceil`
--> tests/ui/manual_div_ceil.rs:93:13
--> tests/ui/manual_div_ceil.rs:102:13
|
LL | let _ = (x + 7) / 8;
| ^^^^^^^^^^^ help: consider using `.div_ceil()`: `x.div_ceil(8)`
error: manually reimplementing `div_ceil`
--> tests/ui/manual_div_ceil.rs:95:13
--> tests/ui/manual_div_ceil.rs:104:13
|
LL | let _ = (7 + x) / 8;
| ^^^^^^^^^^^ help: consider using `.div_ceil()`: `x.div_ceil(8)`
error: manually reimplementing `div_ceil`
--> tests/ui/manual_div_ceil.rs:105:13
--> tests/ui/manual_div_ceil.rs:114:13
|
LL | let _ = (size + c - 1) / c;
| ^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `size.div_ceil(*c)`
error: manually reimplementing `div_ceil`
--> tests/ui/manual_div_ceil.rs:121:13
--> tests/ui/manual_div_ceil.rs:130:13
|
LL | let _ = x.next_multiple_of(8) / 8;
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `x.div_ceil(8)`
error: manually reimplementing `div_ceil`
--> tests/ui/manual_div_ceil.rs:123:13
--> tests/ui/manual_div_ceil.rs:132:13
|
LL | let _ = u32::next_multiple_of(x, 8) / 8;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `x.div_ceil(8)`
error: manually reimplementing `div_ceil`
--> tests/ui/manual_div_ceil.rs:127:13
--> tests/ui/manual_div_ceil.rs:136:13
|
LL | let _ = y.next_multiple_of(8) / 8;
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `y.div_ceil(8)`
error: aborting due to 23 previous errors
error: aborting due to 24 previous errors