diff options
| author | León Orell Valerian Liehr <me@fmease.dev> | 2024-06-08 04:25:45 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-06-08 04:25:45 +0200 |
| commit | 4bca296f739682eb60b80a3bd81e6d967dd2bd98 (patch) | |
| tree | 156843d4af4aec4a166684309d7d944e81ac10ea | |
| parent | 1f715eb64199de10e62dce3dd2e18e054b924763 (diff) | |
| parent | 93feaa668511cfd03a645217a2287699694002cf (diff) | |
| download | rust-4bca296f739682eb60b80a3bd81e6d967dd2bd98.tar.gz rust-4bca296f739682eb60b80a3bd81e6d967dd2bd98.zip | |
Rollup merge of #126065 - bvanjoi:fix-124490, r=petrochenkov
mark binding undetermined if target name exist and not obtained - Fixes #124490 - Fixes #125013 Following up on #124840, I think handling only `target_bindings` is sufficient. r? `@petrochenkov`
| -rw-r--r-- | compiler/rustc_resolve/src/ident.rs | 10 | ||||
| -rw-r--r-- | tests/ui/imports/cycle-import-in-std-1.rs | 9 | ||||
| -rw-r--r-- | tests/ui/imports/cycle-import-in-std-1.stderr | 13 | ||||
| -rw-r--r-- | tests/ui/imports/cycle-import-in-std-2.rs | 9 | ||||
| -rw-r--r-- | tests/ui/imports/cycle-import-in-std-2.stderr | 13 |
5 files changed, 49 insertions, 5 deletions
diff --git a/compiler/rustc_resolve/src/ident.rs b/compiler/rustc_resolve/src/ident.rs index 78bd3c4e49f..b6a23317dc9 100644 --- a/compiler/rustc_resolve/src/ident.rs +++ b/compiler/rustc_resolve/src/ident.rs @@ -998,14 +998,14 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { let Some(module) = single_import.imported_module.get() else { return Err((Undetermined, Weak::No)); }; - let ImportKind::Single { source: ident, source_bindings, .. } = &single_import.kind + let ImportKind::Single { source: ident, target, target_bindings, .. } = + &single_import.kind else { unreachable!(); }; - if binding.map_or(false, |binding| binding.module().is_some()) - && source_bindings.iter().all(|binding| matches!(binding.get(), Err(Undetermined))) - { - // This branch allows the binding to be defined or updated later, + if (ident != target) && target_bindings.iter().all(|binding| binding.get().is_none()) { + // This branch allows the binding to be defined or updated later if the target name + // can hide the source but these bindings are not obtained. // avoiding module inconsistency between the resolve process and the finalize process. // See more details in #124840 return Err((Undetermined, Weak::No)); diff --git a/tests/ui/imports/cycle-import-in-std-1.rs b/tests/ui/imports/cycle-import-in-std-1.rs new file mode 100644 index 00000000000..2fa492c155d --- /dev/null +++ b/tests/ui/imports/cycle-import-in-std-1.rs @@ -0,0 +1,9 @@ +//@ edition: 2018 + +// https://github.com/rust-lang/rust/issues/124490 + +use ops::{self as std}; +//~^ ERROR: unresolved import `ops` +use std::collections::{self as ops}; + +fn main() {} diff --git a/tests/ui/imports/cycle-import-in-std-1.stderr b/tests/ui/imports/cycle-import-in-std-1.stderr new file mode 100644 index 00000000000..d4e6f32cc10 --- /dev/null +++ b/tests/ui/imports/cycle-import-in-std-1.stderr @@ -0,0 +1,13 @@ +error[E0432]: unresolved import `ops` + --> $DIR/cycle-import-in-std-1.rs:5:11 + | +LL | use ops::{self as std}; + | ^^^^^^^^^^^ no external crate `ops` + | + = help: consider importing one of these items instead: + core::ops + std::ops + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0432`. diff --git a/tests/ui/imports/cycle-import-in-std-2.rs b/tests/ui/imports/cycle-import-in-std-2.rs new file mode 100644 index 00000000000..d73c57944bc --- /dev/null +++ b/tests/ui/imports/cycle-import-in-std-2.rs @@ -0,0 +1,9 @@ +//@ edition: 2018 + +// https://github.com/rust-lang/rust/issues/125013 + +use ops::{self as std}; +//~^ ERROR: unresolved import `ops` +use std::ops::Deref::{self as ops}; + +fn main() {} diff --git a/tests/ui/imports/cycle-import-in-std-2.stderr b/tests/ui/imports/cycle-import-in-std-2.stderr new file mode 100644 index 00000000000..dc0270dffe4 --- /dev/null +++ b/tests/ui/imports/cycle-import-in-std-2.stderr @@ -0,0 +1,13 @@ +error[E0432]: unresolved import `ops` + --> $DIR/cycle-import-in-std-2.rs:5:11 + | +LL | use ops::{self as std}; + | ^^^^^^^^^^^ no external crate `ops` + | + = help: consider importing one of these items instead: + core::ops + std::ops + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0432`. |
