Skip to content

Commit

Permalink
Rollup merge of rust-lang#113920 - bvanjoi:fix-81413, r=petrochenkov
Browse files Browse the repository at this point in the history
fix(resolve): report unresolved imports firstly

Fixes rust-lang#81413

An easy fix, r? ``@petrochenkov``
  • Loading branch information
matthiaskrgr authored Jul 31, 2023
2 parents e22c9cd + 1b18e2a commit 647a1eb
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 23 deletions.
53 changes: 30 additions & 23 deletions compiler/rustc_resolve/src/imports.rs
Original file line number Diff line number Diff line change
Expand Up @@ -533,15 +533,15 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
let indeterminate_imports = mem::take(&mut self.indeterminate_imports);

for (is_indeterminate, import) in determined_imports
.into_iter()
.iter()
.map(|i| (false, i))
.chain(indeterminate_imports.into_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
// 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);

if let Some(err) = unresolved_import_error {
if let ImportKind::Single { source, ref source_bindings, .. } = import.kind {
Expand All @@ -563,27 +563,34 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
errors = vec![];
}
if seen_spans.insert(err.span) {
errors.push((import, err));
errors.push((*import, err));
prev_root_id = import.root_id;
}
} else if is_indeterminate {
let path = import_path_to_string(
&import.module_path.iter().map(|seg| seg.ident).collect::<Vec<_>>(),
&import.kind,
import.span,
);
let err = UnresolvedImportError {
span: import.span,
label: None,
note: None,
suggestion: None,
candidates: None,
};
// FIXME: there should be a better way of doing this than
// formatting this as a string then checking for `::`
if path.contains("::") {
errors.push((import, err))
}
}
}

if !errors.is_empty() {
self.throw_unresolved_import_error(errors);
return;
}

for import in &indeterminate_imports {
let path = import_path_to_string(
&import.module_path.iter().map(|seg| seg.ident).collect::<Vec<_>>(),
&import.kind,
import.span,
);
let err = UnresolvedImportError {
span: import.span,
label: None,
note: None,
suggestion: None,
candidates: None,
};
// FIXME: there should be a better way of doing this than
// formatting this as a string then checking for `::`
if path.contains("::") {
errors.push((*import, err))
}
}

Expand Down
23 changes: 23 additions & 0 deletions tests/ui/imports/issue-81413.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
pub const ITEM: Item = Item;

pub struct Item;

pub fn item() {}

pub use doesnt_exist::*;
//~^ ERROR unresolved import `doesnt_exist`
mod a {
use crate::{item, Item, ITEM};
}

mod b {
use crate::item;
use crate::Item;
use crate::ITEM;
}

mod c {
use crate::item;
}

fn main() {}
11 changes: 11 additions & 0 deletions tests/ui/imports/issue-81413.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
error[E0432]: unresolved import `doesnt_exist`
--> $DIR/issue-81413.rs:7:9
|
LL | pub use doesnt_exist::*;
| ^^^^^^^^^^^^ maybe a missing crate `doesnt_exist`?
|
= help: consider adding `extern crate doesnt_exist` to use the `doesnt_exist` crate

error: aborting due to previous error

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

0 comments on commit 647a1eb

Please sign in to comment.