Skip to content

Commit e17c41e

Browse files
replace binding and shadowed_glob on NameResolution with non_glob_binding and glob_binding
1 parent cdac44e commit e17c41e

13 files changed

+60
-99
lines changed

compiler/rustc_resolve/src/check_unused.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,7 @@ impl Resolver<'_, '_> {
511511
for (_key, resolution) in self.resolutions(*module).borrow().iter() {
512512
let resolution = resolution.borrow();
513513

514-
if let Some(binding) = resolution.binding
514+
if let Some(binding) = resolution.late_binding()
515515
&& let NameBindingKind::Import { import, .. } = binding.kind
516516
&& let ImportKind::Single { id, .. } = import.kind
517517
{

compiler/rustc_resolve/src/diagnostics.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1440,7 +1440,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
14401440
|(key, name_resolution)| {
14411441
if key.ns == TypeNS
14421442
&& key.ident == ident
1443-
&& let Some(binding) = name_resolution.borrow().binding
1443+
&& let Some(binding) = name_resolution.borrow().late_binding()
14441444
{
14451445
match binding.res() {
14461446
// No disambiguation needed if the identically named item we
@@ -1494,7 +1494,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
14941494
return None;
14951495
};
14961496
for (_, resolution) in this.resolutions(m).borrow().iter() {
1497-
let Some(binding) = resolution.borrow().binding else {
1497+
let Some(binding) = resolution.borrow().late_binding() else {
14981498
continue;
14991499
};
15001500
let Res::Def(DefKind::Macro(MacroKind::Derive | MacroKind::Attr), def_id) =

compiler/rustc_resolve/src/ident.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -875,15 +875,15 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
875875
// binding if it exists. What we really want here is having two separate scopes in
876876
// a module - one for non-globs and one for globs, but until that's done use this
877877
// hack to avoid inconsistent resolution ICEs during import validation.
878-
let binding = [resolution.binding, resolution.shadowed_glob]
878+
let binding = [resolution.non_glob_binding, resolution.glob_binding]
879879
.into_iter()
880880
.find_map(|binding| if binding == ignore_binding { None } else { binding });
881881

882882
if let Some(finalize) = finalize {
883883
return self.finalize_module_binding(
884884
ident,
885885
binding,
886-
resolution.shadowed_glob,
886+
resolution.glob_binding,
887887
parent_scope,
888888
finalize,
889889
shadowing,

compiler/rustc_resolve/src/imports.rs

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use rustc_span::edit_distance::find_best_match_for_name;
2222
use rustc_span::hygiene::LocalExpnId;
2323
use rustc_span::{Ident, Span, Symbol, kw, sym};
2424
use smallvec::SmallVec;
25-
use tracing::debug;
25+
use tracing::{debug, instrument};
2626

2727
use crate::Determinacy::{self, *};
2828
use crate::Namespace::*;
@@ -242,21 +242,20 @@ pub(crate) struct NameResolution<'ra> {
242242
/// Single imports that may define the name in the namespace.
243243
/// Imports are arena-allocated, so it's ok to use pointers as keys.
244244
pub single_imports: FxIndexSet<Import<'ra>>,
245-
/// The least shadowable known binding for this name, or None if there are no known bindings.
246-
pub binding: Option<NameBinding<'ra>>,
247-
pub shadowed_glob: Option<NameBinding<'ra>>,
245+
/// The least shadowable known non-glob binding for this name, or None if there are no known bindings.
246+
pub non_glob_binding: Option<NameBinding<'ra>>,
247+
pub glob_binding: Option<NameBinding<'ra>>,
248248
}
249249

250250
impl<'ra> NameResolution<'ra> {
251251
/// Returns the binding for the name if it is known or None if it not known.
252252
pub(crate) fn binding(&self) -> Option<NameBinding<'ra>> {
253-
self.binding.and_then(|binding| {
254-
if !binding.is_glob_import() || self.single_imports.is_empty() {
255-
Some(binding)
256-
} else {
257-
None
258-
}
259-
})
253+
self.non_glob_binding
254+
.or_else(|| if self.single_imports.is_empty() { self.glob_binding } else { None })
255+
}
256+
257+
pub(crate) fn late_binding(&self) -> Option<NameBinding<'ra>> {
258+
self.non_glob_binding.or_else(|| self.glob_binding)
260259
}
261260
}
262261

@@ -338,7 +337,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
338337
self.check_reserved_macro_name(key.ident, res);
339338
self.set_binding_parent_module(binding, module);
340339
self.update_resolution(module, key, warn_ambiguity, |this, resolution| {
341-
if let Some(old_binding) = resolution.binding {
340+
if let Some(old_binding) = resolution.non_glob_binding {
342341
if res == Res::Err && old_binding.res() != Res::Err {
343342
// Do not override real bindings with `Res::Err`s from error recovery.
344343
return Ok(());
@@ -355,19 +354,20 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
355354
// We should replace the `old_binding` with `binding` regardless
356355
// of whether they has same resolution or not when they are
357356
// imported from the same glob-import statement.
358-
resolution.binding = Some(binding);
357+
resolution.non_glob_binding = Some(binding);
359358
} else if res != old_binding.res() {
360-
resolution.binding = Some(this.new_ambiguity_binding(
359+
resolution.non_glob_binding = Some(this.new_ambiguity_binding(
361360
AmbiguityKind::GlobVsGlob,
362361
old_binding,
363362
binding,
364363
warn_ambiguity,
365364
));
366365
} else if !old_binding.vis.is_at_least(binding.vis, this.tcx) {
367366
// We are glob-importing the same item but with greater visibility.
368-
resolution.binding = Some(binding);
367+
resolution.non_glob_binding = Some(binding);
369368
} else if binding.is_ambiguity_recursive() {
370-
resolution.binding = Some(this.new_warn_ambiguity_binding(binding));
369+
resolution.non_glob_binding =
370+
Some(this.new_warn_ambiguity_binding(binding));
371371
}
372372
}
373373
(old_glob @ true, false) | (old_glob @ false, true) => {
@@ -377,38 +377,38 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
377377
&& nonglob_binding.expansion != LocalExpnId::ROOT
378378
&& glob_binding.res() != nonglob_binding.res()
379379
{
380-
resolution.binding = Some(this.new_ambiguity_binding(
380+
resolution.non_glob_binding = Some(this.new_ambiguity_binding(
381381
AmbiguityKind::GlobVsExpanded,
382382
nonglob_binding,
383383
glob_binding,
384384
false,
385385
));
386386
} else {
387-
resolution.binding = Some(nonglob_binding);
387+
resolution.non_glob_binding = Some(nonglob_binding);
388388
}
389389

390-
if let Some(old_shadowed_glob) = resolution.shadowed_glob {
390+
if let Some(old_shadowed_glob) = resolution.glob_binding {
391391
assert!(old_shadowed_glob.is_glob_import());
392392
if glob_binding.res() != old_shadowed_glob.res() {
393-
resolution.shadowed_glob = Some(this.new_ambiguity_binding(
393+
resolution.glob_binding = Some(this.new_ambiguity_binding(
394394
AmbiguityKind::GlobVsGlob,
395395
old_shadowed_glob,
396396
glob_binding,
397397
false,
398398
));
399399
} else if !old_shadowed_glob.vis.is_at_least(binding.vis, this.tcx) {
400-
resolution.shadowed_glob = Some(glob_binding);
400+
resolution.glob_binding = Some(glob_binding);
401401
}
402402
} else {
403-
resolution.shadowed_glob = Some(glob_binding);
403+
resolution.glob_binding = Some(glob_binding);
404404
}
405405
}
406406
(false, false) => {
407407
return Err(old_binding);
408408
}
409409
}
410410
} else {
411-
resolution.binding = Some(binding);
411+
resolution.non_glob_binding = Some(binding);
412412
}
413413

414414
Ok(())
@@ -620,15 +620,17 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
620620
}
621621
}
622622

623+
#[instrument(skip(self), level = "debug")]
623624
pub(crate) fn check_hidden_glob_reexports(
624625
&mut self,
625626
exported_ambiguities: FxHashSet<NameBinding<'ra>>,
626627
) {
627628
for module in self.arenas.local_modules().iter() {
628629
for (key, resolution) in self.resolutions(*module).borrow().iter() {
629630
let resolution = resolution.borrow();
631+
debug!(?resolution);
630632

631-
let Some(binding) = resolution.binding else { continue };
633+
let Some(binding) = resolution.late_binding() else { continue };
632634

633635
if let NameBindingKind::Import { import, .. } = binding.kind
634636
&& let Some((amb_binding, _)) = binding.ambiguity
@@ -648,7 +650,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
648650
);
649651
}
650652

651-
if let Some(glob_binding) = resolution.shadowed_glob {
653+
if let Some(glob_binding) = resolution.glob_binding {
652654
if binding.res() != Res::Err
653655
&& glob_binding.res() != Res::Err
654656
&& let NameBindingKind::Import { import: glob_import, .. } =
@@ -1179,7 +1181,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
11791181
return None;
11801182
} // Never suggest the same name
11811183
match *resolution.borrow() {
1182-
NameResolution { binding: Some(name_binding), .. } => {
1184+
NameResolution { non_glob_binding: Some(name_binding), .. } => {
11831185
match name_binding.kind {
11841186
NameBindingKind::Import { binding, .. } => {
11851187
match binding.kind {

compiler/rustc_resolve/src/late.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3437,7 +3437,8 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
34373437
};
34383438
ident.span.normalize_to_macros_2_0_and_adjust(module.expansion);
34393439
let key = BindingKey::new(ident, ns);
3440-
let mut binding = self.r.resolution(module, key).try_borrow().ok().and_then(|r| r.binding);
3440+
let mut binding =
3441+
self.r.resolution(module, key).try_borrow().ok().and_then(|r| r.late_binding());
34413442
debug!(?binding);
34423443
if binding.is_none() {
34433444
// We could not find the trait item in the correct namespace.
@@ -3448,7 +3449,8 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
34483449
_ => ns,
34493450
};
34503451
let key = BindingKey::new(ident, ns);
3451-
binding = self.r.resolution(module, key).try_borrow().ok().and_then(|r| r.binding);
3452+
binding =
3453+
self.r.resolution(module, key).try_borrow().ok().and_then(|r| r.late_binding());
34523454
debug!(?binding);
34533455
}
34543456

compiler/rustc_resolve/src/late/diagnostics.rs

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -880,8 +880,10 @@ impl<'ast, 'ra, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
880880
fn lookup_doc_alias_name(&mut self, path: &[Segment], ns: Namespace) -> Option<(DefId, Ident)> {
881881
let find_doc_alias_name = |r: &mut Resolver<'ra, '_>, m: Module<'ra>, item_name: Symbol| {
882882
for resolution in r.resolutions(m).borrow().values() {
883-
let Some(did) =
884-
resolution.borrow().binding.and_then(|binding| binding.res().opt_def_id())
883+
let Some(did) = resolution
884+
.borrow()
885+
.late_binding()
886+
.and_then(|binding| binding.res().opt_def_id())
885887
else {
886888
continue;
887889
};
@@ -1464,15 +1466,16 @@ impl<'ast, 'ra, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
14641466
self.resolve_path(mod_path, None, None)
14651467
{
14661468
let resolutions = self.r.resolutions(module).borrow();
1467-
let targets: Vec<_> =
1468-
resolutions
1469-
.iter()
1470-
.filter_map(|(key, resolution)| {
1471-
resolution.borrow().binding.map(|binding| binding.res()).and_then(
1472-
|res| if filter_fn(res) { Some((key, res)) } else { None },
1473-
)
1474-
})
1475-
.collect();
1469+
let targets: Vec<_> = resolutions
1470+
.iter()
1471+
.filter_map(|(key, resolution)| {
1472+
resolution
1473+
.borrow()
1474+
.late_binding()
1475+
.map(|binding| binding.res())
1476+
.and_then(|res| if filter_fn(res) { Some((key, res)) } else { None })
1477+
})
1478+
.collect();
14761479
if let [target] = targets.as_slice() {
14771480
return Some(TypoSuggestion::single_item_from_ident(target.0.ident, target.1));
14781481
}
@@ -2305,7 +2308,9 @@ impl<'ast, 'ra, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
23052308
let targets = resolutions
23062309
.borrow()
23072310
.iter()
2308-
.filter_map(|(key, res)| res.borrow().binding.map(|binding| (key, binding.res())))
2311+
.filter_map(|(key, res)| {
2312+
res.borrow().late_binding().map(|binding| (key, binding.res()))
2313+
})
23092314
.filter(|(_, res)| match (kind, res) {
23102315
(AssocItemKind::Const(..), Res::Def(DefKind::AssocConst, _)) => true,
23112316
(AssocItemKind::Fn(_), Res::Def(DefKind::AssocFn, _)) => true,

compiler/rustc_resolve/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -641,7 +641,8 @@ impl<'ra> Module<'ra> {
641641
F: FnMut(&mut R, Ident, Namespace, NameBinding<'ra>),
642642
{
643643
for (key, name_resolution) in resolver.as_mut().resolutions(self).borrow().iter() {
644-
if let Some(binding) = name_resolution.borrow().binding {
644+
let resolution = name_resolution.borrow();
645+
if let Some(binding) = resolution.non_glob_binding.or_else(|| resolution.glob_binding) {
645646
f(resolver, key.ident, key.ns, binding);
646647
}
647648
}

tests/ui/imports/issue-56125.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ mod m2 {
1515
mod m3 {
1616
mod empty {}
1717
use empty::issue_56125; //~ ERROR unresolved import `empty::issue_56125`
18-
use issue_56125::*; //~ ERROR `issue_56125` is ambiguous
18+
use issue_56125::*;
1919
}
2020

2121
fn main() {}

tests/ui/imports/issue-56125.stderr

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -54,24 +54,7 @@ LL | use issue_56125::non_last_segment::non_last_segment::*;
5454
= help: consider adding an explicit import of `issue_56125` to disambiguate
5555
= help: or use `self::issue_56125` to refer to this module unambiguously
5656

57-
error[E0659]: `issue_56125` is ambiguous
58-
--> $DIR/issue-56125.rs:18:9
59-
|
60-
LL | use issue_56125::*;
61-
| ^^^^^^^^^^^ ambiguous name
62-
|
63-
= note: ambiguous because of a conflict between a name from a glob import and an outer scope during import or macro resolution
64-
= note: `issue_56125` could refer to a crate passed with `--extern`
65-
= help: use `::issue_56125` to refer to this crate unambiguously
66-
note: `issue_56125` could also refer to the module imported here
67-
--> $DIR/issue-56125.rs:18:9
68-
|
69-
LL | use issue_56125::*;
70-
| ^^^^^^^^^^^^^^
71-
= help: consider adding an explicit import of `issue_56125` to disambiguate
72-
= help: or use `self::issue_56125` to refer to this module unambiguously
73-
74-
error: aborting due to 4 previous errors
57+
error: aborting due to 3 previous errors
7558

7659
Some errors have detailed explanations: E0432, E0659.
7760
For more information about an error, try `rustc --explain E0432`.

tests/ui/imports/shadow-glob-module-resolution-2.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,5 @@ use a::*;
1313
use e as b;
1414
//~^ ERROR: unresolved import `e`
1515
use b::c::D as e;
16-
//~^ ERROR: cannot determine resolution for the import
17-
//~| ERROR: cannot determine resolution for the import
1816

1917
fn main() { }

0 commit comments

Comments
 (0)