1
Fork 0

resolve: Avoid some unstable iteration

This commit is contained in:
Vadim Petrochenkov 2025-03-14 17:18:41 +03:00
parent f7b4354283
commit a891139df1
9 changed files with 51 additions and 41 deletions

View file

@ -259,6 +259,12 @@ impl<V: Eq + Hash> UnordSet<V> {
self.inner.is_empty() self.inner.is_empty()
} }
/// If the set has only one element, returns it, otherwise returns `None`.
#[inline]
pub fn get_only(&self) -> Option<&V> {
if self.inner.len() == 1 { self.inner.iter().next() } else { None }
}
#[inline] #[inline]
pub fn insert(&mut self, v: V) -> bool { pub fn insert(&mut self, v: V) -> bool {
self.inner.insert(v) self.inner.insert(v)

View file

@ -33,6 +33,7 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexMap, FxIndexSet};
use rustc_data_structures::intern::Interned; use rustc_data_structures::intern::Interned;
use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
use rustc_data_structures::steal::Steal; use rustc_data_structures::steal::Steal;
use rustc_data_structures::unord::UnordMap;
use rustc_errors::{Diag, ErrorGuaranteed}; use rustc_errors::{Diag, ErrorGuaranteed};
use rustc_hir::LangItem; use rustc_hir::LangItem;
use rustc_hir::def::{CtorKind, CtorOf, DefKind, DocLinkResMap, LifetimeRes, Res}; use rustc_hir::def::{CtorKind, CtorOf, DefKind, DocLinkResMap, LifetimeRes, Res};
@ -168,7 +169,7 @@ pub struct ResolverGlobalCtxt {
/// Item with a given `LocalDefId` was defined during macro expansion with ID `ExpnId`. /// Item with a given `LocalDefId` was defined during macro expansion with ID `ExpnId`.
pub expn_that_defined: FxHashMap<LocalDefId, ExpnId>, pub expn_that_defined: FxHashMap<LocalDefId, ExpnId>,
pub effective_visibilities: EffectiveVisibilities, pub effective_visibilities: EffectiveVisibilities,
pub extern_crate_map: FxHashMap<LocalDefId, CrateNum>, pub extern_crate_map: UnordMap<LocalDefId, CrateNum>,
pub maybe_unused_trait_imports: FxIndexSet<LocalDefId>, pub maybe_unused_trait_imports: FxIndexSet<LocalDefId>,
pub module_children: LocalDefIdMap<Vec<ModChild>>, pub module_children: LocalDefIdMap<Vec<ModChild>>,
pub glob_map: FxHashMap<LocalDefId, FxHashSet<Symbol>>, pub glob_map: FxHashMap<LocalDefId, FxHashSet<Symbol>>,

View file

@ -1115,6 +1115,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
} }
}); });
} else { } else {
#[allow(rustc::potential_query_instability)] // FIXME
for ident in single_imports.iter().cloned() { for ident in single_imports.iter().cloned() {
let result = self.r.maybe_resolve_ident_in_module( let result = self.r.maybe_resolve_ident_in_module(
ModuleOrUniformRoot::Module(module), ModuleOrUniformRoot::Module(module),

View file

@ -6,6 +6,7 @@ use rustc_ast::{
}; };
use rustc_ast_pretty::pprust; use rustc_ast_pretty::pprust;
use rustc_data_structures::fx::FxHashSet; use rustc_data_structures::fx::FxHashSet;
use rustc_data_structures::unord::UnordSet;
use rustc_errors::codes::*; use rustc_errors::codes::*;
use rustc_errors::{ use rustc_errors::{
Applicability, Diag, DiagCtxtHandle, ErrorGuaranteed, MultiSpan, SuggestionStyle, Applicability, Diag, DiagCtxtHandle, ErrorGuaranteed, MultiSpan, SuggestionStyle,
@ -1467,6 +1468,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
return; return;
} }
#[allow(rustc::potential_query_instability)] // FIXME
let unused_macro = self.unused_macros.iter().find_map(|(def_id, (_, unused_ident))| { let unused_macro = self.unused_macros.iter().find_map(|(def_id, (_, unused_ident))| {
if unused_ident.name == ident.name { Some((def_id, unused_ident)) } else { None } if unused_ident.name == ident.name { Some((def_id, unused_ident)) } else { None }
}); });
@ -2863,18 +2865,11 @@ fn show_candidates(
} else { } else {
// Get the unique item kinds and if there's only one, we use the right kind name // Get the unique item kinds and if there's only one, we use the right kind name
// instead of the more generic "items". // instead of the more generic "items".
let mut kinds = accessible_path_strings let kinds = accessible_path_strings
.iter() .iter()
.map(|(_, descr, _, _, _)| *descr) .map(|(_, descr, _, _, _)| *descr)
.collect::<FxHashSet<&str>>() .collect::<UnordSet<&str>>();
.into_iter(); let kind = if let Some(kind) = kinds.get_only() { kind } else { "item" };
let kind = if let Some(kind) = kinds.next()
&& let None = kinds.next()
{
kind
} else {
"item"
};
let s = if kind.ends_with('s') { "es" } else { "s" }; let s = if kind.ends_with('s') { "es" } else { "s" };
("one of these", kind, s, String::new(), "") ("one of these", kind, s, String::new(), "")

View file

@ -946,6 +946,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
// Check if one of single imports can still define the name, // Check if one of single imports can still define the name,
// if it can then our result is not determined and can be invalidated. // if it can then our result is not determined and can be invalidated.
#[allow(rustc::potential_query_instability)] // FIXME
for single_import in &resolution.single_imports { for single_import in &resolution.single_imports {
if ignore_import == Some(*single_import) { if ignore_import == Some(*single_import) {
// This branch handles a cycle in single imports. // This branch handles a cycle in single imports.

View file

@ -18,6 +18,7 @@ use rustc_ast::visit::{
}; };
use rustc_ast::*; use rustc_ast::*;
use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexMap}; use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexMap};
use rustc_data_structures::unord::{UnordMap, UnordSet};
use rustc_errors::codes::*; use rustc_errors::codes::*;
use rustc_errors::{ use rustc_errors::{
Applicability, DiagArgValue, ErrorGuaranteed, IntoDiagArg, StashKey, Suggestions, Applicability, DiagArgValue, ErrorGuaranteed, IntoDiagArg, StashKey, Suggestions,
@ -47,8 +48,6 @@ mod diagnostics;
type Res = def::Res<NodeId>; type Res = def::Res<NodeId>;
type IdentMap<T> = FxHashMap<Ident, T>;
use diagnostics::{ElisionFnParameter, LifetimeElisionCandidate, MissingLifetime}; use diagnostics::{ElisionFnParameter, LifetimeElisionCandidate, MissingLifetime};
#[derive(Copy, Clone, Debug)] #[derive(Copy, Clone, Debug)]
@ -273,8 +272,8 @@ impl RibKind<'_> {
/// resolving, the name is looked up from inside out. /// resolving, the name is looked up from inside out.
#[derive(Debug)] #[derive(Debug)]
pub(crate) struct Rib<'ra, R = Res> { pub(crate) struct Rib<'ra, R = Res> {
pub bindings: IdentMap<R>, pub bindings: FxHashMap<Ident, R>,
pub patterns_with_skipped_bindings: FxHashMap<DefId, Vec<(Span, Result<(), ErrorGuaranteed>)>>, pub patterns_with_skipped_bindings: UnordMap<DefId, Vec<(Span, Result<(), ErrorGuaranteed>)>>,
pub kind: RibKind<'ra>, pub kind: RibKind<'ra>,
} }
@ -1605,12 +1604,12 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
// for better diagnostics. // for better diagnostics.
let mut forward_ty_ban_rib_const_param_ty = Rib { let mut forward_ty_ban_rib_const_param_ty = Rib {
bindings: forward_ty_ban_rib.bindings.clone(), bindings: forward_ty_ban_rib.bindings.clone(),
patterns_with_skipped_bindings: FxHashMap::default(), patterns_with_skipped_bindings: Default::default(),
kind: RibKind::ForwardGenericParamBan(ForwardGenericParamBanReason::ConstParamTy), kind: RibKind::ForwardGenericParamBan(ForwardGenericParamBanReason::ConstParamTy),
}; };
let mut forward_const_ban_rib_const_param_ty = Rib { let mut forward_const_ban_rib_const_param_ty = Rib {
bindings: forward_const_ban_rib.bindings.clone(), bindings: forward_const_ban_rib.bindings.clone(),
patterns_with_skipped_bindings: FxHashMap::default(), patterns_with_skipped_bindings: Default::default(),
kind: RibKind::ForwardGenericParamBan(ForwardGenericParamBanReason::ConstParamTy), kind: RibKind::ForwardGenericParamBan(ForwardGenericParamBanReason::ConstParamTy),
}; };
// We'll ban these with a `ConstParamTy` rib, so just clear these ribs for better // We'll ban these with a `ConstParamTy` rib, so just clear these ribs for better
@ -2334,7 +2333,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
let local_candidates = self.lifetime_elision_candidates.take(); let local_candidates = self.lifetime_elision_candidates.take();
if let Some(candidates) = local_candidates { if let Some(candidates) = local_candidates {
let distinct: FxHashSet<_> = candidates.iter().map(|(res, _)| *res).collect(); let distinct: UnordSet<_> = candidates.iter().map(|(res, _)| *res).collect();
let lifetime_count = distinct.len(); let lifetime_count = distinct.len();
if lifetime_count != 0 { if lifetime_count != 0 {
parameter_info.push(ElisionFnParameter { parameter_info.push(ElisionFnParameter {
@ -2358,14 +2357,13 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
} }
})); }));
} }
let mut distinct_iter = distinct.into_iter(); if !distinct.is_empty() {
if let Some(res) = distinct_iter.next() {
match elision_lifetime { match elision_lifetime {
// We are the first parameter to bind lifetimes. // We are the first parameter to bind lifetimes.
Elision::None => { Elision::None => {
if distinct_iter.next().is_none() { if let Some(res) = distinct.get_only() {
// We have a single lifetime => success. // We have a single lifetime => success.
elision_lifetime = Elision::Param(res) elision_lifetime = Elision::Param(*res)
} else { } else {
// We have multiple lifetimes => error. // We have multiple lifetimes => error.
elision_lifetime = Elision::Err; elision_lifetime = Elision::Err;
@ -2890,6 +2888,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
break; break;
} }
#[allow(rustc::potential_query_instability)] // FIXME
seen_bindings seen_bindings
.extend(parent_rib.bindings.keys().map(|ident| (*ident, ident.span))); .extend(parent_rib.bindings.keys().map(|ident| (*ident, ident.span)));
} }
@ -4004,7 +4003,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
} }
} }
fn innermost_rib_bindings(&mut self, ns: Namespace) -> &mut IdentMap<Res> { fn innermost_rib_bindings(&mut self, ns: Namespace) -> &mut FxHashMap<Ident, Res> {
&mut self.ribs[ns].last_mut().unwrap().bindings &mut self.ribs[ns].last_mut().unwrap().bindings
} }
@ -5202,6 +5201,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
let mut late_resolution_visitor = LateResolutionVisitor::new(self); let mut late_resolution_visitor = LateResolutionVisitor::new(self);
late_resolution_visitor.resolve_doc_links(&krate.attrs, MaybeExported::Ok(CRATE_NODE_ID)); late_resolution_visitor.resolve_doc_links(&krate.attrs, MaybeExported::Ok(CRATE_NODE_ID));
visit::walk_crate(&mut late_resolution_visitor, krate); visit::walk_crate(&mut late_resolution_visitor, krate);
#[allow(rustc::potential_query_instability)] // FIXME
for (id, span) in late_resolution_visitor.diag_metadata.unused_labels.iter() { for (id, span) in late_resolution_visitor.diag_metadata.unused_labels.iter() {
self.lint_buffer.buffer_lint( self.lint_buffer.buffer_lint(
lint::builtin::UNUSED_LABELS, lint::builtin::UNUSED_LABELS,

View file

@ -830,6 +830,7 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
if let Some(rib) = &self.last_block_rib if let Some(rib) = &self.last_block_rib
&& let RibKind::Normal = rib.kind && let RibKind::Normal = rib.kind
{ {
#[allow(rustc::potential_query_instability)] // FIXME
for (ident, &res) in &rib.bindings { for (ident, &res) in &rib.bindings {
if let Res::Local(_) = res if let Res::Local(_) = res
&& path.len() == 1 && path.len() == 1
@ -1018,6 +1019,7 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
if let Some(err_code) = err.code { if let Some(err_code) = err.code {
if err_code == E0425 { if err_code == E0425 {
for label_rib in &self.label_ribs { for label_rib in &self.label_ribs {
#[allow(rustc::potential_query_instability)] // FIXME
for (label_ident, node_id) in &label_rib.bindings { for (label_ident, node_id) in &label_rib.bindings {
let ident = path.last().unwrap().ident; let ident = path.last().unwrap().ident;
if format!("'{ident}") == label_ident.to_string() { if format!("'{ident}") == label_ident.to_string() {
@ -1177,7 +1179,10 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
let [segment] = path else { return }; let [segment] = path else { return };
let None = following_seg else { return }; let None = following_seg else { return };
for rib in self.ribs[ValueNS].iter().rev() { for rib in self.ribs[ValueNS].iter().rev() {
for (def_id, spans) in &rib.patterns_with_skipped_bindings { let patterns_with_skipped_bindings = self.r.tcx.with_stable_hashing_context(|hcx| {
rib.patterns_with_skipped_bindings.to_sorted(&hcx, true)
});
for (def_id, spans) in patterns_with_skipped_bindings {
if let DefKind::Struct | DefKind::Variant = self.r.tcx.def_kind(*def_id) if let DefKind::Struct | DefKind::Variant = self.r.tcx.def_kind(*def_id)
&& let Some(fields) = self.r.field_idents(*def_id) && let Some(fields) = self.r.field_idents(*def_id)
{ {
@ -2052,7 +2057,7 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
if self if self
.r .r
.extern_crate_map .extern_crate_map
.iter() .items()
// FIXME: This doesn't include impls like `impl Default for String`. // FIXME: This doesn't include impls like `impl Default for String`.
.flat_map(|(_, crate_)| self.r.tcx.implementations_of_trait((*crate_, default_trait))) .flat_map(|(_, crate_)| self.r.tcx.implementations_of_trait((*crate_, default_trait)))
.filter_map(|(_, simplified_self_ty)| *simplified_self_ty) .filter_map(|(_, simplified_self_ty)| *simplified_self_ty)
@ -2261,6 +2266,7 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
}; };
// Locals and type parameters // Locals and type parameters
#[allow(rustc::potential_query_instability)] // FIXME
for (ident, &res) in &rib.bindings { for (ident, &res) in &rib.bindings {
if filter_fn(res) && ident.span.ctxt() == rib_ctxt { if filter_fn(res) && ident.span.ctxt() == rib_ctxt {
names.push(TypoSuggestion::typo_from_ident(*ident, res)); names.push(TypoSuggestion::typo_from_ident(*ident, res));
@ -2788,6 +2794,7 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
let within_scope = self.is_label_valid_from_rib(rib_index); let within_scope = self.is_label_valid_from_rib(rib_index);
let rib = &self.label_ribs[rib_index]; let rib = &self.label_ribs[rib_index];
#[allow(rustc::potential_query_instability)] // FIXME
let names = rib let names = rib
.bindings .bindings
.iter() .iter()
@ -2799,6 +2806,7 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
// Upon finding a similar name, get the ident that it was from - the span // Upon finding a similar name, get the ident that it was from - the span
// contained within helps make a useful diagnostic. In addition, determine // contained within helps make a useful diagnostic. In addition, determine
// whether this candidate is within scope. // whether this candidate is within scope.
#[allow(rustc::potential_query_instability)] // FIXME
let (ident, _) = rib.bindings.iter().find(|(ident, _)| ident.name == symbol).unwrap(); let (ident, _) = rib.bindings.iter().find(|(ident, _)| ident.name == symbol).unwrap();
(*ident, within_scope) (*ident, within_scope)
}) })

View file

@ -9,7 +9,6 @@
// tidy-alphabetical-start // tidy-alphabetical-start
#![allow(internal_features)] #![allow(internal_features)]
#![allow(rustc::diagnostic_outside_of_impl)] #![allow(rustc::diagnostic_outside_of_impl)]
#![allow(rustc::potential_query_instability)]
#![allow(rustc::untranslatable_diagnostic)] #![allow(rustc::untranslatable_diagnostic)]
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")] #![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
#![doc(rust_logo)] #![doc(rust_logo)]
@ -47,6 +46,7 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexMap, FxIndexSet};
use rustc_data_structures::intern::Interned; use rustc_data_structures::intern::Interned;
use rustc_data_structures::steal::Steal; use rustc_data_structures::steal::Steal;
use rustc_data_structures::sync::FreezeReadGuard; use rustc_data_structures::sync::FreezeReadGuard;
use rustc_data_structures::unord::UnordMap;
use rustc_errors::{Applicability, Diag, ErrCode, ErrorGuaranteed}; use rustc_errors::{Applicability, Diag, ErrCode, ErrorGuaranteed};
use rustc_expand::base::{DeriveResolution, SyntaxExtension, SyntaxExtensionKind}; use rustc_expand::base::{DeriveResolution, SyntaxExtension, SyntaxExtensionKind};
use rustc_feature::BUILTIN_ATTRIBUTES; use rustc_feature::BUILTIN_ATTRIBUTES;
@ -1046,7 +1046,7 @@ pub struct Resolver<'ra, 'tcx> {
graph_root: Module<'ra>, graph_root: Module<'ra>,
prelude: Option<Module<'ra>>, prelude: Option<Module<'ra>>,
extern_prelude: FxHashMap<Ident, ExternPreludeEntry<'ra>>, extern_prelude: FxIndexMap<Ident, ExternPreludeEntry<'ra>>,
/// N.B., this is used only for better diagnostics, not name resolution itself. /// N.B., this is used only for better diagnostics, not name resolution itself.
field_names: LocalDefIdMap<Vec<Ident>>, field_names: LocalDefIdMap<Vec<Ident>>,
@ -1079,7 +1079,7 @@ pub struct Resolver<'ra, 'tcx> {
extra_lifetime_params_map: NodeMap<Vec<(Ident, NodeId, LifetimeRes)>>, extra_lifetime_params_map: NodeMap<Vec<(Ident, NodeId, LifetimeRes)>>,
/// `CrateNum` resolutions of `extern crate` items. /// `CrateNum` resolutions of `extern crate` items.
extern_crate_map: FxHashMap<LocalDefId, CrateNum>, extern_crate_map: UnordMap<LocalDefId, CrateNum>,
module_children: LocalDefIdMap<Vec<ModChild>>, module_children: LocalDefIdMap<Vec<ModChild>>,
trait_map: NodeMap<Vec<TraitCandidate>>, trait_map: NodeMap<Vec<TraitCandidate>>,
@ -1102,7 +1102,7 @@ pub struct Resolver<'ra, 'tcx> {
/// some AST passes can generate identifiers that only resolve to local or /// some AST passes can generate identifiers that only resolve to local or
/// lang items. /// lang items.
empty_module: Module<'ra>, empty_module: Module<'ra>,
module_map: FxHashMap<DefId, Module<'ra>>, module_map: FxIndexMap<DefId, Module<'ra>>,
binding_parent_modules: FxHashMap<NameBinding<'ra>, Module<'ra>>, binding_parent_modules: FxHashMap<NameBinding<'ra>, Module<'ra>>,
underscore_disambiguator: u32, underscore_disambiguator: u32,
@ -1136,7 +1136,7 @@ pub struct Resolver<'ra, 'tcx> {
macro_names: FxHashSet<Ident>, macro_names: FxHashSet<Ident>,
builtin_macros: FxHashMap<Symbol, BuiltinMacroState>, builtin_macros: FxHashMap<Symbol, BuiltinMacroState>,
registered_tools: &'tcx RegisteredTools, registered_tools: &'tcx RegisteredTools,
macro_use_prelude: FxHashMap<Symbol, NameBinding<'ra>>, macro_use_prelude: FxIndexMap<Symbol, NameBinding<'ra>>,
macro_map: FxHashMap<DefId, MacroData>, macro_map: FxHashMap<DefId, MacroData>,
dummy_ext_bang: Arc<SyntaxExtension>, dummy_ext_bang: Arc<SyntaxExtension>,
dummy_ext_derive: Arc<SyntaxExtension>, dummy_ext_derive: Arc<SyntaxExtension>,
@ -1145,7 +1145,7 @@ pub struct Resolver<'ra, 'tcx> {
ast_transform_scopes: FxHashMap<LocalExpnId, Module<'ra>>, ast_transform_scopes: FxHashMap<LocalExpnId, Module<'ra>>,
unused_macros: FxHashMap<LocalDefId, (NodeId, Ident)>, unused_macros: FxHashMap<LocalDefId, (NodeId, Ident)>,
/// A map from the macro to all its potentially unused arms. /// A map from the macro to all its potentially unused arms.
unused_macro_rules: FxIndexMap<LocalDefId, FxHashMap<usize, (Ident, Span)>>, unused_macro_rules: FxIndexMap<LocalDefId, UnordMap<usize, (Ident, Span)>>,
proc_macro_stubs: FxHashSet<LocalDefId>, proc_macro_stubs: FxHashSet<LocalDefId>,
/// Traces collected during macro resolution and validated when it's complete. /// Traces collected during macro resolution and validated when it's complete.
single_segment_macro_resolutions: single_segment_macro_resolutions:
@ -1259,7 +1259,7 @@ impl<'ra> ResolverArenas<'ra> {
expn_id: ExpnId, expn_id: ExpnId,
span: Span, span: Span,
no_implicit_prelude: bool, no_implicit_prelude: bool,
module_map: &mut FxHashMap<DefId, Module<'ra>>, module_map: &mut FxIndexMap<DefId, Module<'ra>>,
module_self_bindings: &mut FxHashMap<Module<'ra>, NameBinding<'ra>>, module_self_bindings: &mut FxHashMap<Module<'ra>, NameBinding<'ra>>,
) -> Module<'ra> { ) -> Module<'ra> {
let module = Module(Interned::new_unchecked(self.modules.alloc(ModuleData::new( let module = Module(Interned::new_unchecked(self.modules.alloc(ModuleData::new(
@ -1404,7 +1404,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
arenas: &'ra ResolverArenas<'ra>, arenas: &'ra ResolverArenas<'ra>,
) -> Resolver<'ra, 'tcx> { ) -> Resolver<'ra, 'tcx> {
let root_def_id = CRATE_DEF_ID.to_def_id(); let root_def_id = CRATE_DEF_ID.to_def_id();
let mut module_map = FxHashMap::default(); let mut module_map = FxIndexMap::default();
let mut module_self_bindings = FxHashMap::default(); let mut module_self_bindings = FxHashMap::default();
let graph_root = arenas.new_module( let graph_root = arenas.new_module(
None, None,
@ -1421,8 +1421,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
ExpnId::root(), ExpnId::root(),
DUMMY_SP, DUMMY_SP,
true, true,
&mut FxHashMap::default(), &mut Default::default(),
&mut FxHashMap::default(), &mut Default::default(),
); );
let mut def_id_to_node_id = IndexVec::default(); let mut def_id_to_node_id = IndexVec::default();
@ -1437,7 +1437,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
let mut invocation_parents = FxHashMap::default(); let mut invocation_parents = FxHashMap::default();
invocation_parents.insert(LocalExpnId::ROOT, InvocationParent::ROOT); invocation_parents.insert(LocalExpnId::ROOT, InvocationParent::ROOT);
let mut extern_prelude: FxHashMap<Ident, ExternPreludeEntry<'_>> = tcx let mut extern_prelude: FxIndexMap<Ident, ExternPreludeEntry<'_>> = tcx
.sess .sess
.opts .opts
.externs .externs
@ -1536,7 +1536,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
macro_names: FxHashSet::default(), macro_names: FxHashSet::default(),
builtin_macros: Default::default(), builtin_macros: Default::default(),
registered_tools, registered_tools,
macro_use_prelude: FxHashMap::default(), macro_use_prelude: Default::default(),
macro_map: FxHashMap::default(), macro_map: FxHashMap::default(),
dummy_ext_bang: Arc::new(SyntaxExtension::dummy_bang(edition)), dummy_ext_bang: Arc::new(SyntaxExtension::dummy_bang(edition)),
dummy_ext_derive: Arc::new(SyntaxExtension::dummy_derive(edition)), dummy_ext_derive: Arc::new(SyntaxExtension::dummy_derive(edition)),

View file

@ -323,6 +323,7 @@ impl<'ra, 'tcx> ResolverExpand for Resolver<'ra, 'tcx> {
} }
fn check_unused_macros(&mut self) { fn check_unused_macros(&mut self) {
#[allow(rustc::potential_query_instability)] // FIXME
for (_, &(node_id, ident)) in self.unused_macros.iter() { for (_, &(node_id, ident)) in self.unused_macros.iter() {
self.lint_buffer.buffer_lint( self.lint_buffer.buffer_lint(
UNUSED_MACROS, UNUSED_MACROS,
@ -333,10 +334,7 @@ impl<'ra, 'tcx> ResolverExpand for Resolver<'ra, 'tcx> {
} }
for (&def_id, unused_arms) in self.unused_macro_rules.iter() { for (&def_id, unused_arms) in self.unused_macro_rules.iter() {
let mut unused_arms = unused_arms.iter().collect::<Vec<_>>(); for (&arm_i, &(ident, rule_span)) in unused_arms.to_sorted_stable_ord() {
unused_arms.sort_by_key(|&(&arm_i, _)| arm_i);
for (&arm_i, &(ident, rule_span)) in unused_arms {
if self.unused_macros.contains_key(&def_id) { if self.unused_macros.contains_key(&def_id) {
// We already lint the entire macro as unused // We already lint the entire macro as unused
continue; continue;