Skip to content

Commit 232ec5c

Browse files
authored
Rollup merge of #138502 - petrochenkov:resinstab, r=compiler-errors
resolve: Avoid some unstable iteration This PR replaces #131213.
2 parents 06b135f + a891139 commit 232ec5c

9 files changed

Lines changed: 51 additions & 41 deletions

File tree

‎compiler/rustc_data_structures/src/unord.rs‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,12 @@ impl<V: Eq + Hash> UnordSet<V> {
259259
self.inner.is_empty()
260260
}
261261

262+
/// If the set has only one element, returns it, otherwise returns `None`.
263+
#[inline]
264+
pubfnget_only(&self) -> Option<&V>{
265+
ifself.inner.len() == 1{self.inner.iter().next()}else{None}
266+
}
267+
262268
#[inline]
263269
pubfninsert(&mutself,v:V) -> bool{
264270
self.inner.insert(v)

‎compiler/rustc_middle/src/ty/mod.rs‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexMap, FxIndexSet};
3333
use rustc_data_structures::intern::Interned;
3434
use rustc_data_structures::stable_hasher::{HashStable,StableHasher};
3535
use rustc_data_structures::steal::Steal;
36+
use rustc_data_structures::unord::UnordMap;
3637
use rustc_errors::{Diag,ErrorGuaranteed};
3738
use rustc_hir::LangItem;
3839
use rustc_hir::def::{CtorKind,CtorOf,DefKind,DocLinkResMap,LifetimeRes,Res};
@@ -168,7 +169,7 @@ pub struct ResolverGlobalCtxt {
168169
/// Item with a given `LocalDefId` was defined during macro expansion with ID `ExpnId`.
169170
pubexpn_that_defined:FxHashMap<LocalDefId,ExpnId>,
170171
pubeffective_visibilities:EffectiveVisibilities,
171-
pubextern_crate_map:FxHashMap<LocalDefId,CrateNum>,
172+
pubextern_crate_map:UnordMap<LocalDefId,CrateNum>,
172173
pubmaybe_unused_trait_imports:FxIndexSet<LocalDefId>,
173174
pubmodule_children:LocalDefIdMap<Vec<ModChild>>,
174175
pubglob_map:FxHashMap<LocalDefId,FxHashSet<Symbol>>,

‎compiler/rustc_resolve/src/build_reduced_graph.rs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1115,6 +1115,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
11151115
}
11161116
});
11171117
}else{
1118+
#[allow(rustc::potential_query_instability)]// FIXME
11181119
for ident in single_imports.iter().cloned(){
11191120
let result = self.r.maybe_resolve_ident_in_module(
11201121
ModuleOrUniformRoot::Module(module),

‎compiler/rustc_resolve/src/diagnostics.rs‎

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use rustc_ast::{
66
};
77
use rustc_ast_pretty::pprust;
88
use rustc_data_structures::fx::FxHashSet;
9+
use rustc_data_structures::unord::UnordSet;
910
use rustc_errors::codes::*;
1011
use rustc_errors::{
1112
Applicability,Diag,DiagCtxtHandle,ErrorGuaranteed,MultiSpan,SuggestionStyle,
@@ -1467,6 +1468,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
14671468
return;
14681469
}
14691470

1471+
#[allow(rustc::potential_query_instability)]// FIXME
14701472
let unused_macro = self.unused_macros.iter().find_map(|(def_id,(_, unused_ident))| {
14711473
if unused_ident.name == ident.name{Some((def_id, unused_ident))}else{None}
14721474
});
@@ -2863,18 +2865,11 @@ fn show_candidates(
28632865
}else{
28642866
// Get the unique item kinds and if there's only one, we use the right kind name
28652867
// instead of the more generic "items".
2866-
letmutkinds = accessible_path_strings
2868+
let kinds = accessible_path_strings
28672869
.iter()
28682870
.map(|(_, descr, _, _, _)| *descr)
2869-
.collect::<FxHashSet<&str>>()
2870-
.into_iter();
2871-
let kind = ifletSome(kind) = kinds.next()
2872-
&& letNone = kinds.next()
2873-
{
2874-
kind
2875-
}else{
2876-
"item"
2877-
};
2871+
.collect::<UnordSet<&str>>();
2872+
let kind = ifletSome(kind) = kinds.get_only(){ kind }else{"item"};
28782873
let s = if kind.ends_with('s'){"es"}else{"s"};
28792874

28802875
("one of these", kind, s,String::new(),"")

‎compiler/rustc_resolve/src/ident.rs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -946,6 +946,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
946946

947947
// Check if one of single imports can still define the name,
948948
// if it can then our result is not determined and can be invalidated.
949+
#[allow(rustc::potential_query_instability)]// FIXME
949950
for single_import in&resolution.single_imports{
950951
if ignore_import == Some(*single_import){
951952
// This branch handles a cycle in single imports.

‎compiler/rustc_resolve/src/late.rs‎

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use rustc_ast::visit::{
1818
};
1919
use rustc_ast::*;
2020
use rustc_data_structures::fx::{FxHashMap,FxHashSet,FxIndexMap};
21+
use rustc_data_structures::unord::{UnordMap,UnordSet};
2122
use rustc_errors::codes::*;
2223
use rustc_errors::{
2324
Applicability,DiagArgValue,ErrorGuaranteed,IntoDiagArg,StashKey,Suggestions,
@@ -47,8 +48,6 @@ mod diagnostics;
4748

4849
typeRes = def::Res<NodeId>;
4950

50-
typeIdentMap<T> = FxHashMap<Ident,T>;
51-
5251
use diagnostics::{ElisionFnParameter,LifetimeElisionCandidate,MissingLifetime};
5352

5453
#[derive(Copy,Clone,Debug)]
@@ -273,8 +272,8 @@ impl RibKind<'_> {
273272
/// resolving, the name is looked up from inside out.
274273
#[derive(Debug)]
275274
pub(crate)structRib<'ra,R = Res>{
276-
pubbindings:IdentMap<R>,
277-
pubpatterns_with_skipped_bindings:FxHashMap<DefId,Vec<(Span,Result<(),ErrorGuaranteed>)>>,
275+
pubbindings:FxHashMap<Ident,R>,
276+
pubpatterns_with_skipped_bindings:UnordMap<DefId,Vec<(Span,Result<(),ErrorGuaranteed>)>>,
278277
pubkind:RibKind<'ra>,
279278
}
280279

@@ -1605,12 +1604,12 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
16051604
// for better diagnostics.
16061605
letmut forward_ty_ban_rib_const_param_ty = Rib{
16071606
bindings: forward_ty_ban_rib.bindings.clone(),
1608-
patterns_with_skipped_bindings:FxHashMap::default(),
1607+
patterns_with_skipped_bindings:Default::default(),
16091608
kind:RibKind::ForwardGenericParamBan(ForwardGenericParamBanReason::ConstParamTy),
16101609
};
16111610
letmut forward_const_ban_rib_const_param_ty = Rib{
16121611
bindings: forward_const_ban_rib.bindings.clone(),
1613-
patterns_with_skipped_bindings:FxHashMap::default(),
1612+
patterns_with_skipped_bindings:Default::default(),
16141613
kind:RibKind::ForwardGenericParamBan(ForwardGenericParamBanReason::ConstParamTy),
16151614
};
16161615
// 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> {
23342333
let local_candidates = self.lifetime_elision_candidates.take();
23352334

23362335
ifletSome(candidates) = local_candidates {
2337-
let distinct:FxHashSet<_> = candidates.iter().map(|(res, _)| *res).collect();
2336+
let distinct:UnordSet<_> = candidates.iter().map(|(res, _)| *res).collect();
23382337
let lifetime_count = distinct.len();
23392338
if lifetime_count != 0{
23402339
parameter_info.push(ElisionFnParameter{
@@ -2358,14 +2357,13 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
23582357
}
23592358
}));
23602359
}
2361-
letmut distinct_iter = distinct.into_iter();
2362-
ifletSome(res) = distinct_iter.next(){
2360+
if !distinct.is_empty(){
23632361
match elision_lifetime {
23642362
// We are the first parameter to bind lifetimes.
23652363
Elision::None => {
2366-
ifdistinct_iter.next().is_none(){
2364+
ifletSome(res) = distinct.get_only(){
23672365
// We have a single lifetime => success.
2368-
elision_lifetime = Elision::Param(res)
2366+
elision_lifetime = Elision::Param(*res)
23692367
}else{
23702368
// We have multiple lifetimes => error.
23712369
elision_lifetime = Elision::Err;
@@ -2890,6 +2888,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
28902888
break;
28912889
}
28922890

2891+
#[allow(rustc::potential_query_instability)]// FIXME
28932892
seen_bindings
28942893
.extend(parent_rib.bindings.keys().map(|ident| (*ident, ident.span)));
28952894
}
@@ -4004,7 +4003,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
40044003
}
40054004
}
40064005

4007-
fninnermost_rib_bindings(&mutself,ns:Namespace) -> &mutIdentMap<Res>{
4006+
fninnermost_rib_bindings(&mutself,ns:Namespace) -> &mutFxHashMap<Ident,Res>{
40084007
&mutself.ribs[ns].last_mut().unwrap().bindings
40094008
}
40104009

@@ -5202,6 +5201,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
52025201
letmut late_resolution_visitor = LateResolutionVisitor::new(self);
52035202
late_resolution_visitor.resolve_doc_links(&krate.attrs,MaybeExported::Ok(CRATE_NODE_ID));
52045203
visit::walk_crate(&mut late_resolution_visitor, krate);
5204+
#[allow(rustc::potential_query_instability)]// FIXME
52055205
for(id, span)in late_resolution_visitor.diag_metadata.unused_labels.iter(){
52065206
self.lint_buffer.buffer_lint(
52075207
lint::builtin::UNUSED_LABELS,

‎compiler/rustc_resolve/src/late/diagnostics.rs‎

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -830,6 +830,7 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
830830
ifletSome(rib) = &self.last_block_rib
831831
&& letRibKind::Normal = rib.kind
832832
{
833+
#[allow(rustc::potential_query_instability)]// FIXME
833834
for(ident,&res)in&rib.bindings{
834835
ifletRes::Local(_) = res
835836
&& path.len() == 1
@@ -1018,6 +1019,7 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
10181019
ifletSome(err_code) = err.code{
10191020
if err_code == E0425{
10201021
for label_rib in&self.label_ribs{
1022+
#[allow(rustc::potential_query_instability)]// FIXME
10211023
for(label_ident, node_id)in&label_rib.bindings{
10221024
let ident = path.last().unwrap().ident;
10231025
ifformat!("'{ident}") == label_ident.to_string(){
@@ -1177,7 +1179,10 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
11771179
let[segment] = path else{return};
11781180
letNone = following_seg else{return};
11791181
for rib inself.ribs[ValueNS].iter().rev(){
1180-
for(def_id, spans)in&rib.patterns_with_skipped_bindings{
1182+
let patterns_with_skipped_bindings = self.r.tcx.with_stable_hashing_context(|hcx| {
1183+
rib.patterns_with_skipped_bindings.to_sorted(&hcx,true)
1184+
});
1185+
for(def_id, spans)in patterns_with_skipped_bindings {
11811186
ifletDefKind::Struct | DefKind::Variant = self.r.tcx.def_kind(*def_id)
11821187
&& letSome(fields) = self.r.field_idents(*def_id)
11831188
{
@@ -2052,7 +2057,7 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
20522057
ifself
20532058
.r
20542059
.extern_crate_map
2055-
.iter()
2060+
.items()
20562061
// FIXME: This doesn't include impls like `impl Default for String`.
20572062
.flat_map(|(_, crate_)| self.r.tcx.implementations_of_trait((*crate_, default_trait)))
20582063
.filter_map(|(_, simplified_self_ty)| *simplified_self_ty)
@@ -2261,6 +2266,7 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
22612266
};
22622267

22632268
// Locals and type parameters
2269+
#[allow(rustc::potential_query_instability)]// FIXME
22642270
for(ident,&res)in&rib.bindings{
22652271
iffilter_fn(res) && ident.span.ctxt() == rib_ctxt {
22662272
names.push(TypoSuggestion::typo_from_ident(*ident, res));
@@ -2788,6 +2794,7 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
27882794
let within_scope = self.is_label_valid_from_rib(rib_index);
27892795

27902796
let rib = &self.label_ribs[rib_index];
2797+
#[allow(rustc::potential_query_instability)]// FIXME
27912798
let names = rib
27922799
.bindings
27932800
.iter()
@@ -2799,6 +2806,7 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
27992806
// Upon finding a similar name, get the ident that it was from - the span
28002807
// contained within helps make a useful diagnostic. In addition, determine
28012808
// whether this candidate is within scope.
2809+
#[allow(rustc::potential_query_instability)]// FIXME
28022810
let(ident, _) = rib.bindings.iter().find(|(ident, _)| ident.name == symbol).unwrap();
28032811
(*ident, within_scope)
28042812
})

‎compiler/rustc_resolve/src/lib.rs‎

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
// tidy-alphabetical-start
1010
#![allow(internal_features)]
1111
#![allow(rustc::diagnostic_outside_of_impl)]
12-
#![allow(rustc::potential_query_instability)]
1312
#![allow(rustc::untranslatable_diagnostic)]
1413
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
1514
#![doc(rust_logo)]
@@ -47,6 +46,7 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexMap, FxIndexSet};
4746
use rustc_data_structures::intern::Interned;
4847
use rustc_data_structures::steal::Steal;
4948
use rustc_data_structures::sync::FreezeReadGuard;
49+
use rustc_data_structures::unord::UnordMap;
5050
use rustc_errors::{Applicability,Diag,ErrCode,ErrorGuaranteed};
5151
use rustc_expand::base::{DeriveResolution,SyntaxExtension,SyntaxExtensionKind};
5252
use rustc_feature::BUILTIN_ATTRIBUTES;
@@ -1046,7 +1046,7 @@ pub struct Resolver<'ra, 'tcx> {
10461046
graph_root:Module<'ra>,
10471047

10481048
prelude:Option<Module<'ra>>,
1049-
extern_prelude:FxHashMap<Ident,ExternPreludeEntry<'ra>>,
1049+
extern_prelude:FxIndexMap<Ident,ExternPreludeEntry<'ra>>,
10501050

10511051
/// N.B., this is used only for better diagnostics, not name resolution itself.
10521052
field_names:LocalDefIdMap<Vec<Ident>>,
@@ -1079,7 +1079,7 @@ pub struct Resolver<'ra, 'tcx> {
10791079
extra_lifetime_params_map:NodeMap<Vec<(Ident,NodeId,LifetimeRes)>>,
10801080

10811081
/// `CrateNum` resolutions of `extern crate` items.
1082-
extern_crate_map:FxHashMap<LocalDefId,CrateNum>,
1082+
extern_crate_map:UnordMap<LocalDefId,CrateNum>,
10831083
module_children:LocalDefIdMap<Vec<ModChild>>,
10841084
trait_map:NodeMap<Vec<TraitCandidate>>,
10851085

@@ -1102,7 +1102,7 @@ pub struct Resolver<'ra, 'tcx> {
11021102
/// some AST passes can generate identifiers that only resolve to local or
11031103
/// lang items.
11041104
empty_module:Module<'ra>,
1105-
module_map:FxHashMap<DefId,Module<'ra>>,
1105+
module_map:FxIndexMap<DefId,Module<'ra>>,
11061106
binding_parent_modules:FxHashMap<NameBinding<'ra>,Module<'ra>>,
11071107

11081108
underscore_disambiguator:u32,
@@ -1136,7 +1136,7 @@ pub struct Resolver<'ra, 'tcx> {
11361136
macro_names:FxHashSet<Ident>,
11371137
builtin_macros:FxHashMap<Symbol,BuiltinMacroState>,
11381138
registered_tools:&'tcxRegisteredTools,
1139-
macro_use_prelude:FxHashMap<Symbol,NameBinding<'ra>>,
1139+
macro_use_prelude:FxIndexMap<Symbol,NameBinding<'ra>>,
11401140
macro_map:FxHashMap<DefId,MacroData>,
11411141
dummy_ext_bang:Arc<SyntaxExtension>,
11421142
dummy_ext_derive:Arc<SyntaxExtension>,
@@ -1145,7 +1145,7 @@ pub struct Resolver<'ra, 'tcx> {
11451145
ast_transform_scopes:FxHashMap<LocalExpnId,Module<'ra>>,
11461146
unused_macros:FxHashMap<LocalDefId,(NodeId,Ident)>,
11471147
/// A map from the macro to all its potentially unused arms.
1148-
unused_macro_rules:FxIndexMap<LocalDefId,FxHashMap<usize,(Ident,Span)>>,
1148+
unused_macro_rules:FxIndexMap<LocalDefId,UnordMap<usize,(Ident,Span)>>,
11491149
proc_macro_stubs:FxHashSet<LocalDefId>,
11501150
/// Traces collected during macro resolution and validated when it's complete.
11511151
single_segment_macro_resolutions:
@@ -1259,7 +1259,7 @@ impl<'ra> ResolverArenas<'ra> {
12591259
expn_id:ExpnId,
12601260
span:Span,
12611261
no_implicit_prelude:bool,
1262-
module_map:&mutFxHashMap<DefId,Module<'ra>>,
1262+
module_map:&mutFxIndexMap<DefId,Module<'ra>>,
12631263
module_self_bindings:&mutFxHashMap<Module<'ra>,NameBinding<'ra>>,
12641264
) -> Module<'ra>{
12651265
let module = Module(Interned::new_unchecked(self.modules.alloc(ModuleData::new(
@@ -1404,7 +1404,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
14041404
arenas:&'raResolverArenas<'ra>,
14051405
) -> Resolver<'ra,'tcx>{
14061406
let root_def_id = CRATE_DEF_ID.to_def_id();
1407-
letmut module_map = FxHashMap::default();
1407+
letmut module_map = FxIndexMap::default();
14081408
letmut module_self_bindings = FxHashMap::default();
14091409
let graph_root = arenas.new_module(
14101410
None,
@@ -1421,8 +1421,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
14211421
ExpnId::root(),
14221422
DUMMY_SP,
14231423
true,
1424-
&mutFxHashMap::default(),
1425-
&mutFxHashMap::default(),
1424+
&mutDefault::default(),
1425+
&mutDefault::default(),
14261426
);
14271427

14281428
letmut def_id_to_node_id = IndexVec::default();
@@ -1437,7 +1437,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
14371437
letmut invocation_parents = FxHashMap::default();
14381438
invocation_parents.insert(LocalExpnId::ROOT,InvocationParent::ROOT);
14391439

1440-
letmut extern_prelude:FxHashMap<Ident,ExternPreludeEntry<'_>> = tcx
1440+
letmut extern_prelude:FxIndexMap<Ident,ExternPreludeEntry<'_>> = tcx
14411441
.sess
14421442
.opts
14431443
.externs
@@ -1536,7 +1536,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
15361536
macro_names:FxHashSet::default(),
15371537
builtin_macros:Default::default(),
15381538
registered_tools,
1539-
macro_use_prelude:FxHashMap::default(),
1539+
macro_use_prelude:Default::default(),
15401540
macro_map:FxHashMap::default(),
15411541
dummy_ext_bang:Arc::new(SyntaxExtension::dummy_bang(edition)),
15421542
dummy_ext_derive:Arc::new(SyntaxExtension::dummy_derive(edition)),

‎compiler/rustc_resolve/src/macros.rs‎

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,7 @@ impl<'ra, 'tcx> ResolverExpand for Resolver<'ra, 'tcx> {
323323
}
324324

325325
fncheck_unused_macros(&mutself){
326+
#[allow(rustc::potential_query_instability)]// FIXME
326327
for(_,&(node_id, ident))inself.unused_macros.iter(){
327328
self.lint_buffer.buffer_lint(
328329
UNUSED_MACROS,
@@ -333,10 +334,7 @@ impl<'ra, 'tcx> ResolverExpand for Resolver<'ra, 'tcx> {
333334
}
334335

335336
for(&def_id, unused_arms)inself.unused_macro_rules.iter(){
336-
letmut unused_arms = unused_arms.iter().collect::<Vec<_>>();
337-
unused_arms.sort_by_key(|&(&arm_i, _)| arm_i);
338-
339-
for(&arm_i,&(ident, rule_span))in unused_arms {
337+
for(&arm_i,&(ident, rule_span))in unused_arms.to_sorted_stable_ord(){
340338
ifself.unused_macros.contains_key(&def_id){
341339
// We already lint the entire macro as unused
342340
continue;

0 commit comments

Comments
 (0)