From 842907ba8532a53b84e6c6261cdcddd40d845adf Mon Sep 17 00:00:00 2001 From: mu001999 Date: Tue, 28 Jul 2026 13:12:15 +0800 Subject: [PATCH] Add regression tests for fixed dead-code issues --- ...llow-derived-inherent-impl-issue-102190.rs | 19 ++++++++++ ...generate-inherent-impl-with-input-spans.rs | 35 +++++++++++++++++++ .../expect-on-assoc-fn-issue-148861.rs | 25 +++++++++++++ .../struct-used-as-pattern-issue-56750.rs | 17 +++++++++ 4 files changed, 96 insertions(+) create mode 100644 tests/ui/lint/dead-code/allow-derived-inherent-impl-issue-102190.rs create mode 100644 tests/ui/lint/dead-code/auxiliary/generate-inherent-impl-with-input-spans.rs create mode 100644 tests/ui/lint/dead-code/expect-on-assoc-fn-issue-148861.rs create mode 100644 tests/ui/lint/dead-code/struct-used-as-pattern-issue-56750.rs diff --git a/tests/ui/lint/dead-code/allow-derived-inherent-impl-issue-102190.rs b/tests/ui/lint/dead-code/allow-derived-inherent-impl-issue-102190.rs new file mode 100644 index 0000000000000..dc300f793c35a --- /dev/null +++ b/tests/ui/lint/dead-code/allow-derived-inherent-impl-issue-102190.rs @@ -0,0 +1,19 @@ +//! Regression test for + +//@ check-pass +//@ proc-macro: generate-inherent-impl-with-input-spans.rs + +#![deny(dead_code)] + +extern crate generate_inherent_impl_with_input_spans; + +use generate_inherent_impl_with_input_spans::Test; + +#[allow(dead_code)] +#[derive(Test)] +#[repr(i8)] +pub(crate) enum MyEnum { + MyValue, +} + +fn main() {} diff --git a/tests/ui/lint/dead-code/auxiliary/generate-inherent-impl-with-input-spans.rs b/tests/ui/lint/dead-code/auxiliary/generate-inherent-impl-with-input-spans.rs new file mode 100644 index 0000000000000..97cda6163c50e --- /dev/null +++ b/tests/ui/lint/dead-code/auxiliary/generate-inherent-impl-with-input-spans.rs @@ -0,0 +1,35 @@ +extern crate proc_macro; + +use proc_macro::{Delimiter, Group, Ident, TokenStream, TokenTree}; + +#[proc_macro_derive(Test)] +pub fn derive(input: TokenStream) -> TokenStream { + let input = input.into_iter().collect::>(); + let input_span = input[0].span(); + + let output = "impl MyEnum { + pub(crate) fn false_positive(self) -> i8 { + self as i8 + } + }" + .parse::() + .unwrap() + .into_iter() + .collect::>(); + + let TokenTree::Group(body) = &output[2] else { unreachable!() }; + let mut body = body.stream().into_iter().collect::>(); + + // Preserve the visibility tokens from the input, as `quote!` does when interpolating `#vis`. + body[0] = input[0].clone(); + body[1] = input[1].clone(); + + // Give the return type the input's span, matching `Ident::new("i8", input.span())`. + body[7] = TokenTree::Ident(Ident::new("i8", input_span)); + + let mut generated_body = + Group::new(Delimiter::Brace, body.into_iter().collect::()); + generated_body.set_span(output[2].span()); + + vec![output[0].clone(), output[1].clone(), generated_body.into()].into_iter().collect() +} diff --git a/tests/ui/lint/dead-code/expect-on-assoc-fn-issue-148861.rs b/tests/ui/lint/dead-code/expect-on-assoc-fn-issue-148861.rs new file mode 100644 index 0000000000000..5eab8938e5ee3 --- /dev/null +++ b/tests/ui/lint/dead-code/expect-on-assoc-fn-issue-148861.rs @@ -0,0 +1,25 @@ +//! Regression test for + +//@ check-pass + +#![deny(dead_code)] + +use std::any::Any; + +pub trait Foo: Any {} + +impl Foo for Box {} + +impl dyn Foo { + #[expect(dead_code)] + fn downcast_ref(&self) -> Option<&T> { + let this = self as &dyn Any; + if let Some(boxed) = this.downcast_ref::>() { + boxed.downcast_ref::() + } else { + this.downcast_ref::() + } + } +} + +fn main() {} diff --git a/tests/ui/lint/dead-code/struct-used-as-pattern-issue-56750.rs b/tests/ui/lint/dead-code/struct-used-as-pattern-issue-56750.rs new file mode 100644 index 0000000000000..65e625e20043b --- /dev/null +++ b/tests/ui/lint/dead-code/struct-used-as-pattern-issue-56750.rs @@ -0,0 +1,17 @@ +//! Regression test for + +//@ check-pass + +#![deny(dead_code)] + +use std::mem; + +fn main() { + struct Value { + a: i32, + b: i32, + } + + let Value { a, b } = unsafe { mem::zeroed() }; + println!("{a} {b}"); +}