https://gcc.gnu.org/g:d9e02c1a7dcc4817f9ca76a579ce4a1c821c766f
commit r17-5137-gd9e02c1a7dcc4817f9ca76a579ce4a1c821c766f Author: Philip Herron <[email protected]> Date: Tue Sep 15 12:02:11 2026 +0100 gccrs: handle lifetimes properly on trait items The patch here means we keep a fresh lifetime scope when resolving each trait item when generics are used. Fixes Rust-GCC/gccrs#4885 gcc/rust/ChangeLog: * typecheck/rust-hir-trait-resolve.cc (TraitItemReference::resolve_item): track lifetimes gcc/testsuite/ChangeLog: * rust/compile/issues/issue-4885.rs: New test. Signed-off-by: Philip Herron <[email protected]> Diff: --- gcc/rust/typecheck/rust-hir-trait-resolve.cc | 14 +++++++- gcc/testsuite/rust/compile/issues/issue-4885.rs | 43 +++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/gcc/rust/typecheck/rust-hir-trait-resolve.cc b/gcc/rust/typecheck/rust-hir-trait-resolve.cc index 502d0e8f7d8d..c80899979c23 100644 --- a/gcc/rust/typecheck/rust-hir-trait-resolve.cc +++ b/gcc/rust/typecheck/rust-hir-trait-resolve.cc @@ -472,10 +472,22 @@ void TraitItemReference::resolve_item (const TraitReference *tref, HIR::TraitItemType &type) { + auto lifetime_pin = context->push_clean_lifetime_resolver (); + for (auto ¶m : tref->get_hir_trait_ref ()->get_generic_params ()) + { + if (param->get_kind () == HIR::GenericParam::GenericKind::LIFETIME) + { + auto &lifetime_param = static_cast<HIR::LifetimeParam &> (*param); + context->intern_and_insert_lifetime (lifetime_param.get_lifetime ()); + } + } + auto substitutions = inherited_substitutions; + tl::optional<TypeCheckContext::LifetimeResolverGuard> binder_pin; if (type.has_generics ()) { - auto binder_pin = context->push_lifetime_binder (); + binder_pin.emplace (*context, + TypeCheckContext::LifetimeResolverGuard::BINDER); TypeCheckBase::ResolveGenericParams (HIR::Item::ItemKind::TypeAlias, type.get_locus (), type.get_generic_params (), diff --git a/gcc/testsuite/rust/compile/issues/issue-4885.rs b/gcc/testsuite/rust/compile/issues/issue-4885.rs new file mode 100644 index 000000000000..b02bc60a9544 --- /dev/null +++ b/gcc/testsuite/rust/compile/issues/issue-4885.rs @@ -0,0 +1,43 @@ +// { dg-do compile } +// { dg-options "-w" } + +#![feature(no_core, lang_items)] +#![no_core] + +#[lang = "sized"] +pub trait Sized {} + +pub unsafe trait Searcher<'a> { + fn haystack(&self) -> &'a (); +} + +pub trait Pattern<'a>: Sized { + type Searcher: Searcher<'a>; +} + +pub trait MultiCharEq {} + +struct MultiCharEqPattern<C: MultiCharEq>(C); + +struct MultiCharEqSearcher<'a, C: MultiCharEq> { + marker: &'a (), + c: C, +} + +impl<'a, C: MultiCharEq> Pattern<'a> for MultiCharEqPattern<C> { + type Searcher = MultiCharEqSearcher<'a, C>; +} + +unsafe impl<'a, C: MultiCharEq> Searcher<'a> for MultiCharEqSearcher<'a, C> { + fn haystack(&self) -> &'a () { + self.marker + } +} + +impl<'x> MultiCharEq for &'x [i32] {} + +pub struct CharSliceSearcher<'a, 'b>(<MultiCharEqPattern<&'b [i32]> as Pattern<'a>>::Searcher); + +fn main() -> i32 { + 0 +}
