From bc6a2c11ee34b46a1e2863a8522b6f7c2e4481c3 Mon Sep 17 00:00:00 2001 From: Camille GILLOT Date: Mon, 6 Jun 2022 09:02:24 +0200 Subject: [PATCH] Leave the responsibility to create `Fresh` lifetimes to lowering. --- compiler/rustc_ast_lowering/src/item.rs | 11 +++++--- compiler/rustc_ast_lowering/src/lib.rs | 15 +++++++++-- compiler/rustc_hir/src/def.rs | 4 ++- compiler/rustc_resolve/src/late.rs | 34 ++++++++----------------- 4 files changed, 34 insertions(+), 30 deletions(-) diff --git a/compiler/rustc_ast_lowering/src/item.rs b/compiler/rustc_ast_lowering/src/item.rs index 717918116e5..0ef21371694 100644 --- a/compiler/rustc_ast_lowering/src/item.rs +++ b/compiler/rustc_ast_lowering/src/item.rs @@ -1386,16 +1386,19 @@ impl<'hir> LoweringContext<'_, 'hir> { let mut params: SmallVec<[hir::GenericParam<'hir>; 4]> = self.lower_generic_params_mut(&generics.params).collect(); + + // Introduce extra lifetimes if late resolution tells us to. + let extra_lifetimes = self.resolver.take_extra_lifetime_params(parent_node_id); + params.extend(extra_lifetimes.into_iter().filter_map(|(ident, node_id, res)| { + self.lifetime_res_to_generic_param(ident, node_id, res) + })); + let has_where_clause_predicates = !generics.where_clause.predicates.is_empty(); let where_clause_span = self.lower_span(generics.where_clause.span); let span = self.lower_span(generics.span); let res = f(self); - let extra_lifetimes = self.resolver.take_extra_lifetime_params(parent_node_id); let impl_trait_defs = std::mem::take(&mut self.impl_trait_defs); - params.extend(extra_lifetimes.into_iter().filter_map(|(ident, node_id, res)| { - self.lifetime_res_to_generic_param(ident, node_id, res) - })); params.extend(impl_trait_defs.into_iter()); let impl_trait_bounds = std::mem::take(&mut self.impl_trait_bounds); diff --git a/compiler/rustc_ast_lowering/src/lib.rs b/compiler/rustc_ast_lowering/src/lib.rs index 4fa2cd5e23b..271ead78c5b 100644 --- a/compiler/rustc_ast_lowering/src/lib.rs +++ b/compiler/rustc_ast_lowering/src/lib.rs @@ -731,7 +731,17 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { LifetimeRes::Param { .. } => { (hir::ParamName::Plain(ident), hir::LifetimeParamKind::Explicit) } - LifetimeRes::Fresh { .. } => (hir::ParamName::Fresh, hir::LifetimeParamKind::Elided), + LifetimeRes::Fresh { param, .. } => { + // Late resolution delegates to us the creation of the `LocalDefId`. + let _def_id = self.create_def( + self.current_hir_id_owner, + param, + DefPathData::LifetimeNs(kw::UnderscoreLifetime), + ); + debug!(?_def_id); + + (hir::ParamName::Fresh, hir::LifetimeParamKind::Elided) + } LifetimeRes::Static | LifetimeRes::Error => return None, res => panic!( "Unexpected lifetime resolution {:?} for {:?} at {:?}", @@ -1814,8 +1824,9 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { } hir::LifetimeName::Param(param, p_name) } - LifetimeRes::Fresh { mut param, binder } => { + LifetimeRes::Fresh { param, binder } => { debug_assert_eq!(ident.name, kw::UnderscoreLifetime); + let mut param = self.local_def_id(param); if let Some(mut captured_lifetimes) = self.captured_lifetimes.take() { if !captured_lifetimes.binders_to_ignore.contains(&binder) { match captured_lifetimes.captures.entry(param) { diff --git a/compiler/rustc_hir/src/def.rs b/compiler/rustc_hir/src/def.rs index 3927523f4c6..a111355c528 100644 --- a/compiler/rustc_hir/src/def.rs +++ b/compiler/rustc_hir/src/def.rs @@ -732,7 +732,9 @@ pub enum LifetimeRes { /// Created a generic parameter for an anonymous lifetime. Fresh { /// Id of the generic parameter that introduced it. - param: LocalDefId, + /// + /// Creating the associated `LocalDefId` is the responsibility of lowering. + param: NodeId, /// Id of the introducing place. See `Param`. binder: NodeId, }, diff --git a/compiler/rustc_resolve/src/late.rs b/compiler/rustc_resolve/src/late.rs index 839e0fe1b50..abccb94a906 100644 --- a/compiler/rustc_resolve/src/late.rs +++ b/compiler/rustc_resolve/src/late.rs @@ -20,7 +20,6 @@ use rustc_errors::DiagnosticId; use rustc_hir::def::Namespace::{self, *}; use rustc_hir::def::{self, CtorKind, DefKind, LifetimeRes, PartialRes, PerNS}; use rustc_hir::def_id::{DefId, LocalDefId, CRATE_DEF_ID}; -use rustc_hir::definitions::DefPathData; use rustc_hir::{PrimTy, TraitCandidate}; use rustc_index::vec::Idx; use rustc_middle::ty::DefIdTree; @@ -1418,31 +1417,20 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> { } #[tracing::instrument(level = "debug", skip(self))] - fn create_fresh_lifetime( - &mut self, - id: NodeId, - ident: Ident, - item_node_id: NodeId, - ) -> LifetimeRes { + fn create_fresh_lifetime(&mut self, id: NodeId, ident: Ident, binder: NodeId) -> LifetimeRes { debug_assert_eq!(ident.name, kw::UnderscoreLifetime); debug!(?ident.span); - let item_def_id = self.r.local_def_id(item_node_id); - let def_node_id = self.r.next_node_id(); - let def_id = self.r.create_def( - item_def_id, - def_node_id, - DefPathData::LifetimeNs(kw::UnderscoreLifetime), - self.parent_scope.expansion.to_expn_id(), - ident.span, - ); - debug!(?def_id); - let res = LifetimeRes::Fresh { param: def_id, binder: item_node_id }; - self.r.extra_lifetime_params_map.entry(item_node_id).or_insert_with(Vec::new).push(( - ident, - def_node_id, - res, - )); + // Leave the responsibility to create the `LocalDefId` to lowering. + let param = self.r.next_node_id(); + let res = LifetimeRes::Fresh { param, binder }; + + // Record the created lifetime parameter so lowering can pick it up and add it to HIR. + self.r + .extra_lifetime_params_map + .entry(binder) + .or_insert_with(Vec::new) + .push((ident, param, res)); res }