Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

An import that should be resolvable is left unresolved. #31404

Closed
jseyfried opened this issue Feb 4, 2016 · 3 comments · Fixed by #31461
Closed

An import that should be resolvable is left unresolved. #31404

jseyfried opened this issue Feb 4, 2016 · 3 comments · Fixed by #31461

Comments

@jseyfried
Copy link
Contributor

Example:

pub mod foo {
    pub mod bar {
        pub fn f() {}
    }
}

mod baz {
    pub use foo;
    pub use self::foo::bar; // This import is unresolved, but it should resolve to ::foo::bar

    pub use self::bar::f as foo;
}

This compiles if foo is copied into baz instead of being imported with pub use foo;.

@KalitaAlexey
Copy link
Contributor

Shouldn't you need write pub use super::foo?

@jseyfried
Copy link
Contributor Author

That would work too. Paths in use declarations are crate-relative unless they start with self or super.

@KalitaAlexey
Copy link
Contributor

Yeah. You are right. I didn't know that.

bors added a commit that referenced this issue Feb 11, 2016
This PR adds to `NameBinding` so it can more fully represent bindings from imports as well from items, refactors away `Target`, generalizes `ImportResolution` to a simpler type `NameResolution`, and uses a single `NameResolution`-valued map in place the existing maps `children` and `import_resolutions` (of `NameBinding`s and `ImportResolution`s, respectively), simplifying duplicate checking and name resolution.

It also unifies the `resolve_name_in_module` in `lib.rs` with its namesake in `resolve_imports.rs`, clarifying and improving the core logic (fixes #31403 and fixes #31404) while maintaining clear future-comparability with shadowable globs (i.e., never reporting that a resolution is a `Success` or is `Failing` unless this would also be knowable with shadowable globs).

Since it fixes #31403, this is technically a [breaking-change], but it is exceedingly unlikely to cause breakage in practice. The following is an example of code that would break:
```rust
mod foo {
    pub mod bar {} // This defines bar in the type namespace
    pub use alpha::bar; // This defines bar in the value namespace

    // This should define baz in both namespaces, but it only defines baz in the type namespace.
    pub use self::bar as baz;
    pub fn baz() {} // This should collide with baz, but now it does not.
}

pub fn f() {}
mod alpha {
    pub use self::f as bar; // Changing this to `pub fn bar() {}` causes the collision right now.
    pub use super::*;
}
```

r? @nrc
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants