Auto merge of #46191 - eddyb:better-late-than-never, r=nikomatsakis
rustc: don't mark lifetimes as early-bound in the presence of impl Trait. This hack from the original implementation shouldn't be needed anymore, thanks to @cramertj. r? @nikomatsakis
This commit is contained in:
commit
2f47a9eb80
@ -1750,7 +1750,6 @@ fn insert_late_bound_lifetimes(map: &mut NamedRegionMap,
|
|||||||
|
|
||||||
let mut appears_in_output = AllCollector {
|
let mut appears_in_output = AllCollector {
|
||||||
regions: FxHashSet(),
|
regions: FxHashSet(),
|
||||||
impl_trait: false
|
|
||||||
};
|
};
|
||||||
intravisit::walk_fn_ret_ty(&mut appears_in_output, &decl.output);
|
intravisit::walk_fn_ret_ty(&mut appears_in_output, &decl.output);
|
||||||
|
|
||||||
@ -1763,7 +1762,6 @@ fn insert_late_bound_lifetimes(map: &mut NamedRegionMap,
|
|||||||
// ignore binders here and scrape up all names we see.
|
// ignore binders here and scrape up all names we see.
|
||||||
let mut appears_in_where_clause = AllCollector {
|
let mut appears_in_where_clause = AllCollector {
|
||||||
regions: FxHashSet(),
|
regions: FxHashSet(),
|
||||||
impl_trait: false
|
|
||||||
};
|
};
|
||||||
for ty_param in generics.ty_params.iter() {
|
for ty_param in generics.ty_params.iter() {
|
||||||
walk_list!(&mut appears_in_where_clause,
|
walk_list!(&mut appears_in_where_clause,
|
||||||
@ -1804,9 +1802,6 @@ fn insert_late_bound_lifetimes(map: &mut NamedRegionMap,
|
|||||||
// appears in the where clauses? early-bound.
|
// appears in the where clauses? early-bound.
|
||||||
if appears_in_where_clause.regions.contains(&name) { continue; }
|
if appears_in_where_clause.regions.contains(&name) { continue; }
|
||||||
|
|
||||||
// any `impl Trait` in the return type? early-bound.
|
|
||||||
if appears_in_output.impl_trait { continue; }
|
|
||||||
|
|
||||||
// does not appear in the inputs, but appears in the return type? early-bound.
|
// does not appear in the inputs, but appears in the return type? early-bound.
|
||||||
if !constrained_by_input.regions.contains(&name) &&
|
if !constrained_by_input.regions.contains(&name) &&
|
||||||
appears_in_output.regions.contains(&name) {
|
appears_in_output.regions.contains(&name) {
|
||||||
@ -1865,7 +1860,6 @@ fn insert_late_bound_lifetimes(map: &mut NamedRegionMap,
|
|||||||
|
|
||||||
struct AllCollector {
|
struct AllCollector {
|
||||||
regions: FxHashSet<hir::LifetimeName>,
|
regions: FxHashSet<hir::LifetimeName>,
|
||||||
impl_trait: bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'v> Visitor<'v> for AllCollector {
|
impl<'v> Visitor<'v> for AllCollector {
|
||||||
@ -1876,12 +1870,5 @@ fn insert_late_bound_lifetimes(map: &mut NamedRegionMap,
|
|||||||
fn visit_lifetime(&mut self, lifetime_ref: &'v hir::Lifetime) {
|
fn visit_lifetime(&mut self, lifetime_ref: &'v hir::Lifetime) {
|
||||||
self.regions.insert(lifetime_ref.name);
|
self.regions.insert(lifetime_ref.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_ty(&mut self, ty: &hir::Ty) {
|
|
||||||
if let hir::TyImplTraitExistential(..) = ty.node {
|
|
||||||
self.impl_trait = true;
|
|
||||||
}
|
|
||||||
intravisit::walk_ty(self, ty);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user