Skip to content

Commit

Permalink
Auto merge of #109602 - bvanjoi:fix-issue-109343, r=petrochenkov
Browse files Browse the repository at this point in the history
fix(resolve): replace bindings to dummy for unresolved imports

close #109343

In #109343, `f` in `pub use f as g` points to:

|namespace| binding|
|-|-|
|type| `external crate f`|
|value| `None` |
|macro| `None` |

When resolve `value_ns` during `resolve_doc_links`, the value of the binding of single_import `pub use f as g` goes to `pub use inner::f`, and since it does not satisfy [!self.is_accessible_from(binding.vis, single_import.parent_scope.module)](https://github.com/rust-lang/rust/blob/master/compiler/rustc_resolve/src/ident.rs#L971) and returns `Err(Undetermined)`, which eventually goes to `PathResult::Indeterminate => unreachable!`.

This PR replace all namespace binding to `dummy_binding` for indeterminate import, so, the bindings of `pub use f as g` had been changed to followings after finalize:

|namespace| binding|
|-|-|
|type| `dummy`|
|value| `dummy` |
|macro| `dummy` |

r?`@petrochenkov`
  • Loading branch information
bors committed May 19, 2023
2 parents c9dc55d + f34678c commit 92f5dea
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 6 deletions.
11 changes: 6 additions & 5 deletions compiler/rustc_resolve/src/imports.rs
Original file line number Diff line number Diff line change
Expand Up @@ -405,11 +405,12 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
t
}

// Define a dummy resolution containing a `Res::Err` as a placeholder for a failed resolution,
// also mark such failed imports as used to avoid duplicate diagnostics.
fn import_dummy_binding(&mut self, import: &'a Import<'a>) {
// Define a dummy resolution containing a `Res::Err` as a placeholder for a failed
// or indeterminate resolution, also mark such failed imports as used to avoid duplicate diagnostics.
fn import_dummy_binding(&mut self, import: &'a Import<'a>, is_indeterminate: bool) {
if let ImportKind::Single { target, ref target_bindings, .. } = import.kind {
if target_bindings.iter().any(|binding| binding.get().is_some()) {
if !(is_indeterminate || target_bindings.iter().all(|binding| binding.get().is_none()))
{
return; // Has resolution, do not create the dummy binding
}
let dummy_binding = self.dummy_binding;
Expand Down Expand Up @@ -474,7 +475,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {

// 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);
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 Down
1 change: 1 addition & 0 deletions compiler/rustc_resolve/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ pub mod rustdoc;

fluent_messages! { "../messages.ftl" }

#[derive(Debug)]
enum Weak {
Yes,
No,
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_session/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -421,7 +421,7 @@ pub enum TrimmedDefPaths {
GoodPath,
}

#[derive(Clone, Hash)]
#[derive(Clone, Hash, Debug)]
pub enum ResolveDocLinks {
/// Do not resolve doc links.
None,
Expand Down
10 changes: 10 additions & 0 deletions tests/ui/imports/issue-109343.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#![crate_type = "lib"]

pub mod f {}
pub use unresolved::f;
//~^ ERROR unresolved import `unresolved`

/// [g]
pub use f as g;

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

error: aborting due to previous error

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

0 comments on commit 92f5dea

Please sign in to comment.