Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion compiler/rustc_ast_lowering/src/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1549,7 +1549,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
fn lower_loop_destination(&mut self, destination: Option<(NodeId, Label)>) -> hir::Destination {
let target_id = match destination {
Some((id, _)) => {
if let Some(loop_id) = self.resolver.get_label_res(id) {
if let Some(loop_id) = self.owner.get_label_res(id) {
let local_id = self.ident_and_label_to_local_id[&loop_id];
let loop_hir_id = HirId { owner: self.current_hir_id_owner, local_id };
Ok(loop_hir_id)
Expand Down
35 changes: 11 additions & 24 deletions compiler/rustc_ast_lowering/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -293,16 +293,6 @@ impl<'tcx> ResolverAstLowering<'tcx> {
self.import_res_map.get(&id).copied().unwrap_or_default()
}

/// Obtains resolution for a label with the given `NodeId`.
fn get_label_res(&self, id: NodeId) -> Option<NodeId> {
self.label_res_map.get(&id).copied()
}

/// Obtains resolution for a lifetime with the given `NodeId`.
fn get_lifetime_res(&self, id: NodeId) -> Option<LifetimeRes> {
self.lifetimes_res_map.get(&id).copied()
}

/// Obtain the list of lifetimes parameters to add to an item.
///
/// Extra lifetime parameters should only be added in places that can appear
Expand All @@ -321,10 +311,6 @@ impl<'tcx> ResolverAstLowering<'tcx> {
fn owner_def_id(&self, id: NodeId) -> LocalDefId {
self.owners[&id].def_id
}

fn lifetime_elision_allowed(&self, id: NodeId) -> bool {
self.lifetime_elision_allowed.contains(&id)
}
}

/// How relaxed bounds `?Trait` should be treated.
Expand Down Expand Up @@ -1625,7 +1611,7 @@ impl<'hir> LoweringContext<'_, 'hir> {

None => {
let id = if let Some(LifetimeRes::ElidedAnchor { start, end }) =
self.resolver.get_lifetime_res(t.id)
self.owner.get_lifetime_res(t.id)
{
assert_eq!(start.plus(1), end);
start
Expand Down Expand Up @@ -1866,7 +1852,9 @@ impl<'hir> LoweringContext<'_, 'hir> {
_ => hir::ImplicitSelfKind::None,
}
}))
.set_lifetime_elision_allowed(self.resolver.lifetime_elision_allowed(fn_node_id))
.set_lifetime_elision_allowed(
self.owner.id == fn_node_id && self.owner.lifetime_elision_allowed,
)
.set_c_variadic(c_variadic);

self.arena.alloc(hir::FnDecl { inputs, output, fn_decl_kind })
Expand Down Expand Up @@ -2032,7 +2020,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
source: LifetimeSource,
syntax: LifetimeSyntax,
) -> &'hir hir::Lifetime {
let res = if let Some(res) = self.resolver.get_lifetime_res(id) {
let res = if let Some(res) = self.owner.get_lifetime_res(id) {
match res {
LifetimeRes::Param { param, .. } => hir::LifetimeKind::Param(param),
LifetimeRes::Fresh { param, .. } => {
Expand Down Expand Up @@ -2118,13 +2106,12 @@ impl<'hir> LoweringContext<'_, 'hir> {
// AST resolution emitted an error on those parameters, so we lower them using
// `ParamName::Error`.
let ident = self.lower_ident(param.ident);
let param_name = if let Some(LifetimeRes::Error(..)) =
self.resolver.get_lifetime_res(param.id)
{
ParamName::Error(ident)
} else {
ParamName::Plain(ident)
};
let param_name =
if let Some(LifetimeRes::Error(..)) = self.owner.get_lifetime_res(param.id) {
ParamName::Error(ident)
} else {
ParamName::Plain(ident)
};
let kind =
hir::GenericParamKind::Lifetime { kind: hir::LifetimeParamKind::Explicit };

Expand Down
4 changes: 2 additions & 2 deletions compiler/rustc_ast_lowering/src/path.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ use super::errors::{
};
use super::{
AllowReturnTypeNotation, GenericArgsCtor, GenericArgsMode, ImplTraitContext, ImplTraitPosition,
LifetimeRes, LoweringContext, ParamMode, ResolverAstLoweringExt,
LifetimeRes, LoweringContext, ParamMode,
};

impl<'hir> LoweringContext<'_, 'hir> {
Expand Down Expand Up @@ -422,7 +422,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
segment_ident_span: Span,
generic_args: &mut GenericArgsCtor<'hir>,
) {
let (start, end) = match self.resolver.get_lifetime_res(segment_id) {
let (start, end) = match self.owner.get_lifetime_res(segment_id) {
Some(LifetimeRes::ElidedAnchor { start, end }) => (start, end),
None => return,
Some(res) => {
Expand Down
1 change: 1 addition & 0 deletions compiler/rustc_middle/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
#![feature(core_intrinsics)]
#![feature(debug_closure_helpers)]
#![feature(decl_macro)]
#![feature(default_field_values)]
#![feature(deref_patterns)]
#![feature(discriminant_kind)]
#![feature(extern_types)]
Expand Down
30 changes: 21 additions & 9 deletions compiler/rustc_middle/src/ty/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ use rustc_ast as ast;
use rustc_ast::expand::typetree::{FncTree, Kind, Type, TypeTree};
use rustc_ast::node_id::NodeMap;
pub use rustc_ast_ir::{Movability, Mutability, try_visit};
use rustc_data_structures::fx::{FxHashSet, FxIndexMap, FxIndexSet};
use rustc_data_structures::fx::{FxIndexMap, FxIndexSet};
use rustc_data_structures::intern::Interned;
use rustc_data_structures::stable_hash::{StableHash, StableHashCtxt, StableHasher};
use rustc_data_structures::steal::Steal;
Expand Down Expand Up @@ -206,7 +206,15 @@ pub struct ResolverGlobalCtxt {

#[derive(Debug)]
pub struct PerOwnerResolverData {
pub node_id_to_def_id: NodeMap<LocalDefId>,
pub node_id_to_def_id: NodeMap<LocalDefId> = Default::default(),
/// Whether lifetime elision was successful.
pub lifetime_elision_allowed: bool = false,
/// Resolutions for labels.
/// Maps from NodeId of the break/continue expression to the NodeId of their corresponding blocks or loops.
pub label_res_map: NodeMap<ast::NodeId> = Default::default(),
/// Resolutions for lifetimes.
pub lifetimes_res_map: NodeMap<LifetimeRes> = Default::default(),

/// The id of the owner
pub id: ast::NodeId,
/// The `DefId` of the owner, can't be found in `node_id_to_def_id`.
Expand All @@ -215,7 +223,17 @@ pub struct PerOwnerResolverData {

impl PerOwnerResolverData {
pub fn new(id: ast::NodeId, def_id: LocalDefId) -> PerOwnerResolverData {
PerOwnerResolverData { node_id_to_def_id: Default::default(), id, def_id }
PerOwnerResolverData { id, def_id, .. }
}

/// Obtains resolution for a label with the given `NodeId`.
pub fn get_label_res(&self, id: ast::NodeId) -> Option<ast::NodeId> {
self.label_res_map.get(&id).copied()
}

/// Obtains resolution for a lifetime with the given `NodeId`.
pub fn get_lifetime_res(&self, id: ast::NodeId) -> Option<LifetimeRes> {
self.lifetimes_res_map.get(&id).copied()
}
}

Expand All @@ -227,10 +245,6 @@ pub struct ResolverAstLowering<'tcx> {
pub partial_res_map: NodeMap<hir::def::PartialRes>,
/// Resolutions for import nodes, which have multiple resolutions in different namespaces.
pub import_res_map: NodeMap<hir::def::PerNS<Option<Res<ast::NodeId>>>>,
/// Resolutions for labels (node IDs of their corresponding blocks or loops).
pub label_res_map: NodeMap<ast::NodeId>,
/// Resolutions for lifetimes.
pub lifetimes_res_map: NodeMap<LifetimeRes>,
/// Lifetime parameters that lowering will have to introduce.
pub extra_lifetime_params_map: NodeMap<Vec<(Ident, ast::NodeId, LifetimeRes)>>,

Expand All @@ -239,8 +253,6 @@ pub struct ResolverAstLowering<'tcx> {
pub owners: NodeMap<PerOwnerResolverData>,

pub trait_map: NodeMap<&'tcx [hir::TraitCandidate<'tcx>]>,
/// List functions and methods for which lifetime elision was successful.
pub lifetime_elision_allowed: FxHashSet<ast::NodeId>,

/// Lints that were emitted by the resolver and early lints.
pub lint_buffer: Steal<LintBuffer>,
Expand Down
14 changes: 8 additions & 6 deletions compiler/rustc_resolve/src/late.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2412,7 +2412,7 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
res: LifetimeRes,
candidate: LifetimeElisionCandidate,
) {
if let Some(prev_res) = self.r.lifetimes_res_map.insert(id, res) {
if let Some(prev_res) = self.r.current_owner.lifetimes_res_map.insert(id, res) {
panic!("lifetime {id:?} resolved multiple times ({prev_res:?} before, {res:?} now)")
}

Expand All @@ -2428,7 +2428,7 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {

#[instrument(level = "debug", skip(self))]
fn record_lifetime_param(&mut self, id: NodeId, res: LifetimeRes) {
if let Some(prev_res) = self.r.lifetimes_res_map.insert(id, res) {
if let Some(prev_res) = self.r.current_owner.lifetimes_res_map.insert(id, res) {
panic!(
"lifetime parameter {id:?} resolved multiple times ({prev_res:?} before, {res:?} now)"
)
Expand Down Expand Up @@ -2456,7 +2456,9 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {

let outer_failures = take(&mut this.diag_metadata.current_elision_failures);
let output_rib = if let Ok(res) = elision_lifetime.as_ref() {
this.r.lifetime_elision_allowed.insert(fn_id);
if fn_id == this.r.current_owner.id {
this.r.current_owner.lifetime_elision_allowed = true;
}
LifetimeRibKind::Elided(*res)
} else {
LifetimeRibKind::ElisionFailure
Expand Down Expand Up @@ -2635,11 +2637,11 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
let lt_id = if let Some(lt) = lt {
lt.id
} else {
let res = self.r.lifetimes_res_map[&ty.id];
let res = self.r.current_owner.lifetimes_res_map[&ty.id];
let LifetimeRes::ElidedAnchor { start, .. } = res else { bug!() };
start
};
let lt_res = self.r.lifetimes_res_map[&lt_id];
let lt_res = self.r.current_owner.lifetimes_res_map[&lt_id];
trace!("FindReferenceVisitor inserting res={:?}", lt_res);
self.lifetime.insert(lt_res);
}
Expand Down Expand Up @@ -5212,7 +5214,7 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
match self.resolve_label(label.ident) {
Ok((node_id, _)) => {
// Since this res is a label, it is never read.
self.r.label_res_map.insert(expr.id, node_id);
self.r.current_owner.label_res_map.insert(expr.id, node_id);
self.diag_metadata.unused_labels.swap_remove(&node_id);
}
Err(error) => {
Expand Down
9 changes: 0 additions & 9 deletions compiler/rustc_resolve/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1380,10 +1380,6 @@ pub struct Resolver<'ra, 'tcx> {
import_res_map: NodeMap<PerNS<Option<Res>>> = Default::default(),
/// An import will be inserted into this map if it has been used.
import_use_map: FxHashMap<Import<'ra>, Used> = default::fx_hash_map(),
/// Resolutions for labels (node IDs of their corresponding blocks or loops).
label_res_map: NodeMap<NodeId> = Default::default(),
/// Resolutions for lifetimes.
lifetimes_res_map: NodeMap<LifetimeRes> = Default::default(),
/// Lifetime parameters that lowering will have to introduce.
extra_lifetime_params_map: NodeMap<Vec<(Ident, NodeId, LifetimeRes)>> = Default::default(),

Expand Down Expand Up @@ -1533,8 +1529,6 @@ pub struct Resolver<'ra, 'tcx> {
/// they are declared in the static array generated by proc_macro_harness.
proc_macros: Vec<LocalDefId> = Vec::new(),
confused_type_with_std_module: FxIndexMap<Span, Span>,
/// Whether lifetime elision was successful.
lifetime_elision_allowed: FxHashSet<NodeId> = default::fx_hash_set(),

/// Names of items that were stripped out via cfg with their corresponding cfg meta item.
stripped_cfg_items: Vec<StrippedCfgItem<NodeId>> = Vec::new(),
Expand Down Expand Up @@ -2017,13 +2011,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
let ast_lowering = ty::ResolverAstLowering {
partial_res_map: self.partial_res_map,
import_res_map: self.import_res_map,
label_res_map: self.label_res_map,
lifetimes_res_map: self.lifetimes_res_map,
extra_lifetime_params_map: self.extra_lifetime_params_map,
next_node_id: self.next_node_id,
owners: self.owners,
trait_map: self.trait_map,
lifetime_elision_allowed: self.lifetime_elision_allowed,
lint_buffer: Steal::new(self.lint_buffer),
delegation_infos: self.delegation_infos,
disambiguators,
Expand Down
Loading