Skip to content

Lint unreachable_pub got easily confused by multiple items in a single pub use ... statement #64762

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
imp opened this issue Sep 25, 2019 · 7 comments
Assignees
Labels
A-lints Area: Lints (warnings about flaws in source code) such as unused_mut. A-visibility Area: Visibility / privacy C-bug Category: This is a bug. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@imp
Copy link

imp commented Sep 25, 2019

This code (playground) trips unreachable_pub lint (while being completely legit).

#![deny(unreachable_pub)]

pub use self::m1::{Item1, Item2};

mod m1 {
    pub use self::m2::{Item1, Item2};
    
    mod m2 {
        pub struct Item1;
        pub struct Item2;
    }
}

However, if we break the top-level pub use ... statement into two separate statements (playground) - unreachable_pub lint convinces itself that the code is, indeed, legit.

#![deny(unreachable_pub)]

pub use self::m1::Item1;
pub use self::m1::Item2;

mod m1 {

    pub use self::m2::{Item1, Item2};
    
    mod m2 {
        pub struct Item1;
        pub struct Item2;
    }
}
@imp imp changed the title Lint unreachable_pub got easily confused by multiple items in single pub use ... statement Lint unreachable_pub got easily confused by multiple items in a single pub use ... statement Sep 25, 2019
@csmoe csmoe added A-lints Area: Lints (warnings about flaws in source code) such as unused_mut. A-visibility Area: Visibility / privacy labels Sep 25, 2019
@jonas-schievink jonas-schievink added C-bug Category: This is a bug. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Sep 25, 2019
@jhpratt
Copy link
Member

jhpratt commented Nov 13, 2019

Running into this myself. Right now I'm just #[allow]ing it with a link to this issue.

If someone could lead me in the right direction, I'll give fixing this a shot.

@HeroicKatora
Copy link
Contributor

HeroicKatora commented Dec 19, 2019

It also gets confused if the export happens via a glob, also on a single item (Playground).

#![deny(unreachable_pub)]

mod m1 {
    pub mod m2 {
        pub use super::Item1;
    }
    
    pub struct Item1;
}

pub use m1::m2::*;

ischeinkman added a commit to ischeinkman/mpris-rs that referenced this issue Feb 12, 2020
…ccuring.

Note: due to a compiler error, the root-level `metadata` re-exports had to be
split into 3; see
rust-lang/rust#64762
Mange pushed a commit to Mange/mpris-rs that referenced this issue Feb 15, 2020
Added unreachable_pub lint which should help to prevent this issue from
happening again.

Note: due to a compiler error, the root-level `metadata` re-exports had
to be split into 3; see
rust-lang/rust#64762
@jyn514
Copy link
Member

jyn514 commented Feb 28, 2020

Looks like this is because of #57922 (comment)

Seeker14491 added a commit to Seeker14491/steamworks-rs that referenced this issue Sep 11, 2020
Also, remove the `unreachable_pub` lint, which suggested the erroneous change. Rust issue: rust-lang/rust#64762
bochaco pushed a commit to maidsafe/temp_safe_network that referenced this issue Jul 6, 2021
Sadly, due to a known issue ([#64762]) with the lint, `pub` items that
are exposed through multi-item intermediate `pub use` re-exports trigger
false positives with the lint. There are two ways of working around
this:

1. Avoiding multi-item `pub use` statements. This leads to swathes of
   mostly redundant `pub use` lines, especially on modules like `types`.
2. Leaking the structure of nested modules up to a reachable `pub use`.
   This leaves the export-point vulnerable to module reorganisation.

For this module, option 2 was chosen due to the sheer number of
re-exported items, and the relatively shallow module hierarchies.

[#64726]: rust-lang/rust#64762
@lambinoo
Copy link
Contributor

@rustbot claim

@lambinoo
Copy link
Contributor

Since I claimed it 8 days ago, just a follow up.
I've been able to break the compiler a few times but I'm getting somewhere I think...
Not to a proper solution tho, just more mess, but that means more knowledge!

tl;dr: I haven't given up!

@petrochenkov
Copy link
Contributor

How to fix this: #82064.

bors added a commit to rust-lang-ci/rust that referenced this issue Jan 10, 2022
…, r=petrochenkov

Fixes wrong unreachable_pub lints on nested and glob public reexport

Linked issues: rust-lang#64762 & rust-lang#82064
@lambinoo
Copy link
Contributor

Closed by #87487

@camelid camelid closed this as completed Jan 10, 2022
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
A-lints Area: Lints (warnings about flaws in source code) such as unused_mut. A-visibility Area: Visibility / privacy C-bug Category: This is a bug. 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

9 participants