Skip to content

Commit

Permalink
Auto merge of #57185 - petrochenkov:impice4, r=estebank
Browse files Browse the repository at this point in the history
resolve: Fix one more ICE in import validation

So if you have an unresolved import
```rust
mod m {
    use foo::bar;
}
```
error recovery will insert a special item with `Def::Err` definition into module `m`, so other things depending on `bar` won't produce extra errors.

The issue was that erroneous `bar` was overwriting legitimate `bar`s coming from globs, e.g.
```rust
mod m {
    use baz::*; // imports real existing `bar`
    use foo::bar;
}
```
causing some unwanted diagnostics talking about "unresolved items", and producing inconsistent resolutions like #57015.
This PR stops overwriting real successful resolutions with `Def::Err`s.

Fixes #57015
  • Loading branch information
bors committed Dec 30, 2018
2 parents a35cf79 + ddb550a commit 171c1fc
Show file tree
Hide file tree
Showing 6 changed files with 33 additions and 26 deletions.
4 changes: 4 additions & 0 deletions src/librustc_resolve/resolve_imports.rs
Original file line number Diff line number Diff line change
Expand Up @@ -472,6 +472,10 @@ impl<'a> Resolver<'a> {
self.set_binding_parent_module(binding, module);
self.update_resolution(module, ident, ns, |this, resolution| {
if let Some(old_binding) = resolution.binding {
if binding.def() == Def::Err {
// Do not override real bindings with `Def::Err`s from error recovery.
return Ok(());
}
match (old_binding.is_glob_import(), binding.is_glob_import()) {
(true, true) => {
if binding.def() != old_binding.def() {
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/imports/duplicate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ mod g {
fn main() {
e::foo();
f::foo(); //~ ERROR `foo` is ambiguous
g::foo(); //~ ERROR `foo` is ambiguous
g::foo();
}

mod ambiguous_module_errors {
Expand Down
21 changes: 1 addition & 20 deletions src/test/ui/imports/duplicate.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -50,25 +50,6 @@ LL | pub use b::*;
| ^^^^
= help: consider adding an explicit import of `foo` to disambiguate

error[E0659]: `foo` is ambiguous (glob import vs glob import in the same module)
--> $DIR/duplicate.rs:36:8
|
LL | g::foo(); //~ ERROR `foo` is ambiguous
| ^^^ ambiguous name
|
note: `foo` could refer to the function imported here
--> $DIR/duplicate.rs:29:13
|
LL | pub use a::*;
| ^^^^
= help: consider adding an explicit import of `foo` to disambiguate
note: `foo` could also refer to the unresolved item imported here
--> $DIR/duplicate.rs:30:13
|
LL | pub use f::*;
| ^^^^
= help: consider adding an explicit import of `foo` to disambiguate

error[E0659]: `foo` is ambiguous (glob import vs glob import in the same module)
--> $DIR/duplicate.rs:49:9
|
Expand All @@ -88,7 +69,7 @@ LL | use self::m2::*;
| ^^^^^^^^^^^
= help: consider adding an explicit import of `foo` to disambiguate

error: aborting due to 5 previous errors
error: aborting due to 4 previous errors

Some errors occurred: E0252, E0659.
For more information about an error, try `rustc --explain E0252`.
10 changes: 5 additions & 5 deletions src/test/ui/imports/issue-56125.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,12 @@ LL | use issue_56125::*; //~ ERROR `issue_56125` is ambiguous
|
= note: `issue_56125` could refer to an extern crate passed with `--extern`
= help: use `::issue_56125` to refer to this extern crate unambiguously
note: `issue_56125` could also refer to the unresolved item imported here
--> $DIR/issue-56125.rs:19:9
note: `issue_56125` could also refer to the module imported here
--> $DIR/issue-56125.rs:20:9
|
LL | use empty::issue_56125; //~ ERROR unresolved import `empty::issue_56125`
| ^^^^^^^^^^^^^^^^^^
= help: use `self::issue_56125` to refer to this unresolved item unambiguously
LL | use issue_56125::*; //~ ERROR `issue_56125` is ambiguous
| ^^^^^^^^^^^^^^
= help: use `self::issue_56125` to refer to this module unambiguously

error: aborting due to 4 previous errors

Expand Down
13 changes: 13 additions & 0 deletions src/test/ui/imports/issue-57015.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
mod glob_ok {
pub mod something {
pub mod something_else {}
}
}

mod single_err {}

use glob_ok::*; // glob_ok::something
use single_err::something; //~ ERROR unresolved import `single_err::something`
use something::something_else;

fn main() {}
9 changes: 9 additions & 0 deletions src/test/ui/imports/issue-57015.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
error[E0432]: unresolved import `single_err::something`
--> $DIR/issue-57015.rs:10:5
|
LL | use single_err::something; //~ ERROR unresolved import `single_err::something`
| ^^^^^^^^^^^^^^^^^^^^^ no `something` in `single_err`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0432`.

0 comments on commit 171c1fc

Please sign in to comment.