From b77b91621613016968382457fd2aef0f25e43667 Mon Sep 17 00:00:00 2001 From: yanglsh Date: Mon, 21 Jul 2025 22:37:14 +0800 Subject: [PATCH 1/2] fix: `missing_inline_in_public_items` fail to fulfill `expect` in `--test` build --- clippy_lints/src/missing_inline.rs | 10 +++++++++- tests/ui/missing_inline_test_crate.rs | 8 ++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 tests/ui/missing_inline_test_crate.rs diff --git a/clippy_lints/src/missing_inline.rs b/clippy_lints/src/missing_inline.rs index d02952eb4870..bfe1d2019608 100644 --- a/clippy_lints/src/missing_inline.rs +++ b/clippy_lints/src/missing_inline.rs @@ -1,4 +1,5 @@ use clippy_utils::diagnostics::span_lint; +use clippy_utils::fulfill_or_allowed; use rustc_hir::attrs::AttributeKind; use rustc_hir::def_id::DefId; use rustc_hir::{self as hir, Attribute, find_attr}; @@ -88,7 +89,14 @@ declare_lint_pass!(MissingInline => [MISSING_INLINE_IN_PUBLIC_ITEMS]); impl<'tcx> LateLintPass<'tcx> for MissingInline { fn check_item(&mut self, cx: &LateContext<'tcx>, it: &'tcx hir::Item<'_>) { - if it.span.in_external_macro(cx.sess().source_map()) || is_executable_or_proc_macro(cx) { + if it.span.in_external_macro(cx.sess().source_map()) { + return; + } + + if is_executable_or_proc_macro(cx) + // Allow the lint if it is expected, when building with `--test` + && !(cx.sess().is_test_crate() && fulfill_or_allowed(cx, MISSING_INLINE_IN_PUBLIC_ITEMS, [it.hir_id()])) + { return; } diff --git a/tests/ui/missing_inline_test_crate.rs b/tests/ui/missing_inline_test_crate.rs new file mode 100644 index 000000000000..d7fb5ae2283f --- /dev/null +++ b/tests/ui/missing_inline_test_crate.rs @@ -0,0 +1,8 @@ +//@compile-flags: --test +//@check-pass +#![warn(clippy::missing_inline_in_public_items)] + +#[expect(clippy::missing_inline_in_public_items)] +pub fn foo() -> u32 { + 0 +} From 6a142baf11b5bcdb29235ee43dc4b4810f2eac6f Mon Sep 17 00:00:00 2001 From: yanglsh Date: Thu, 21 Aug 2025 23:40:27 +0800 Subject: [PATCH 2/2] Make `missing_inline_in_public_items` warn on executables --- clippy_lints/src/missing_inline.rs | 12 ++++-------- tests/ui/missing_inline_executable.rs | 3 +-- tests/ui/missing_inline_executable.stderr | 11 +++++++++++ 3 files changed, 16 insertions(+), 10 deletions(-) create mode 100644 tests/ui/missing_inline_executable.stderr diff --git a/clippy_lints/src/missing_inline.rs b/clippy_lints/src/missing_inline.rs index bfe1d2019608..95a101aab5c9 100644 --- a/clippy_lints/src/missing_inline.rs +++ b/clippy_lints/src/missing_inline.rs @@ -1,5 +1,4 @@ use clippy_utils::diagnostics::span_lint; -use clippy_utils::fulfill_or_allowed; use rustc_hir::attrs::AttributeKind; use rustc_hir::def_id::DefId; use rustc_hir::{self as hir, Attribute, find_attr}; @@ -76,13 +75,13 @@ fn check_missing_inline_attrs(cx: &LateContext<'_>, attrs: &[Attribute], sp: Spa } } -fn is_executable_or_proc_macro(cx: &LateContext<'_>) -> bool { +fn is_proc_macro(cx: &LateContext<'_>) -> bool { use rustc_session::config::CrateType; cx.tcx .crate_types() .iter() - .any(|t: &CrateType| matches!(t, CrateType::Executable | CrateType::ProcMacro)) + .any(|t: &CrateType| matches!(t, CrateType::ProcMacro)) } declare_lint_pass!(MissingInline => [MISSING_INLINE_IN_PUBLIC_ITEMS]); @@ -93,10 +92,7 @@ impl<'tcx> LateLintPass<'tcx> for MissingInline { return; } - if is_executable_or_proc_macro(cx) - // Allow the lint if it is expected, when building with `--test` - && !(cx.sess().is_test_crate() && fulfill_or_allowed(cx, MISSING_INLINE_IN_PUBLIC_ITEMS, [it.hir_id()])) - { + if is_proc_macro(cx) { return; } @@ -159,7 +155,7 @@ impl<'tcx> LateLintPass<'tcx> for MissingInline { } fn check_impl_item(&mut self, cx: &LateContext<'tcx>, impl_item: &'tcx hir::ImplItem<'_>) { - if impl_item.span.in_external_macro(cx.sess().source_map()) || is_executable_or_proc_macro(cx) { + if impl_item.span.in_external_macro(cx.sess().source_map()) || is_proc_macro(cx) { return; } diff --git a/tests/ui/missing_inline_executable.rs b/tests/ui/missing_inline_executable.rs index 444a7f1c964f..2ab3e3b7825d 100644 --- a/tests/ui/missing_inline_executable.rs +++ b/tests/ui/missing_inline_executable.rs @@ -1,7 +1,6 @@ -//@ check-pass - #![warn(clippy::missing_inline_in_public_items)] pub fn foo() {} +//~^ missing_inline_in_public_items fn main() {} diff --git a/tests/ui/missing_inline_executable.stderr b/tests/ui/missing_inline_executable.stderr new file mode 100644 index 000000000000..3108e4e49065 --- /dev/null +++ b/tests/ui/missing_inline_executable.stderr @@ -0,0 +1,11 @@ +error: missing `#[inline]` for a function + --> tests/ui/missing_inline_executable.rs:3:1 + | +LL | pub fn foo() {} + | ^^^^^^^^^^^^^^^ + | + = note: `-D clippy::missing-inline-in-public-items` implied by `-D warnings` + = help: to override `-D warnings` add `#[allow(clippy::missing_inline_in_public_items)]` + +error: aborting due to 1 previous error +