Feature gate boolean lit support in cfg predicates
This commit is contained in:
parent
c99f29b29f
commit
62ef411631
@ -18,7 +18,7 @@
|
|||||||
use rustc_session::{RustcVersion, Session};
|
use rustc_session::{RustcVersion, Session};
|
||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
use rustc_span::hygiene::Transparency;
|
use rustc_span::hygiene::Transparency;
|
||||||
use rustc_span::symbol::{Symbol, sym};
|
use rustc_span::symbol::{Symbol, kw, sym};
|
||||||
|
|
||||||
use crate::fluent_generated;
|
use crate::fluent_generated;
|
||||||
use crate::session_diagnostics::{self, IncorrectReprFormatGenericCause};
|
use crate::session_diagnostics::{self, IncorrectReprFormatGenericCause};
|
||||||
@ -603,7 +603,23 @@ pub fn eval_condition(
|
|||||||
|
|
||||||
let cfg = match cfg {
|
let cfg = match cfg {
|
||||||
ast::NestedMetaItem::MetaItem(meta_item) => meta_item,
|
ast::NestedMetaItem::MetaItem(meta_item) => meta_item,
|
||||||
ast::NestedMetaItem::Lit(MetaItemLit { kind: LitKind::Bool(b), .. }) => return *b,
|
ast::NestedMetaItem::Lit(MetaItemLit { kind: LitKind::Bool(b), .. }) => {
|
||||||
|
if let Some(features) = features {
|
||||||
|
// we can't use `try_gate_cfg` as symbols don't differentiate between `r#true`
|
||||||
|
// and `true`, and we want to keep the former working without feature gate
|
||||||
|
gate_cfg(
|
||||||
|
&((
|
||||||
|
if *b { kw::True } else { kw::False },
|
||||||
|
sym::cfg_boolean_literals,
|
||||||
|
|features: &Features| features.cfg_boolean_literals,
|
||||||
|
)),
|
||||||
|
cfg.span(),
|
||||||
|
sess,
|
||||||
|
features,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return *b;
|
||||||
|
}
|
||||||
_ => {
|
_ => {
|
||||||
dcx.emit_err(session_diagnostics::UnsupportedLiteral {
|
dcx.emit_err(session_diagnostics::UnsupportedLiteral {
|
||||||
span: cfg.span(),
|
span: cfg.span(),
|
||||||
|
@ -371,6 +371,8 @@ pub fn internal(&self, feature: Symbol) -> bool {
|
|||||||
(unstable, async_for_loop, "1.77.0", Some(118898)),
|
(unstable, async_for_loop, "1.77.0", Some(118898)),
|
||||||
/// Allows using C-variadics.
|
/// Allows using C-variadics.
|
||||||
(unstable, c_variadic, "1.34.0", Some(44930)),
|
(unstable, c_variadic, "1.34.0", Some(44930)),
|
||||||
|
/// Allows the use of `#[cfg(<true/false>)]`.
|
||||||
|
(unstable, cfg_boolean_literals, "CURRENT_RUSTC_VERSION", Some(131204)),
|
||||||
/// Allows the use of `#[cfg(overflow_checks)` to check if integer overflow behaviour.
|
/// Allows the use of `#[cfg(overflow_checks)` to check if integer overflow behaviour.
|
||||||
(unstable, cfg_overflow_checks, "1.71.0", Some(111466)),
|
(unstable, cfg_overflow_checks, "1.71.0", Some(111466)),
|
||||||
/// Provides the relocation model information as cfg entry
|
/// Provides the relocation model information as cfg entry
|
||||||
|
@ -543,6 +543,7 @@
|
|||||||
cfg_accessible,
|
cfg_accessible,
|
||||||
cfg_attr,
|
cfg_attr,
|
||||||
cfg_attr_multi,
|
cfg_attr_multi,
|
||||||
|
cfg_boolean_literals,
|
||||||
cfg_doctest,
|
cfg_doctest,
|
||||||
cfg_eval,
|
cfg_eval,
|
||||||
cfg_fmt_debug,
|
cfg_fmt_debug,
|
||||||
|
@ -0,0 +1,22 @@
|
|||||||
|
# `cfg_boolean_literals`
|
||||||
|
|
||||||
|
The tracking issue for this feature is: [#131204]
|
||||||
|
|
||||||
|
[#131204]: https://github.com/rust-lang/rust/issues/131204
|
||||||
|
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
The `cfg_boolean_literals` feature makes it possible to use the `true`/`false`
|
||||||
|
literal as cfg predicate. They always evaluate to true/false respectively.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```rust
|
||||||
|
#![feature(cfg_boolean_literals)]
|
||||||
|
|
||||||
|
#[cfg(true)]
|
||||||
|
const A: i32 = 5;
|
||||||
|
|
||||||
|
#[cfg(all(false))]
|
||||||
|
const A: i32 = 58 * 89;
|
||||||
|
```
|
19
tests/ui/cfg/raw-true-false.rs
Normal file
19
tests/ui/cfg/raw-true-false.rs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
//@ check-pass
|
||||||
|
//@ compile-flags: --cfg false --check-cfg=cfg(r#false)
|
||||||
|
|
||||||
|
#![deny(warnings)]
|
||||||
|
|
||||||
|
#[expect(unexpected_cfgs)]
|
||||||
|
mod a {
|
||||||
|
#[cfg(r#true)]
|
||||||
|
pub fn foo() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
mod b {
|
||||||
|
#[cfg(r#false)]
|
||||||
|
pub fn bar() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
b::bar()
|
||||||
|
}
|
@ -1,6 +1,7 @@
|
|||||||
//@ run-pass
|
//@ run-pass
|
||||||
|
|
||||||
#![feature(link_cfg)]
|
#![feature(link_cfg)]
|
||||||
|
#![feature(cfg_boolean_literals)]
|
||||||
|
|
||||||
#[cfg(true)]
|
#[cfg(true)]
|
||||||
fn foo() -> bool {
|
fn foo() -> bool {
|
||||||
|
10
tests/ui/feature-gates/feature-gate-cfg-boolean-literals.rs
Normal file
10
tests/ui/feature-gates/feature-gate-cfg-boolean-literals.rs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#[cfg(true)] //~ ERROR `cfg(true)` is experimental
|
||||||
|
fn foo() {}
|
||||||
|
|
||||||
|
#[cfg_attr(true, cfg(false))] //~ ERROR `cfg(true)` is experimental
|
||||||
|
//~^ ERROR `cfg(false)` is experimental
|
||||||
|
fn foo() {}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
cfg!(false); //~ ERROR `cfg(false)` is experimental
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
error[E0658]: `cfg(true)` is experimental and subject to change
|
||||||
|
--> $DIR/feature-gate-cfg-boolean-literals.rs:1:7
|
||||||
|
|
|
||||||
|
LL | #[cfg(true)]
|
||||||
|
| ^^^^
|
||||||
|
|
|
||||||
|
= note: see issue #131204 <https://github.com/rust-lang/rust/issues/131204> for more information
|
||||||
|
= help: add `#![feature(cfg_boolean_literals)]` 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]: `cfg(true)` is experimental and subject to change
|
||||||
|
--> $DIR/feature-gate-cfg-boolean-literals.rs:4:12
|
||||||
|
|
|
||||||
|
LL | #[cfg_attr(true, cfg(false))]
|
||||||
|
| ^^^^
|
||||||
|
|
|
||||||
|
= note: see issue #131204 <https://github.com/rust-lang/rust/issues/131204> for more information
|
||||||
|
= help: add `#![feature(cfg_boolean_literals)]` 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]: `cfg(false)` is experimental and subject to change
|
||||||
|
--> $DIR/feature-gate-cfg-boolean-literals.rs:4:22
|
||||||
|
|
|
||||||
|
LL | #[cfg_attr(true, cfg(false))]
|
||||||
|
| ^^^^^
|
||||||
|
|
|
||||||
|
= note: see issue #131204 <https://github.com/rust-lang/rust/issues/131204> for more information
|
||||||
|
= help: add `#![feature(cfg_boolean_literals)]` 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]: `cfg(false)` is experimental and subject to change
|
||||||
|
--> $DIR/feature-gate-cfg-boolean-literals.rs:9:10
|
||||||
|
|
|
||||||
|
LL | cfg!(false);
|
||||||
|
| ^^^^^
|
||||||
|
|
|
||||||
|
= note: see issue #131204 <https://github.com/rust-lang/rust/issues/131204> for more information
|
||||||
|
= help: add `#![feature(cfg_boolean_literals)]` 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: aborting due to 4 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0658`.
|
Loading…
Reference in New Issue
Block a user