diff options
| author | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2018-12-28 05:20:11 +0300 |
|---|---|---|
| committer | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2018-12-28 05:43:31 +0300 |
| commit | ce73bc7d47fc58d5e1436df10b2a2ceaddf511bd (patch) | |
| tree | a63558e02cbc17b4616fdc76120aeea92b38cc84 /src/librustc_resolve | |
| parent | f8caa321c7c7214a6c5415e4b3694e65b4ff73a7 (diff) | |
resolve: Fix an ICE in import validation
Diffstat (limited to 'src/librustc_resolve')
| -rw-r--r-- | src/librustc_resolve/resolve_imports.rs | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/librustc_resolve/resolve_imports.rs b/src/librustc_resolve/resolve_imports.rs index 9a7b8c24993..5830aa3713d 100644 --- a/src/librustc_resolve/resolve_imports.rs +++ b/src/librustc_resolve/resolve_imports.rs @@ -223,11 +223,6 @@ 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(); @@ -235,7 +230,18 @@ impl<'a> Resolver<'a> { }; 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 { |
