Skip to content

Don't merge cfg and doc(cfg) attributes for re-exports - #113091

Merged
bors merged 4 commits into
rust-lang:masterfrom
GuillaumeGomez:prevent-cfg-merge-reexport
Dec 15, 2023
Merged

Don't merge cfg and doc(cfg) attributes for re-exports#113091
bors merged 4 commits into
rust-lang:masterfrom
GuillaumeGomez:prevent-cfg-merge-reexport

Conversation

@GuillaumeGomez

@GuillaumeGomez GuillaumeGomez commented Jun 27, 2023

Copy link
Copy Markdown
Member

Fixes #112881.

Explanations

When re-exporting things with different cfgs there are two things that can happen:

  • The re-export uses a subset of cfgs, this subset is sufficient so that the item will appear exactly with the subset
  • The re-export uses a non-subset of cfgs (e.g. like the example I posted just above where the re-export is ungated), if the non-subset cfgs are active (e.g. compiling that example on windows) then this will be a compile error as the item doesn't exist to re-export, if the subset cfgs are active it behaves like 1.

Glob re-exports?

This only applies to non-glob inlined re-exports. For glob re-exports the item may or may not exist to be re-exported (potentially the cfgs on the path up until the glob can be removed, and only cfgs on the globbed item itself matter), for non-inlined re-exports see #85043.

cc @Nemo157
r? @notriddle

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-rustdoc Relevant to the rustdoc team, which will review and decide on the PR/issue. labels Jun 27, 2023
@rust-log-analyzer

This comment has been minimized.

@GuillaumeGomez
GuillaumeGomez force-pushed the prevent-cfg-merge-reexport branch from cffeed8 to cd5cf8e Compare June 27, 2023 12:07
@rust-log-analyzer

This comment has been minimized.

@Nemo157

Nemo157 commented Jun 27, 2023

Copy link
Copy Markdown
Contributor

The test failures are expected, my argument in the issue is that those tests are wrong. (I didn't go looking to see whether there's other tests that I'd expect to fail but didn't).

@GuillaumeGomez

Copy link
Copy Markdown
Member Author

Sorry should have precised: just realized that this wasn't ready yet. I'm finishing another PR first then coming back to this one.

@GuillaumeGomez
GuillaumeGomez force-pushed the prevent-cfg-merge-reexport branch from cd5cf8e to 3bc899a Compare June 28, 2023 12:13
@GuillaumeGomez

Copy link
Copy Markdown
Member Author

It's now ready. So in any case, this will need to go through an FCP. But I'm personally not a big fan of this change:

  • deprecated/unstable and equivalents are "inherited" by re-exports, so it's not coherent with this change.
  • Unlike other items, re-exports are a bit special since it's a same item with potentially extra conditions, extra documentation and another name. I think all such information should be available on the end re-export. Even if a missing cfg will trigger a compilation failure, I think it'd be a better user experience to show all needed requirements directly on the re-export instead of discovering them one by one through potentially multiple failures.

Anyway, that was my two cents on this. We'll see what the others think about it.

@est31

est31 commented Jun 28, 2023

Copy link
Copy Markdown
Member

Even if a missing cfg will trigger a compilation failure

The compilation failure will be triggered at the reexport site, or in other words, I'd consider it a bug if the item is not provided.

Another thing that speaks in favour of this PR is that there is often patterns like:

#[cfg(target_os = "linux")]
mod impl {
pub fn foo() { /* impl for linux */ }
}

#[cfg(target_os = "windows")]
mod impl {
pub fn foo() { /* impl for linux */ }
}

use impl::foo;

Here, there should ideally be no cfg documented as there is implementations for all operating systems.

@GuillaumeGomez

GuillaumeGomez commented Jun 28, 2023

Copy link
Copy Markdown
Member Author

But in this case, there is no cfg on foo directly, so nothing will be displayed, even currently. The equivalent would be (even if it doesn't compile but to get an idea):

#[cfg(target_os = "linux")]
pub fn foo() { /* impl for linux */ }

#[cfg(target_os = "windows")]
pub fn foo() { /* impl for windows */ }

pub use self::foo as reexport;

@Nemo157

Nemo157 commented Jun 28, 2023

Copy link
Copy Markdown
Contributor

But in this case, there is no cfg on foo directly, so nothing will be displayed, even currently.

No, cfg's are merged down onto the item before the re-export is inlined

#![feature(doc_auto_cfg)]

#[cfg(target_os = "linux")]
mod impl_ {
    pub fn foo() { /* impl for linux */ }
}

#[cfg(target_os = "macos")]
mod impl_ {
    pub fn foo() { /* impl for darwin */ }
}

pub use impl_::foo;
image

That doesn't really matter though, your example showing the cfg on the inlined re-export would also be wrong, since the public item is not gated on any platform the crate compiles on. (Except it's not inlined since the re-exported items are pub so my arguments (and hopefully this change) don't apply).

@Nemo157

Nemo157 commented Jun 28, 2023

Copy link
Copy Markdown
Contributor

(I would suggest maybe doing FCP in the issue since that's where I documented my rationale for the change).

@GuillaumeGomez

Copy link
Copy Markdown
Member Author

You could also start it here and add an explanation text too. As you prefer.

@Nemo157

Nemo157 commented Jun 28, 2023

Copy link
Copy Markdown
Contributor

@rfcbot pr merge

My reasoning for this change from the issue:

When re-exporting things with different cfgs there are two things that can happen:

  1. The re-export uses a subset of cfgs, this subset is sufficient so that the item will appear exactly with the subset
  2. The re-export uses a non-subset of cfgs (e.g. like the example I posted just above where the re-export is ungated), if the non-subset cfgs are active (e.g. compiling that example on windows) then this will be a compile error as the item doesn't exist to re-export, if the subset cfgs are active it behaves like 1.

This only applies to non-glob inlined re-exports, for glob re-exports the item may or may not exist to be re-exported (potentially the cfgs on the path up until the glob can be removed, and only cfgs on the globbed item itself matter, but I haven't thought through all the details), for non-inlined re-exports see #85043.

@rfcbot

rfcbot commented Jun 28, 2023

Copy link
Copy Markdown

Team member @Nemo157 has proposed to merge this. The next step is review by the rest of the tagged team members:

No concerns currently listed.

Once a majority of reviewers approve (and at most 2 approvals are outstanding), this will enter its final comment period. If you spot a major issue that hasn't been raised at any point in this process, please speak up!

See this document for info about what commands tagged team members can give me.

@rfcbot rfcbot added proposed-final-comment-period Proposed to merge/close by relevant subteam, see T-<team> label. Will enter FCP once signed off. disposition-merge This issue / PR is in PFCP or FCP with a disposition to merge it. labels Jun 28, 2023
Comment thread src/librustdoc/clean/mod.rs
@bors

bors commented Jul 28, 2023

Copy link
Copy Markdown
Collaborator

☔ The latest upstream changes (presumably #114115) made this pull request unmergeable. Please resolve the merge conflicts.

@GuillaumeGomez
GuillaumeGomez force-pushed the prevent-cfg-merge-reexport branch from 4be2842 to be881f8 Compare November 3, 2023 14:44
@GuillaumeGomez

Copy link
Copy Markdown
Member Author

Fixed merge conflict.

@bors

bors commented Nov 16, 2023

Copy link
Copy Markdown
Collaborator

☔ The latest upstream changes (presumably #117875) made this pull request unmergeable. Please resolve the merge conflicts.

@GuillaumeGomez
GuillaumeGomez force-pushed the prevent-cfg-merge-reexport branch from be881f8 to 823148f Compare November 22, 2023 16:29
@GuillaumeGomez

Copy link
Copy Markdown
Member Author

Fixed merged conflict.

@rfcbot

rfcbot commented Dec 4, 2023

Copy link
Copy Markdown

🔔 This is now entering its final comment period, as per the review above. 🔔

@rfcbot rfcbot added finished-final-comment-period The final comment period is finished for this PR / Issue. to-announce Announce this issue on triage meeting and removed final-comment-period In the final comment period and will be merged soon unless new substantive objections are raised. labels Dec 14, 2023
@rfcbot

rfcbot commented Dec 14, 2023

Copy link
Copy Markdown

The final comment period, with a disposition to merge, as per the review above, is now complete.

As the automated representative of the governance process, I would like to thank the author for their work and everyone else who contributed.

This will be merged soon.

@GuillaumeGomez

ghost commented Dec 15, 2023

Copy link
Copy Markdown
Member Author

@bors r=rustdoc

@bors

ghost commented Dec 15, 2023

Copy link
Copy Markdown
Collaborator

📌 Commit 823148f has been approved by rustdoc

It is now in the queue for this repository.

@bors bors added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Dec 15, 2023
@bors
bors merged commit ec0008a into rust-lang:master Dec 15, 2023
@rustbot rustbot added this to the 1.76.0 milestone Dec 15, 2023
@bors

ghost commented Dec 15, 2023

Copy link
Copy Markdown
Collaborator

⌛ Testing commit 823148f with merge 4d1bd0d...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

disposition-merge This issue / PR is in PFCP or FCP with a disposition to merge it. finished-final-comment-period The final comment period is finished for this PR / Issue. S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-rustdoc Relevant to the rustdoc team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

doc_cfg should not merge cfgs on non-glob inlined reexports

9 participants