diff --git a/compiler/rustc_hir_analysis/src/collect/resolve_bound_vars.rs b/compiler/rustc_hir_analysis/src/collect/resolve_bound_vars.rs index 675e033e94991..1378e62031644 100644 --- a/compiler/rustc_hir_analysis/src/collect/resolve_bound_vars.rs +++ b/compiler/rustc_hir_analysis/src/collect/resolve_bound_vars.rs @@ -152,11 +152,14 @@ enum Scope<'a> { s: ScopeRef<'a>, }, - /// Resolve the lifetimes in the bounds to the lifetime defs in the generics. - /// `fn foo<'a>() -> impl MyTrait<'a> { ... }` desugars to + /// Remap lifetimes that appear in opaque types to fresh lifetime parameters. Given: + /// `fn foo<'a>() -> impl MyTrait<'a> { ... }` + /// + /// HIR tells us that `'a` refer to the lifetime bound on `foo`. + /// However, typeck and borrowck for opaques are work based on using a new generics type. /// `type MyAnonTy<'b> = impl MyTrait<'b>;` - /// ^ ^ this gets resolved in the scope of - /// the opaque_ty generics + /// + /// This scope collects the mapping `'a -> 'b`. Opaque { /// The opaque type we are traversing. def_id: LocalDefId, @@ -547,11 +550,11 @@ impl<'a, 'tcx> Visitor<'tcx> for BoundVarContext<'a, 'tcx> { } } - /// Resolve the lifetimes that are applied to the opaque type. - /// These are resolved in the current scope. - /// `fn foo<'a>() -> impl MyTrait<'a> { ... }` desugars to - /// `fn foo<'a>() -> MyAnonTy<'a> { ... }` - /// ^ ^this gets resolved in the current scope + /// Resolve the lifetimes inside the opaque type, and save them into + /// `opaque_captured_lifetimes`. + /// + /// This method has special handling for opaques that capture all lifetimes, + /// like async desugaring. #[instrument(level = "debug", skip(self))] fn visit_opaque_ty(&mut self, opaque: &'tcx rustc_hir::OpaqueTy<'tcx>) { let mut captures = FxIndexMap::default(); @@ -815,9 +818,6 @@ impl<'a, 'tcx> Visitor<'tcx> for BoundVarContext<'a, 'tcx> { }; self.with(scope, |this| this.visit_ty(mt.ty)); } - hir::TyKind::OpaqueDef(opaque_ty) => { - self.visit_opaque_ty(opaque_ty); - } _ => intravisit::walk_ty(self, ty), } }