mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
Auto merge of #57160 - petrochenkov:impice2, r=estebank
resolve: Fix an ICE in import validation Fixes ICE reported in the comment https://github.com/rust-lang/rust/issues/56596#issuecomment-449866807
This commit is contained in:
commit
d5175f4405
@ -223,11 +223,6 @@ impl<'a> Resolver<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let check_usable = |this: &mut Self, binding: &'a NameBinding<'a>| {
|
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,
|
// `extern crate` are always usable for backwards compatibility, see issue #37020,
|
||||||
// remove this together with `PUB_USE_OF_PRIVATE_EXTERN_CRATE`.
|
// remove this together with `PUB_USE_OF_PRIVATE_EXTERN_CRATE`.
|
||||||
let usable = this.is_accessible(binding.vis) || binding.is_extern_crate();
|
let usable = this.is_accessible(binding.vis) || binding.is_extern_crate();
|
||||||
@ -235,7 +230,18 @@ impl<'a> Resolver<'a> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if record_used {
|
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() {
|
if self.last_import_segment && check_usable(self, binding).is_err() {
|
||||||
Err((Determined, Weak::No))
|
Err((Determined, Weak::No))
|
||||||
} else {
|
} else {
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
// Nothing here
|
14
src/test/ui/rust-2018/uniform-paths/issue-56596.rs
Normal file
14
src/test/ui/rust-2018/uniform-paths/issue-56596.rs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
// edition:2018
|
||||||
|
// compile-flags: --extern issue_56596
|
||||||
|
// aux-build:issue-56596.rs
|
||||||
|
|
||||||
|
#![feature(uniform_paths)]
|
||||||
|
|
||||||
|
mod m {
|
||||||
|
pub mod issue_56596 {}
|
||||||
|
}
|
||||||
|
|
||||||
|
use m::*;
|
||||||
|
use issue_56596; //~ ERROR `issue_56596` is ambiguous
|
||||||
|
|
||||||
|
fn main() {}
|
18
src/test/ui/rust-2018/uniform-paths/issue-56596.stderr
Normal file
18
src/test/ui/rust-2018/uniform-paths/issue-56596.stderr
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
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`.
|
Loading…
Reference in New Issue
Block a user