}
let check_usable = |this: &mut Self, binding: &'a NameBinding<'a>| {
- if let Some(blacklisted_binding) = this.blacklisted_binding {
- if ptr::eq(binding, blacklisted_binding) {
- return Err((Determined, Weak::No));
- }
- }
// `extern crate` are always usable for backwards compatibility, see issue #37020,
// remove this together with `PUB_USE_OF_PRIVATE_EXTERN_CRATE`.
let usable = this.is_accessible(binding.vis) || binding.is_extern_crate();
};
if record_used {
- return resolution.binding.ok_or((Determined, Weak::No)).and_then(|binding| {
+ return resolution.binding.and_then(|binding| {
+ // If the primary binding is blacklisted, search further and return the shadowed
+ // glob binding if it exists. What we really want here is having two separate
+ // scopes in a module - one for non-globs and one for globs, but until that's done
+ // use this hack to avoid inconsistent resolution ICEs during import validation.
+ if let Some(blacklisted_binding) = self.blacklisted_binding {
+ if ptr::eq(binding, blacklisted_binding) {
+ return resolution.shadowed_glob;
+ }
+ }
+ Some(binding)
+ }).ok_or((Determined, Weak::No)).and_then(|binding| {
if self.last_import_segment && check_usable(self, binding).is_err() {
Err((Determined, Weak::No))
} else {
--- /dev/null
+error[E0659]: `issue_56596` is ambiguous (name vs any other name during import resolution)
+ --> $DIR/issue-56596.rs:12:5
+ |
+LL | use issue_56596; //~ ERROR `issue_56596` is ambiguous
+ | ^^^^^^^^^^^ ambiguous name
+ |
+ = note: `issue_56596` could refer to an extern crate passed with `--extern`
+ = help: use `::issue_56596` to refer to this extern crate unambiguously
+note: `issue_56596` could also refer to the module imported here
+ --> $DIR/issue-56596.rs:11:5
+ |
+LL | use m::*;
+ | ^^^^
+ = help: use `crate::issue_56596` to refer to this module unambiguously
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0659`.