Skip to content

Commit

Permalink
Auto merge of #57160 - petrochenkov:impice2, r=estebank
Browse files Browse the repository at this point in the history
resolve: Fix an ICE in import validation

Fixes ICE reported in the comment #56596 (comment)
  • Loading branch information
bors committed Dec 29, 2018
2 parents 35a64f8 + ce73bc7 commit d5175f4
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 6 deletions.
18 changes: 12 additions & 6 deletions src/librustc_resolve/resolve_imports.rs
Original file line number Diff line number Diff line change
Expand Up @@ -223,19 +223,25 @@ impl<'a> Resolver<'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,
// remove this together with `PUB_USE_OF_PRIVATE_EXTERN_CRATE`.
let usable = this.is_accessible(binding.vis) || binding.is_extern_crate();
if usable { Ok(binding) } else { Err((Determined, Weak::No)) }
};

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 {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
// Nothing here
14 changes: 14 additions & 0 deletions src/test/ui/rust-2018/uniform-paths/issue-56596.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 18 additions & 0 deletions src/test/ui/rust-2018/uniform-paths/issue-56596.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit d5175f4

Please sign in to comment.