Skip to content

Commit

Permalink
only compare ambiguity item that have hard error
Browse files Browse the repository at this point in the history
  • Loading branch information
bvanjoi committed Mar 1, 2024
1 parent 6cbf092 commit 89954e5
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 4 deletions.
10 changes: 6 additions & 4 deletions compiler/rustc_resolve/src/imports.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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<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);

// We'll provide more context to the privacy errors later, up to `len`.
Expand All @@ -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) => {
Expand Down
24 changes: 24 additions & 0 deletions tests/ui/imports/unresolved-seg-after-ambiguous.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 32 additions & 0 deletions tests/ui/imports/unresolved-seg-after-ambiguous.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit 89954e5

Please sign in to comment.