Skip to content
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

Stop using span hack for contracts feature gating #136835

Merged
merged 2 commits into from
Feb 11, 2025

Conversation

compiler-errors
Copy link
Member

The contracts machinery is a pretty straightforward case of an external feature using a (perma-unstable) internal feature within its implementation. There's no reason why it needs to be implemented any differently than other features by using global span tracking hacks to change whether the internals are gated behind the contracts or contracts_internals feature gate -- for the case of macro expansions we already have allow_internal_unstable for exactly this situation.

This PR changes the internal, perma-unstable AST syntax to use the contracts_internals gate always, and adjusts the macro expansion to use the right spans so that allow_internal_unstable works correctly.

As a follow-up, there's really no reason to have contracts be a compiler feature since it's at this point fully a library feature; the only reason it's a compiler feature today is so we can mark it as incomplete, but that seems like a weak reason. I didn't do anything in this PR for this.

r? @celinval

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Feb 10, 2025
@@ -18,26 +18,6 @@ LL | #[core::contracts::ensures(|ret| *ret > 0)]
= help: add `#![feature(contracts)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date

error[E0658]: contracts are incomplete
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was redundant. We're already issuing a library feature error above, since we're just using a library feature.

Changing it to supporting issuing two feature gates is an undue burden to the parser impl unless we want to gate the internal machinery under both contracts and contracts_internals.

@celinval
Copy link
Contributor

Thank you for removing this hack!

@bors r+ rollup

@bors
Copy link
Contributor

bors commented Feb 10, 2025

📌 Commit f78099e has been approved by celinval

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 Feb 10, 2025
jhpratt added a commit to jhpratt/rust that referenced this pull request Feb 11, 2025
…k, r=celinval

Stop using span hack for contracts feature gating

The contracts machinery is a pretty straightforward case of an *external* feature using a (perma-unstable) *internal* feature within its implementation. There's no reason why it needs to be implemented any differently than other features by using global span tracking hacks to change whether the internals are gated behind the `contracts` or `contracts_internals` feature gate -- for the case of macro expansions we already have `allow_internal_unstable` for exactly this situation.

This PR changes the internal, perma-unstable AST syntax to use the `contracts_internals` gate always, and adjusts the macro expansion to use the right spans so that `allow_internal_unstable` works correctly.

As a follow-up, there's really no reason to have `contracts` be a *compiler feature* since it's at this point fully a *library feature*; the only reason it's a compiler feature today is so we can mark it as incomplete, but that seems like a weak reason. I didn't do anything in this PR for this.

r? `@celinval`
bors added a commit to rust-lang-ci/rust that referenced this pull request Feb 11, 2025
Rollup of 11 pull requests

Successful merges:

 - rust-lang#136606 (Fix long lines which rustfmt fails to format)
 - rust-lang#136663 (Stabilize `NonZero::count_ones`)
 - rust-lang#136672 (library: doc: core::alloc::Allocator: trivial typo fix)
 - rust-lang#136704 (Improve examples for file locking)
 - rust-lang#136721 (cg_llvm: Reduce visibility of some items outside the `llvm` module)
 - rust-lang#136813 (rustc_target: Add the fp16 target feature for AArch32)
 - rust-lang#136830 (fix i686-unknown-hurd-gnu x87 footnote)
 - rust-lang#136832 (Fix platform support table for i686-unknown-uefi)
 - rust-lang#136835 (Stop using span hack for contracts feature gating)
 - rust-lang#136837 (Overhaul how contracts are lowered on fn-like bodies)
 - rust-lang#136839 (fix ensure_monomorphic_enough)

r? `@ghost`
`@rustbot` modify labels: rollup
@bors bors merged commit 94bf32e into rust-lang:master Feb 11, 2025
12 checks passed
@rustbot rustbot added this to the 1.86.0 milestone Feb 11, 2025
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Feb 11, 2025
Rollup merge of rust-lang#136835 - compiler-errors:contracts-span-hack, r=celinval

Stop using span hack for contracts feature gating

The contracts machinery is a pretty straightforward case of an *external* feature using a (perma-unstable) *internal* feature within its implementation. There's no reason why it needs to be implemented any differently than other features by using global span tracking hacks to change whether the internals are gated behind the `contracts` or `contracts_internals` feature gate -- for the case of macro expansions we already have `allow_internal_unstable` for exactly this situation.

This PR changes the internal, perma-unstable AST syntax to use the `contracts_internals` gate always, and adjusts the macro expansion to use the right spans so that `allow_internal_unstable` works correctly.

As a follow-up, there's really no reason to have `contracts` be a *compiler feature* since it's at this point fully a *library feature*; the only reason it's a compiler feature today is so we can mark it as incomplete, but that seems like a weak reason. I didn't do anything in this PR for this.

r? ``@celinval``
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants