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 ¶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 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