Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit f0dbfad

Browse files
resolve: Merge ExternPreludeEntry::only_item into flag_binding
1 parent 7aec84d commit f0dbfad

File tree

3 files changed

+37
-37
lines changed

3 files changed

+37
-37
lines changed

‎compiler/rustc_resolve/src/build_reduced_graph.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1014,8 +1014,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
10141014
}
10151015
Entry::Vacant(vacant) => vacant.insert(ExternPreludeEntry {
10161016
item_binding: Some((imported_binding, true)),
1017-
flag_binding: Cell::new(None),
1018-
only_item: true,
1017+
flag_binding: None,
10191018
}),
10201019
};
10211020
}

‎compiler/rustc_resolve/src/diagnostics.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1846,7 +1846,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
18461846
let extern_prelude_ambiguity = || {
18471847
self.extern_prelude.get(&Macros20NormalizedIdent::new(ident)).is_some_and(|entry| {
18481848
entry.item_binding.map(|(b, _)| b) == Some(b1)
1849-
&& entry.flag_binding.get() == Some(b2)
1849+
&& entry.flag_binding.as_ref().and_then(|pb| pb.get().binding()) == Some(b2)
18501850
})
18511851
};
18521852
let (b1, b2, misc1, misc2, swapped) = if b2.span.is_dummy() && !b1.span.is_dummy() {

‎compiler/rustc_resolve/src/lib.rs

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use std::sync::Arc;
3232
use diagnostics::{ImportSuggestion, LabelSuggestion, Suggestion};
3333
use effective_visibilities::EffectiveVisibilitiesVisitor;
3434
use errors::{ParamKindInEnumDiscriminant, ParamKindInNonTrivialAnonConst};
35-
use imports::{Import, ImportData, ImportKind, NameResolution};
35+
use imports::{Import, ImportData, ImportKind, NameResolution,PendingBinding};
3636
use late::{
3737
ForwardGenericParamBanReason, HasGenericParams, PathSource, PatternSource,
3838
UnnecessaryQualification,
@@ -1025,23 +1025,26 @@ impl<'ra> NameBindingData<'ra> {
10251025
}
10261026
}
10271027

1028-
#[derive(Default, Clone)]
10291028
struct ExternPreludeEntry<'ra> {
10301029
/// Binding from an `extern crate` item.
10311030
/// The boolean flag is true is `item_binding` is non-redundant, happens either when
1032-
/// `only_item` is true, or when `extern crate` introducing `item_binding` used renaming.
1031+
/// `flag_binding` is `None`, or when `extern crate` introducing `item_binding` used renaming.
10331032
item_binding: Option<(NameBinding<'ra>, /* introduced by item */ bool)>,
10341033
/// Binding from an `--extern` flag, lazily populated on first use.
1035-
flag_binding: Cell<Option<NameBinding<'ra>>>,
1036-
/// There was no `--extern` flag introducing this name,
1037-
/// `flag_binding` doesn't need to be populated.
1038-
only_item: bool,
1034+
flag_binding: Option<Cell<PendingBinding<'ra>>>,
10391035
}
10401036

10411037
impl ExternPreludeEntry<'_> {
10421038
fn introduced_by_item(&self) -> bool {
10431039
matches!(self.item_binding, Some((_, true)))
10441040
}
1041+
1042+
fn flag() -> Self {
1043+
ExternPreludeEntry {
1044+
item_binding: None,
1045+
flag_binding: Some(Cell::new(PendingBinding::Pending)),
1046+
}
1047+
}
10451048
}
10461049

10471050
struct DeriveData {
@@ -1533,19 +1536,20 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
15331536
&& let name = Symbol::intern(name)
15341537
&& name.can_be_raw()
15351538
{
1536-
Some((Macros20NormalizedIdent::with_dummy_span(name), Default::default()))
1539+
let ident = Macros20NormalizedIdent::with_dummy_span(name);
1540+
Some((ident, ExternPreludeEntry::flag()))
15371541
} else {
15381542
None
15391543
}
15401544
})
15411545
.collect();
15421546

15431547
if !attr::contains_name(attrs, sym::no_core) {
1544-
extern_prelude
1545-
.insert(Macros20NormalizedIdent::with_dummy_span(sym::core),Default::default());
1548+
let ident = Macros20NormalizedIdent::with_dummy_span(sym::core);
1549+
extern_prelude.insert(ident,ExternPreludeEntry::flag());
15461550
if !attr::contains_name(attrs, sym::no_std) {
1547-
extern_prelude
1548-
.insert(Macros20NormalizedIdent::with_dummy_span(sym::std),Default::default());
1551+
let ident = Macros20NormalizedIdent::with_dummy_span(sym::std);
1552+
extern_prelude.insert(ident,ExternPreludeEntry::flag());
15491553
}
15501554
}
15511555

@@ -2240,31 +2244,28 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
22402244

22412245
fn extern_prelude_get_flag(&self, ident: Ident, finalize: bool) -> Option<NameBinding<'ra>> {
22422246
let entry = self.extern_prelude.get(&Macros20NormalizedIdent::new(ident));
2243-
entry.and_then(|entry| match entry.flag_binding.get() {
2244-
Some(binding) => {
2245-
if finalize {
2246-
self.cstore_mut().process_path_extern(self.tcx, ident.name, ident.span);
2247+
entry.and_then(|entry| entry.flag_binding.as_ref()).and_then(|flag_binding| {
2248+
let binding = match flag_binding.get() {
2249+
PendingBinding::Ready(binding) => {
2250+
if finalize {
2251+
self.cstore_mut().process_path_extern(self.tcx, ident.name, ident.span);
2252+
}
2253+
binding
22472254
}
2248-
Some(binding)
2249-
}
2250-
None if entry.only_item => None,
2251-
None => {
2252-
let crate_id = if finalize {
2253-
self.cstore_mut().process_path_extern(self.tcx, ident.name, ident.span)
2254-
} else {
2255-
self.cstore_mut().maybe_process_path_extern(self.tcx, ident.name)
2256-
};
2257-
match crate_id {
2258-
Some(crate_id) => {
2255+
PendingBinding::Pending => {
2256+
let crate_id = if finalize {
2257+
self.cstore_mut().process_path_extern(self.tcx, ident.name, ident.span)
2258+
} else {
2259+
self.cstore_mut().maybe_process_path_extern(self.tcx, ident.name)
2260+
};
2261+
crate_id.map(|crate_id| {
22592262
let res = Res::Def(DefKind::Mod, crate_id.as_def_id());
2260-
let binding =
2261-
self.arenas.new_pub_res_binding(res, DUMMY_SP, LocalExpnId::ROOT);
2262-
entry.flag_binding.set(Some(binding));
2263-
Some(binding)
2264-
}
2265-
None => finalize.then_some(self.dummy_binding),
2263+
self.arenas.new_pub_res_binding(res, DUMMY_SP, LocalExpnId::ROOT)
2264+
})
22662265
}
2267-
}
2266+
};
2267+
flag_binding.set(PendingBinding::Ready(binding));
2268+
binding.or_else(|| finalize.then_some(self.dummy_binding))
22682269
})
22692270
}
22702271

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /