diff --git a/compiler/rustc_resolve/src/imports.rs b/compiler/rustc_resolve/src/imports.rs index 0cd925c5ba6ae..6647a9a279285 100644 --- a/compiler/rustc_resolve/src/imports.rs +++ b/compiler/rustc_resolve/src/imports.rs @@ -8,8 +8,8 @@ use crate::errors::{ ItemsInTraitsAreNotImportable, }; use crate::Determinacy::{self, *}; -use crate::Namespace::*; use crate::{module_to_string, names_to_string, ImportSuggestion}; +use crate::{AmbiguityError, Namespace::*}; use crate::{AmbiguityKind, BindingKey, ResolutionError, Resolver, Segment}; use crate::{Finalize, Module, ModuleOrUniformRoot, ParentScope, PerNS, ScopeSet}; use crate::{NameBinding, NameBindingData, NameBindingKind, PathResult, Used}; @@ -538,7 +538,6 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { .chain(indeterminate_imports.iter().map(|i| (true, i))) { let unresolved_import_error = self.finalize_import(*import); - // If this import is unresolved then create a dummy import // resolution for it so that later resolve stages won't complain. self.import_dummy_binding(*import, is_indeterminate); @@ -856,7 +855,9 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { ImportKind::Single { target_bindings, .. } => target_bindings[TypeNS].get(), _ => None, }; - let prev_ambiguity_errors_len = self.ambiguity_errors.len(); + let ambiguity_errors_len = + |errors: &Vec>| errors.iter().filter(|error| !error.warning).count(); + let prev_ambiguity_errors_len = ambiguity_errors_len(&self.ambiguity_errors); let finalize = Finalize::with_root_span(import.root_id, import.span, import.root_span); // We'll provide more context to the privacy errors later, up to `len`. @@ -870,7 +871,8 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { ignore_binding, ); - let no_ambiguity = self.ambiguity_errors.len() == prev_ambiguity_errors_len; + let no_ambiguity = + ambiguity_errors_len(&self.ambiguity_errors) == prev_ambiguity_errors_len; import.vis.set(orig_vis); let module = match path_res { PathResult::Module(module) => { diff --git a/tests/ui/imports/unresolved-seg-after-ambiguous.rs b/tests/ui/imports/unresolved-seg-after-ambiguous.rs new file mode 100644 index 0000000000000..dcabc528a85ed --- /dev/null +++ b/tests/ui/imports/unresolved-seg-after-ambiguous.rs @@ -0,0 +1,24 @@ +mod a { + mod b { + mod c { + pub struct E; + } + + mod d { + #[derive(Debug)] + pub struct E; + } + + pub use self::d::*; + pub use self::c::*; + } + + pub use self::b::*; +} + +use self::a::E::in_exist; +//~^ ERROR: unresolved import `self::a::E` +//~| WARNING: `E` is ambiguous +//~| WARNING: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + +fn main() {} diff --git a/tests/ui/imports/unresolved-seg-after-ambiguous.stderr b/tests/ui/imports/unresolved-seg-after-ambiguous.stderr new file mode 100644 index 0000000000000..9e0efd4a75f84 --- /dev/null +++ b/tests/ui/imports/unresolved-seg-after-ambiguous.stderr @@ -0,0 +1,32 @@ +error[E0432]: unresolved import `self::a::E` + --> $DIR/unresolved-seg-after-ambiguous.rs:19:14 + | +LL | use self::a::E::in_exist; + | ^ `E` is a struct, not a module + +warning: `E` is ambiguous + --> $DIR/unresolved-seg-after-ambiguous.rs:19:14 + | +LL | use self::a::E::in_exist; + | ^ ambiguous name + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #114095 + = note: ambiguous because of multiple glob imports of a name in the same module +note: `E` could refer to the struct imported here + --> $DIR/unresolved-seg-after-ambiguous.rs:13:17 + | +LL | pub use self::c::*; + | ^^^^^^^^^^ + = help: consider adding an explicit import of `E` to disambiguate +note: `E` could also refer to the struct imported here + --> $DIR/unresolved-seg-after-ambiguous.rs:12:17 + | +LL | pub use self::d::*; + | ^^^^^^^^^^ + = help: consider adding an explicit import of `E` to disambiguate + = note: `#[warn(ambiguous_glob_imports)]` on by default + +error: aborting due to 1 previous error; 1 warning emitted + +For more information about this error, try `rustc --explain E0432`.