From ad9686e0c79fd4c4f650f6515c6ac3e48489e540 Mon Sep 17 00:00:00 2001 From: Ada Alakbarova Date: Wed, 13 Aug 2025 16:23:35 +0200 Subject: [PATCH 1/3] test: move the main file to `unfixable` since it's the one that makes no suggestions --- tests/ui/{char_lit_as_u8.rs => char_lit_as_u8_unfixable.rs} | 1 + .../{char_lit_as_u8.stderr => char_lit_as_u8_unfixable.stderr} | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) rename tests/ui/{char_lit_as_u8.rs => char_lit_as_u8_unfixable.rs} (91%) rename tests/ui/{char_lit_as_u8.stderr => char_lit_as_u8_unfixable.stderr} (88%) diff --git a/tests/ui/char_lit_as_u8.rs b/tests/ui/char_lit_as_u8_unfixable.rs similarity index 91% rename from tests/ui/char_lit_as_u8.rs rename to tests/ui/char_lit_as_u8_unfixable.rs index c8774c7f3091..e5c094f158ec 100644 --- a/tests/ui/char_lit_as_u8.rs +++ b/tests/ui/char_lit_as_u8_unfixable.rs @@ -1,3 +1,4 @@ +//@no-rustfix #![warn(clippy::char_lit_as_u8)] fn main() { diff --git a/tests/ui/char_lit_as_u8.stderr b/tests/ui/char_lit_as_u8_unfixable.stderr similarity index 88% rename from tests/ui/char_lit_as_u8.stderr rename to tests/ui/char_lit_as_u8_unfixable.stderr index ec02f1341c0a..49e555ae638a 100644 --- a/tests/ui/char_lit_as_u8.stderr +++ b/tests/ui/char_lit_as_u8_unfixable.stderr @@ -1,5 +1,5 @@ error: casting a character literal to `u8` truncates - --> tests/ui/char_lit_as_u8.rs:5:13 + --> tests/ui/char_lit_as_u8_unfixable.rs:6:13 | LL | let _ = '❤' as u8; | ^^^^^^^^^ From ff2b5e66a16e7f86d5bf723b812b51d3cc60917b Mon Sep 17 00:00:00 2001 From: Ada Alakbarova Date: Wed, 13 Aug 2025 16:24:05 +0200 Subject: [PATCH 2/3] test: make `suggestions` the main file since it's the one that has suggestions --- ...r_lit_as_u8_suggestions.fixed => char_lit_as_u8.fixed} | 0 .../{char_lit_as_u8_suggestions.rs => char_lit_as_u8.rs} | 0 ...lit_as_u8_suggestions.stderr => char_lit_as_u8.stderr} | 8 ++++---- 3 files changed, 4 insertions(+), 4 deletions(-) rename tests/ui/{char_lit_as_u8_suggestions.fixed => char_lit_as_u8.fixed} (100%) rename tests/ui/{char_lit_as_u8_suggestions.rs => char_lit_as_u8.rs} (100%) rename tests/ui/{char_lit_as_u8_suggestions.stderr => char_lit_as_u8.stderr} (84%) diff --git a/tests/ui/char_lit_as_u8_suggestions.fixed b/tests/ui/char_lit_as_u8.fixed similarity index 100% rename from tests/ui/char_lit_as_u8_suggestions.fixed rename to tests/ui/char_lit_as_u8.fixed diff --git a/tests/ui/char_lit_as_u8_suggestions.rs b/tests/ui/char_lit_as_u8.rs similarity index 100% rename from tests/ui/char_lit_as_u8_suggestions.rs rename to tests/ui/char_lit_as_u8.rs diff --git a/tests/ui/char_lit_as_u8_suggestions.stderr b/tests/ui/char_lit_as_u8.stderr similarity index 84% rename from tests/ui/char_lit_as_u8_suggestions.stderr rename to tests/ui/char_lit_as_u8.stderr index 158dfd6bed26..9bcded7b0ff4 100644 --- a/tests/ui/char_lit_as_u8_suggestions.stderr +++ b/tests/ui/char_lit_as_u8.stderr @@ -1,5 +1,5 @@ error: casting a character literal to `u8` truncates - --> tests/ui/char_lit_as_u8_suggestions.rs:4:13 + --> tests/ui/char_lit_as_u8.rs:4:13 | LL | let _ = 'a' as u8; | ^^^^^^^^^ help: use a byte literal instead: `b'a'` @@ -9,7 +9,7 @@ LL | let _ = 'a' as u8; = help: to override `-D warnings` add `#[allow(clippy::char_lit_as_u8)]` error: casting a character literal to `u8` truncates - --> tests/ui/char_lit_as_u8_suggestions.rs:6:13 + --> tests/ui/char_lit_as_u8.rs:6:13 | LL | let _ = '\n' as u8; | ^^^^^^^^^^ help: use a byte literal instead: `b'\n'` @@ -17,7 +17,7 @@ LL | let _ = '\n' as u8; = note: `char` is four bytes wide, but `u8` is a single byte error: casting a character literal to `u8` truncates - --> tests/ui/char_lit_as_u8_suggestions.rs:8:13 + --> tests/ui/char_lit_as_u8.rs:8:13 | LL | let _ = '\0' as u8; | ^^^^^^^^^^ help: use a byte literal instead: `b'\0'` @@ -25,7 +25,7 @@ LL | let _ = '\0' as u8; = note: `char` is four bytes wide, but `u8` is a single byte error: casting a character literal to `u8` truncates - --> tests/ui/char_lit_as_u8_suggestions.rs:10:13 + --> tests/ui/char_lit_as_u8.rs:10:13 | LL | let _ = '\x01' as u8; | ^^^^^^^^^^^^ help: use a byte literal instead: `b'\x01'` From e6f3cb00a75796effa22c522142c8eb91afbcd83 Mon Sep 17 00:00:00 2001 From: Ada Alakbarova Date: Wed, 13 Aug 2025 16:34:57 +0200 Subject: [PATCH 3/3] move `char_lit_as_u8` into the `if` allows reusing `cast_from_expr` and `cast_to` --- clippy_lints/src/casts/char_lit_as_u8.rs | 11 +++++------ clippy_lints/src/casts/mod.rs | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/clippy_lints/src/casts/char_lit_as_u8.rs b/clippy_lints/src/casts/char_lit_as_u8.rs index a7d3868f76c6..964eaf2a0a2d 100644 --- a/clippy_lints/src/casts/char_lit_as_u8.rs +++ b/clippy_lints/src/casts/char_lit_as_u8.rs @@ -4,18 +4,17 @@ use rustc_ast::LitKind; use rustc_errors::Applicability; use rustc_hir::{Expr, ExprKind}; use rustc_lint::LateContext; -use rustc_middle::ty::{self, UintTy}; +use rustc_middle::ty::{self, Ty, UintTy}; use super::CHAR_LIT_AS_U8; -pub(super) fn check(cx: &LateContext<'_>, expr: &Expr<'_>) { - if let ExprKind::Cast(e, _) = &expr.kind - && let ExprKind::Lit(l) = &e.kind +pub(super) fn check(cx: &LateContext<'_>, expr: &Expr<'_>, cast_from_expr: &Expr<'_>, cast_to: Ty<'_>) { + if let ExprKind::Lit(l) = &cast_from_expr.kind && let LitKind::Char(c) = l.node - && ty::Uint(UintTy::U8) == *cx.typeck_results().expr_ty(expr).kind() + && ty::Uint(UintTy::U8) == *cast_to.kind() { let mut applicability = Applicability::MachineApplicable; - let snippet = snippet_with_applicability(cx, e.span, "'x'", &mut applicability); + let snippet = snippet_with_applicability(cx, cast_from_expr.span, "'x'", &mut applicability); span_lint_and_then( cx, diff --git a/clippy_lints/src/casts/mod.rs b/clippy_lints/src/casts/mod.rs index dcc439a272cf..e25df9dd249a 100644 --- a/clippy_lints/src/casts/mod.rs +++ b/clippy_lints/src/casts/mod.rs @@ -871,6 +871,7 @@ impl<'tcx> LateLintPass<'tcx> for Casts { if !expr.span.from_expansion() && unnecessary_cast::check(cx, expr, cast_from_expr, cast_from, cast_to) { return; } + char_lit_as_u8::check(cx, expr, cast_from_expr, cast_to); cast_slice_from_raw_parts::check(cx, expr, cast_from_expr, cast_to, self.msrv); ptr_cast_constness::check(cx, expr, cast_from_expr, cast_from, cast_to, self.msrv); as_ptr_cast_mut::check(cx, expr, cast_from_expr, cast_to); @@ -911,7 +912,6 @@ impl<'tcx> LateLintPass<'tcx> for Casts { borrow_as_ptr::check_implicit_cast(cx, expr); } cast_ptr_alignment::check(cx, expr); - char_lit_as_u8::check(cx, expr); ptr_as_ptr::check(cx, expr, self.msrv); cast_slice_different_sizes::check(cx, expr, self.msrv); ptr_cast_constness::check_null_ptr_cast_method(cx, expr);