Skip to content

Wildcard imports do not seem to propagate as expected for tuple-like struct types having at least one non-pub field #53140

New issue

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

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

Already on GitHub? # to your account

Closed
yvt opened this issue Aug 7, 2018 · 6 comments
Assignees
Labels
A-resolve Area: Name/path resolution done by `rustc_resolve` specifically E-help-wanted Call for participation: Help is requested to fix this issue. P-high High priority regression-from-stable-to-beta Performance or correctness regression from stable to beta. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Milestone

Comments

@yvt
Copy link
Contributor

yvt commented Aug 7, 2018

In the following code, ::mod1::Item is expected to be imported as ::mod1::mod2::Item via the following route:

  1. ::mod1::Item (the original definition)
  2. ::Item (by use self::mod1::* in the crate root)
  3. ::mod1::mod2::Item (by use Item in ::mod1::mod2)

However, an “unresolved import” error is reported for the last use as shown below:

#![allow(unused_imports)]

mod mod1 {
    mod mod2 {
        use Item;            // <--- Causes an "unresolved import" error
        // use ::Item;       // <--- So does this too
        // use super::super::Item;  // <--- This, three
        
        // use super::Item;  // <--- But not this one
    }
    
    pub struct Item(usize);
    
    // The "unresolved import" error no longer occurs if the above definition
    // was replaced with any one of the following:
    
    // pub struct Item(pub usize);
    // pub struct Item();
    // pub struct Item { x: usize }
}

use self::mod1::*; // `Item` is supposed to re-exported here

// Replacing the above `use` with the following one makes the error disappear
// use self::mod1::Item;

fn main() {
    let _: Option<Item> = None;
}

(Playground)

Errors:

   Compiling playground v0.0.1 (file:///playground)
error[E0432]: unresolved import
 --> src/main.rs:5:13
  |
5 |         use Item;            // <--- Causes an "unresolved import" error
  |             ^^^^

error: aborting due to previous error

For more information about this error, try `rustc --explain E0432`.
error: Could not compile `playground`.

To learn more, run the command again with --verbose.

This issue can be reproduced in:

  • 1.30.0-nightly (73c7873 2018-08-05).
  • 1.29.0-beta.2 (ea82e08 2018-08-05).

But not in:

  • 1.28.0.
@petrochenkov petrochenkov self-assigned this Aug 7, 2018
@petrochenkov petrochenkov added A-resolve Area: Name/path resolution done by `rustc_resolve` specifically regression-from-stable-to-beta Performance or correctness regression from stable to beta. labels Aug 7, 2018
@petrochenkov
Copy link
Contributor

Very interesting.
Tuple struct constructors do have unusual properties - they are as public as the most private field, so use self::mod1::*; should import only the type Item, but not constructor.
However, it still shouldn't make use Item; an error, the type can still be imported.

It's interesting that the error happens only if use Item; is located inside of mod1:

mod mod1 {
    pub struct Item(usize);
    
    use Item as Something; // ERROR
}

use mod1::*;

mod mod2 {
    use Item; // OK
}

Perhaps bisection can find what commit caused the regression?

@petrochenkov petrochenkov added the E-help-wanted Call for participation: Help is requested to fix this issue. label Aug 8, 2018
@petrochenkov
Copy link
Contributor

petrochenkov commented Aug 8, 2018

Applying bisect-rust would be of great help here.
I won't be able to look at this issue in the next few weeks, but at least this part of the work can be delegated and when the reason is found I could probably mentor for the fix as well.

@Mark-Simulacrum
Copy link
Member

Mark-Simulacrum commented Aug 9, 2018

ef97813 is where the regression occurs with the minimized example; this is #52555. I've not bisected within the PR itself.

@nikomatsakis nikomatsakis added T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. P-high High priority labels Aug 9, 2018
@nikomatsakis
Copy link
Contributor

Visiting for triage. Marking as P-high as this is a regression. @petrochenkov has already assigned themselves.

@Mark-Simulacrum Mark-Simulacrum added this to the 1.29 milestone Aug 9, 2018
@petrochenkov
Copy link
Contributor

Fixed in #53509

bors added a commit that referenced this issue Aug 22, 2018
resolve: Reject some inaccessible candidates sooner during import resolution

This allows import resolution to progress in cases like #53140

Fixes #53140
bors pushed a commit that referenced this issue Aug 25, 2018
…olution

This allows import resolution to progress in cases like #53140
yvt added a commit to yvt/ngspades that referenced this issue Apr 25, 2020
"Wildcard imports do not seem to propagate as expected for tuple-like
struct types having at least one non-pub field"
<rust-lang/rust#53140>
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
A-resolve Area: Name/path resolution done by `rustc_resolve` specifically E-help-wanted Call for participation: Help is requested to fix this issue. P-high High priority regression-from-stable-to-beta Performance or correctness regression from stable to beta. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

No branches or pull requests

4 participants