From 448e0f865fdcbfbe5e45202f8cf568f7bb25a108 Mon Sep 17 00:00:00 2001 From: Takayuki Maeda Date: Mon, 6 Jul 2026 15:05:28 +0900 Subject: [PATCH 1/2] add regression test for final RPITIT override panic --- tests/ui/traits/final/overriding-rpitit.rs | 18 ++++++++++++++++++ tests/ui/traits/final/overriding-rpitit.stderr | 14 ++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 tests/ui/traits/final/overriding-rpitit.rs create mode 100644 tests/ui/traits/final/overriding-rpitit.stderr diff --git a/tests/ui/traits/final/overriding-rpitit.rs b/tests/ui/traits/final/overriding-rpitit.rs new file mode 100644 index 0000000000000..b44b470175ce4 --- /dev/null +++ b/tests/ui/traits/final/overriding-rpitit.rs @@ -0,0 +1,18 @@ +#![feature(final_associated_functions)] + +// Regression test for https://github.com/rust-lang/rust/issues/158824. + +trait Item { + final fn bar() -> impl Clone { + todo!() + } +} + +struct Foo; + +impl Item for Foo { + fn bar() -> impl Clone {} + //~^ ERROR cannot override `bar` because it already has a `final` definition in the trait +} + +fn main() {} diff --git a/tests/ui/traits/final/overriding-rpitit.stderr b/tests/ui/traits/final/overriding-rpitit.stderr new file mode 100644 index 0000000000000..b865171472bab --- /dev/null +++ b/tests/ui/traits/final/overriding-rpitit.stderr @@ -0,0 +1,14 @@ +error: cannot override `bar` because it already has a `final` definition in the trait + --> $DIR/overriding-rpitit.rs:14:5 + | +LL | fn bar() -> impl Clone {} + | ^^^^^^^^^^^^^^^^^^^^^^ + | +note: `bar` is marked final here + --> $DIR/overriding-rpitit.rs:6:5 + | +LL | final fn bar() -> impl Clone { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 1 previous error + From 5a5f78dd6ab10e1e5ac75cc1ec11431d6ba14567 Mon Sep 17 00:00:00 2001 From: Takayuki Maeda Date: Mon, 6 Jul 2026 15:05:43 +0900 Subject: [PATCH 2/2] avoid final override diagnostics for non-function associated items --- compiler/rustc_hir_analysis/src/check/check.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/rustc_hir_analysis/src/check/check.rs b/compiler/rustc_hir_analysis/src/check/check.rs index aa204a20e2d57..c3dff49be9927 100644 --- a/compiler/rustc_hir_analysis/src/check/check.rs +++ b/compiler/rustc_hir_analysis/src/check/check.rs @@ -1254,7 +1254,7 @@ fn check_overriding_final_trait_item<'tcx>( trait_item: ty::AssocItem, impl_item: ty::AssocItem, ) { - if trait_item.defaultness(tcx).is_final() { + if trait_item.is_fn() && trait_item.defaultness(tcx).is_final() { tcx.dcx().emit_err(diagnostics::OverridingFinalTraitFunction { impl_span: tcx.def_span(impl_item.def_id), trait_span: tcx.def_span(trait_item.def_id),