mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-14 02:49:40 +00:00
Rollup merge of #121846 - bvanjoi:fix-121760, r=petrochenkov
only compare ambiguity item that have hard error Fixes #121760 An easy fix, r? ``@petrochenkov``
This commit is contained in:
commit
152b69054c
@ -8,8 +8,8 @@ use crate::errors::{
|
|||||||
ItemsInTraitsAreNotImportable,
|
ItemsInTraitsAreNotImportable,
|
||||||
};
|
};
|
||||||
use crate::Determinacy::{self, *};
|
use crate::Determinacy::{self, *};
|
||||||
use crate::Namespace::*;
|
|
||||||
use crate::{module_to_string, names_to_string, ImportSuggestion};
|
use crate::{module_to_string, names_to_string, ImportSuggestion};
|
||||||
|
use crate::{AmbiguityError, Namespace::*};
|
||||||
use crate::{AmbiguityKind, BindingKey, ResolutionError, Resolver, Segment};
|
use crate::{AmbiguityKind, BindingKey, ResolutionError, Resolver, Segment};
|
||||||
use crate::{Finalize, Module, ModuleOrUniformRoot, ParentScope, PerNS, ScopeSet};
|
use crate::{Finalize, Module, ModuleOrUniformRoot, ParentScope, PerNS, ScopeSet};
|
||||||
use crate::{NameBinding, NameBindingData, NameBindingKind, PathResult, Used};
|
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)))
|
.chain(indeterminate_imports.iter().map(|i| (true, i)))
|
||||||
{
|
{
|
||||||
let unresolved_import_error = self.finalize_import(*import);
|
let unresolved_import_error = self.finalize_import(*import);
|
||||||
|
|
||||||
// If this import is unresolved then create a dummy import
|
// If this import is unresolved then create a dummy import
|
||||||
// resolution for it so that later resolve stages won't complain.
|
// resolution for it so that later resolve stages won't complain.
|
||||||
self.import_dummy_binding(*import, is_indeterminate);
|
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(),
|
ImportKind::Single { target_bindings, .. } => target_bindings[TypeNS].get(),
|
||||||
_ => None,
|
_ => None,
|
||||||
};
|
};
|
||||||
let prev_ambiguity_errors_len = self.ambiguity_errors.len();
|
let ambiguity_errors_len =
|
||||||
|
|errors: &Vec<AmbiguityError<'_>>| 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);
|
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`.
|
// 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,
|
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);
|
import.vis.set(orig_vis);
|
||||||
let module = match path_res {
|
let module = match path_res {
|
||||||
PathResult::Module(module) => {
|
PathResult::Module(module) => {
|
||||||
|
24
tests/ui/imports/unresolved-seg-after-ambiguous.rs
Normal file
24
tests/ui/imports/unresolved-seg-after-ambiguous.rs
Normal file
@ -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() {}
|
32
tests/ui/imports/unresolved-seg-after-ambiguous.stderr
Normal file
32
tests/ui/imports/unresolved-seg-after-ambiguous.stderr
Normal file
@ -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 <https://github.com/rust-lang/rust/issues/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`.
|
Loading…
Reference in New Issue
Block a user