From 0cb6a51776e72b702aedbb55e862a60d193e740a Mon Sep 17 00:00:00 2001 From: Samuel Tardieu Date: Wed, 25 Jun 2025 16:57:11 +0200 Subject: [PATCH] `unsafe_derive_deserialize`: do not consider `pin!()` as `unsafe` In Rust 1.88, the `pin!()` macro uses `unsafe` and triggers `unsafe_derive_deserialize`. --- clippy_lints/src/derive.rs | 7 +++++++ tests/ui/unsafe_derive_deserialize.rs | 12 ++++++++++++ 2 files changed, 19 insertions(+) diff --git a/clippy_lints/src/derive.rs b/clippy_lints/src/derive.rs index 062f7cef3a72..ea8df9faa213 100644 --- a/clippy_lints/src/derive.rs +++ b/clippy_lints/src/derive.rs @@ -432,6 +432,13 @@ impl<'tcx> Visitor<'tcx> for UnsafeVisitor<'_, 'tcx> { fn visit_expr(&mut self, expr: &'tcx Expr<'_>) -> Self::Result { if let ExprKind::Block(block, _) = expr.kind && block.rules == BlockCheckMode::UnsafeBlock(UnsafeSource::UserProvided) + && block + .span + .source_callee() + .and_then(|expr| expr.macro_def_id) + .is_none_or(|did| { + (self.cx.tcx.crate_name(did.krate), self.cx.tcx.item_name(did)) != (sym::core, sym::pin) + }) { return ControlFlow::Break(()); } diff --git a/tests/ui/unsafe_derive_deserialize.rs b/tests/ui/unsafe_derive_deserialize.rs index 14371bc203b3..4f11030e9c8d 100644 --- a/tests/ui/unsafe_derive_deserialize.rs +++ b/tests/ui/unsafe_derive_deserialize.rs @@ -82,3 +82,15 @@ impl H { } fn main() {} + +mod issue15120 { + #[derive(serde::Deserialize)] + struct Foo; + + impl Foo { + fn foo(&self) { + // Do not lint if `unsafe` comes from the `core::pin::pin!()` macro + std::pin::pin!(()); + } + } +}