mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 16:54:01 +00:00
Rollup merge of #70236 - petrochenkov:globimpice, r=ecstatic-morse
resolve: Avoid "self-confirming" import resolutions in one more case So the idea behind "blacklisted bindings" is that we must ignore some name definitions during resolution because otherwise they cause infinite cycles. E.g. import ```rust use my_crate; ``` would refer to itself (on 2018 edition) without this blacklisting, because `use my_crate;` is the first name in scope when we are resolving `my_crate` here. In this PR we are doing this blacklisting for the case ```rust use same::same; ``` , namely blacklisting the second `same` when resolving the first `same`. This was previously forgotten. Fixes https://github.com/rust-lang/rust/issues/62767
This commit is contained in:
commit
08dfd1344c
@ -874,6 +874,12 @@ impl<'a, 'b> ImportResolver<'a, 'b> {
|
||||
/// consolidate multiple unresolved import errors into a single diagnostic.
|
||||
fn finalize_import(&mut self, import: &'b Import<'b>) -> Option<UnresolvedImportError> {
|
||||
let orig_vis = import.vis.replace(ty::Visibility::Invisible);
|
||||
let orig_blacklisted_binding = match &import.kind {
|
||||
ImportKind::Single { target_bindings, .. } => {
|
||||
Some(mem::replace(&mut self.r.blacklisted_binding, target_bindings[TypeNS].get()))
|
||||
}
|
||||
_ => None,
|
||||
};
|
||||
let prev_ambiguity_errors_len = self.r.ambiguity_errors.len();
|
||||
let path_res = self.r.resolve_path(
|
||||
&import.module_path,
|
||||
@ -884,6 +890,9 @@ impl<'a, 'b> ImportResolver<'a, 'b> {
|
||||
import.crate_lint(),
|
||||
);
|
||||
let no_ambiguity = self.r.ambiguity_errors.len() == prev_ambiguity_errors_len;
|
||||
if let Some(orig_blacklisted_binding) = orig_blacklisted_binding {
|
||||
self.r.blacklisted_binding = orig_blacklisted_binding;
|
||||
}
|
||||
import.vis.set(orig_vis);
|
||||
if let PathResult::Failed { .. } | PathResult::NonModule(..) = path_res {
|
||||
// Consider erroneous imports used to avoid duplicate diagnostics.
|
||||
|
15
src/test/ui/imports/issue-62767.rs
Normal file
15
src/test/ui/imports/issue-62767.rs
Normal file
@ -0,0 +1,15 @@
|
||||
// check-pass
|
||||
|
||||
mod m {
|
||||
pub enum Same {
|
||||
Same,
|
||||
}
|
||||
}
|
||||
|
||||
use m::*;
|
||||
|
||||
// The variant `Same` introduced by this import is not considered when resolving the prefix
|
||||
// `Same::` during import validation (issue #62767).
|
||||
use Same::Same;
|
||||
|
||||
fn main() {}
|
Loading…
Reference in New Issue
Block a user