From: Philip Herron <[email protected]>

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]>
---
This change was merged into the gccrs repository and is posted here for
upstream visibility and potential drive-by review, as requested by GCC
release managers.
Each commit email contains a link to its details on github from where you can
find the Pull-Request and associated discussions.


Commit on github: 
https://github.com/Rust-GCC/gccrs/commit/1f3e2252b144c1f9ae144a6d40511bcb35f04bcf

The commit has been mentioned in the following issue(s):
 - Rust-GCC/gccrs#4885: https://github.com/Rust-GCC/gccrs/issues/4885

The commit has been mentioned in the following pull-request(s):
 - https://github.com/Rust-GCC/gccrs/pull/4900

 gcc/rust/typecheck/rust-hir-trait-resolve.cc  | 14 +++++-
 .../rust/compile/issues/issue-4885.rs         | 43 +++++++++++++++++++
 2 files changed, 56 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/rust/compile/issues/issue-4885.rs

diff --git a/gcc/rust/typecheck/rust-hir-trait-resolve.cc 
b/gcc/rust/typecheck/rust-hir-trait-resolve.cc
index 502d0e8f7..c80899979 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 &param : 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 000000000..b02bc60a9
--- /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
+}

base-commit: 931c22cea397b5272ba09542781274421f6dbe62
-- 
2.55.0

Reply via email to