about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2024-12-05 21:47:06 +0000
committerEsteban Küber <esteban@kuber.com.ar>2024-12-10 18:18:03 +0000
commit27420c69d830d7a32544dd42f40c757d9cb4e095 (patch)
treee0e67f41564f455083209c0e2cbe430f3c17e768
parent69fb612608f6b3d7f21a4efae869e69ca949955f (diff)
downloadrust-27420c69d830d7a32544dd42f40c757d9cb4e095.tar.gz
rust-27420c69d830d7a32544dd42f40c757d9cb4e095.zip
Silence `use foo::Bar;` error if `Bar` isn't found in `foo` and `foo.rs` has parse errors
-rw-r--r--compiler/rustc_resolve/src/imports.rs7
-rw-r--r--tests/ui/resolve/parse-error-resolve.rs2
-rw-r--r--tests/ui/resolve/parse-error-resolve.stderr11
3 files changed, 9 insertions, 11 deletions
diff --git a/compiler/rustc_resolve/src/imports.rs b/compiler/rustc_resolve/src/imports.rs
index 5b8eefbb88d..2ed3f4d2c4f 100644
--- a/compiler/rustc_resolve/src/imports.rs
+++ b/compiler/rustc_resolve/src/imports.rs
@@ -670,9 +670,14 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
 
     fn throw_unresolved_import_error(
         &mut self,
-        errors: Vec<(Import<'_>, UnresolvedImportError)>,
+        mut errors: Vec<(Import<'_>, UnresolvedImportError)>,
         glob_error: bool,
     ) {
+        errors.retain(|(_import, err)| match err.module {
+            // Skip `use` errors for `use foo::Bar;` if `foo.rs` has unrecovered parse errors.
+            Some(def_id) if self.mods_with_parse_errors.contains(&def_id) => false,
+            _ => true,
+        });
         if errors.is_empty() {
             return;
         }
diff --git a/tests/ui/resolve/parse-error-resolve.rs b/tests/ui/resolve/parse-error-resolve.rs
index 9cb58f55128..1e0772648af 100644
--- a/tests/ui/resolve/parse-error-resolve.rs
+++ b/tests/ui/resolve/parse-error-resolve.rs
@@ -1,5 +1,5 @@
 mod parse_error;
-use parse_error::Canonical; //~ ERROR E0432
+use parse_error::Canonical; // ok, `parse_error.rs` had parse errors
 
 fn main() {
     let _ = "" + 1; //~ ERROR E0369
diff --git a/tests/ui/resolve/parse-error-resolve.stderr b/tests/ui/resolve/parse-error-resolve.stderr
index c05a9c6dafb..30475aa0ee6 100644
--- a/tests/ui/resolve/parse-error-resolve.stderr
+++ b/tests/ui/resolve/parse-error-resolve.stderr
@@ -9,12 +9,6 @@ help: you might have meant to end the type parameters here
 LL | impl<S: Into<std::borrow::Cow<'static, str>>> From<S> for Canonical {
    |                                             +
 
-error[E0432]: unresolved import `parse_error::Canonical`
-  --> $DIR/parse-error-resolve.rs:2:5
-   |
-LL | use parse_error::Canonical;
-   |     ^^^^^^^^^^^^^^^^^^^^^^ no `Canonical` in `parse_error`
-
 error[E0369]: cannot add `{integer}` to `&str`
   --> $DIR/parse-error-resolve.rs:5:16
    |
@@ -23,7 +17,6 @@ LL |     let _ = "" + 1;
    |             |
    |             &str
 
-error: aborting due to 3 previous errors
+error: aborting due to 2 previous errors
 
-Some errors have detailed explanations: E0369, E0432.
-For more information about an error, try `rustc --explain E0369`.
+For more information about this error, try `rustc --explain E0369`.