Stabilize cfg_boolean_literals
This commit is contained in:
parent
946aea0b3d
commit
984c51f6a1
15 changed files with 26 additions and 163 deletions
|
@ -7,7 +7,6 @@ use rustc_session::config::ExpectedValues;
|
||||||
use rustc_session::lint::BuiltinLintDiag;
|
use rustc_session::lint::BuiltinLintDiag;
|
||||||
use rustc_session::lint::builtin::UNEXPECTED_CFGS;
|
use rustc_session::lint::builtin::UNEXPECTED_CFGS;
|
||||||
use rustc_session::parse::feature_err;
|
use rustc_session::parse::feature_err;
|
||||||
use rustc_span::symbol::kw;
|
|
||||||
use rustc_span::{Span, Symbol, sym};
|
use rustc_span::{Span, Symbol, sym};
|
||||||
|
|
||||||
use crate::session_diagnostics::{self, UnsupportedLiteralReason};
|
use crate::session_diagnostics::{self, UnsupportedLiteralReason};
|
||||||
|
@ -89,20 +88,6 @@ pub fn eval_condition(
|
||||||
let cfg = match cfg {
|
let cfg = match cfg {
|
||||||
MetaItemInner::MetaItem(meta_item) => meta_item,
|
MetaItemInner::MetaItem(meta_item) => meta_item,
|
||||||
MetaItemInner::Lit(MetaItemLit { kind: LitKind::Bool(b), .. }) => {
|
MetaItemInner::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;
|
return *b;
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
|
|
|
@ -95,6 +95,8 @@ declare_features! (
|
||||||
(accepted, c_unwind, "1.81.0", Some(74990)),
|
(accepted, c_unwind, "1.81.0", Some(74990)),
|
||||||
/// Allows `#[cfg_attr(predicate, multiple, attributes, here)]`.
|
/// Allows `#[cfg_attr(predicate, multiple, attributes, here)]`.
|
||||||
(accepted, cfg_attr_multi, "1.33.0", Some(54881)),
|
(accepted, cfg_attr_multi, "1.33.0", Some(54881)),
|
||||||
|
/// Allows the use of `#[cfg(<true/false>)]`.
|
||||||
|
(accepted, cfg_boolean_literals, "CURRENT_RUSTC_VERSION", Some(131204)),
|
||||||
/// Allows the use of `#[cfg(doctest)]`, set when rustdoc is collecting doctests.
|
/// Allows the use of `#[cfg(doctest)]`, set when rustdoc is collecting doctests.
|
||||||
(accepted, cfg_doctest, "1.40.0", Some(62210)),
|
(accepted, cfg_doctest, "1.40.0", Some(62210)),
|
||||||
/// Enables `#[cfg(panic = "...")]` config key.
|
/// Enables `#[cfg(panic = "...")]` config key.
|
||||||
|
|
|
@ -391,8 +391,6 @@ declare_features! (
|
||||||
(unstable, async_trait_bounds, "1.85.0", Some(62290)),
|
(unstable, async_trait_bounds, "1.85.0", Some(62290)),
|
||||||
/// 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, "1.83.0", Some(131204)),
|
|
||||||
/// Allows the use of `#[cfg(contract_checks)` to check if contract checks are enabled.
|
/// Allows the use of `#[cfg(contract_checks)` to check if contract checks are enabled.
|
||||||
(unstable, cfg_contract_checks, "1.86.0", Some(128044)),
|
(unstable, cfg_contract_checks, "1.86.0", Some(128044)),
|
||||||
/// 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.
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
# `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;
|
|
||||||
```
|
|
|
@ -3789,35 +3789,6 @@ The tracking issue for this feature is: [#64797]
|
||||||
[#64797]: https://github.com/rust-lang/rust/issues/64797
|
[#64797]: https://github.com/rust-lang/rust/issues/64797
|
||||||
|
|
||||||
------------------------
|
------------------------
|
||||||
"##,
|
|
||||||
default_severity: Severity::Allow,
|
|
||||||
warn_since: None,
|
|
||||||
deny_since: None,
|
|
||||||
},
|
|
||||||
Lint {
|
|
||||||
label: "cfg_boolean_literals",
|
|
||||||
description: r##"# `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;
|
|
||||||
```
|
|
||||||
"##,
|
"##,
|
||||||
default_severity: Severity::Allow,
|
default_severity: Severity::Allow,
|
||||||
warn_since: None,
|
warn_since: None,
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
//@ check-pass
|
//@ check-pass
|
||||||
|
|
||||||
#![feature(cfg_boolean_literals)]
|
|
||||||
#![feature(doc_cfg)]
|
#![feature(doc_cfg)]
|
||||||
|
|
||||||
#[doc(cfg(false))]
|
#[doc(cfg(false))]
|
||||||
|
|
|
@ -1,10 +1,6 @@
|
||||||
// #138113: rustdoc didn't gate unstable predicates inside `doc(cfg(..))`
|
// #138113: rustdoc didn't gate unstable predicates inside `doc(cfg(..))`
|
||||||
#![feature(doc_cfg)]
|
#![feature(doc_cfg)]
|
||||||
|
|
||||||
// `cfg_boolean_literals`
|
|
||||||
#[doc(cfg(false))] //~ ERROR `cfg(false)` is experimental and subject to change
|
|
||||||
pub fn cfg_boolean_literals() {}
|
|
||||||
|
|
||||||
// `cfg_version`
|
// `cfg_version`
|
||||||
#[doc(cfg(sanitize = "thread"))] //~ ERROR `cfg(sanitize)` is experimental and subject to change
|
#[doc(cfg(sanitize = "thread"))] //~ ERROR `cfg(sanitize)` is experimental and subject to change
|
||||||
pub fn cfg_sanitize() {}
|
pub fn cfg_sanitize() {}
|
||||||
|
|
|
@ -1,15 +1,5 @@
|
||||||
error[E0658]: `cfg(false)` is experimental and subject to change
|
|
||||||
--> $DIR/doc-cfg-unstable.rs:5:11
|
|
||||||
|
|
|
||||||
LL | #[doc(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(sanitize)` is experimental and subject to change
|
error[E0658]: `cfg(sanitize)` is experimental and subject to change
|
||||||
--> $DIR/doc-cfg-unstable.rs:9:11
|
--> $DIR/doc-cfg-unstable.rs:5:11
|
||||||
|
|
|
|
||||||
LL | #[doc(cfg(sanitize = "thread"))]
|
LL | #[doc(cfg(sanitize = "thread"))]
|
||||||
| ^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -18,6 +8,6 @@ LL | #[doc(cfg(sanitize = "thread"))]
|
||||||
= help: add `#![feature(cfg_sanitize)]` to the crate attributes to enable
|
= help: add `#![feature(cfg_sanitize)]` to the crate attributes to enable
|
||||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0658`.
|
For more information about this error, try `rustc --explain E0658`.
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
//@ run-pass
|
//@ run-pass
|
||||||
|
|
||||||
#![feature(link_cfg)]
|
#![feature(link_cfg)]
|
||||||
#![feature(cfg_boolean_literals)]
|
|
||||||
|
|
||||||
#[cfg(true)]
|
#[cfg(true)]
|
||||||
fn foo() -> bool {
|
fn foo() -> bool {
|
||||||
|
|
|
@ -1,10 +0,0 @@
|
||||||
#[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
|
|
||||||
}
|
|
|
@ -1,43 +0,0 @@
|
||||||
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`.
|
|
|
@ -1,6 +1,5 @@
|
||||||
//@ check-pass
|
//@ check-pass
|
||||||
|
|
||||||
#![feature(cfg_boolean_literals)]
|
|
||||||
#![warn(unused)]
|
#![warn(unused)]
|
||||||
|
|
||||||
macro_rules! foo {
|
macro_rules! foo {
|
||||||
|
|
|
@ -1,41 +1,41 @@
|
||||||
warning: unused attribute `inline`
|
warning: unused attribute `inline`
|
||||||
--> $DIR/inert-attr-macro.rs:11:5
|
--> $DIR/inert-attr-macro.rs:10:5
|
||||||
|
|
|
|
||||||
LL | #[inline] foo!();
|
LL | #[inline] foo!();
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
|
|
|
|
||||||
note: the built-in attribute `inline` will be ignored, since it's applied to the macro invocation `foo`
|
note: the built-in attribute `inline` will be ignored, since it's applied to the macro invocation `foo`
|
||||||
--> $DIR/inert-attr-macro.rs:11:15
|
--> $DIR/inert-attr-macro.rs:10:15
|
||||||
|
|
|
|
||||||
LL | #[inline] foo!();
|
LL | #[inline] foo!();
|
||||||
| ^^^
|
| ^^^
|
||||||
note: the lint level is defined here
|
note: the lint level is defined here
|
||||||
--> $DIR/inert-attr-macro.rs:4:9
|
--> $DIR/inert-attr-macro.rs:3:9
|
||||||
|
|
|
|
||||||
LL | #![warn(unused)]
|
LL | #![warn(unused)]
|
||||||
| ^^^^^^
|
| ^^^^^^
|
||||||
= note: `#[warn(unused_attributes)]` implied by `#[warn(unused)]`
|
= note: `#[warn(unused_attributes)]` implied by `#[warn(unused)]`
|
||||||
|
|
||||||
warning: unused attribute `allow`
|
warning: unused attribute `allow`
|
||||||
--> $DIR/inert-attr-macro.rs:15:5
|
--> $DIR/inert-attr-macro.rs:14:5
|
||||||
|
|
|
|
||||||
LL | #[allow(warnings)] #[inline] foo!();
|
LL | #[allow(warnings)] #[inline] foo!();
|
||||||
| ^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
note: the built-in attribute `allow` will be ignored, since it's applied to the macro invocation `foo`
|
note: the built-in attribute `allow` will be ignored, since it's applied to the macro invocation `foo`
|
||||||
--> $DIR/inert-attr-macro.rs:15:34
|
--> $DIR/inert-attr-macro.rs:14:34
|
||||||
|
|
|
|
||||||
LL | #[allow(warnings)] #[inline] foo!();
|
LL | #[allow(warnings)] #[inline] foo!();
|
||||||
| ^^^
|
| ^^^
|
||||||
|
|
||||||
warning: unused attribute `inline`
|
warning: unused attribute `inline`
|
||||||
--> $DIR/inert-attr-macro.rs:15:24
|
--> $DIR/inert-attr-macro.rs:14:24
|
||||||
|
|
|
|
||||||
LL | #[allow(warnings)] #[inline] foo!();
|
LL | #[allow(warnings)] #[inline] foo!();
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
|
|
|
|
||||||
note: the built-in attribute `inline` will be ignored, since it's applied to the macro invocation `foo`
|
note: the built-in attribute `inline` will be ignored, since it's applied to the macro invocation `foo`
|
||||||
--> $DIR/inert-attr-macro.rs:15:34
|
--> $DIR/inert-attr-macro.rs:14:34
|
||||||
|
|
|
|
||||||
LL | #[allow(warnings)] #[inline] foo!();
|
LL | #[allow(warnings)] #[inline] foo!();
|
||||||
| ^^^
|
| ^^^
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
//@ check-pass
|
//@ check-pass
|
||||||
//@ proc-macro: test-macros.rs
|
//@ proc-macro: test-macros.rs
|
||||||
|
|
||||||
#![feature(cfg_boolean_literals)]
|
|
||||||
#![feature(cfg_eval)]
|
#![feature(cfg_eval)]
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
|
|
|
@ -4,75 +4,75 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [
|
||||||
Punct {
|
Punct {
|
||||||
ch: '#',
|
ch: '#',
|
||||||
spacing: Alone,
|
spacing: Alone,
|
||||||
span: #0 bytes(305..306),
|
span: #0 bytes(271..272),
|
||||||
},
|
},
|
||||||
Group {
|
Group {
|
||||||
delimiter: Bracket,
|
delimiter: Bracket,
|
||||||
stream: TokenStream [
|
stream: TokenStream [
|
||||||
Ident {
|
Ident {
|
||||||
ident: "test_macros",
|
ident: "test_macros",
|
||||||
span: #0 bytes(322..333),
|
span: #0 bytes(288..299),
|
||||||
},
|
},
|
||||||
Punct {
|
Punct {
|
||||||
ch: ':',
|
ch: ':',
|
||||||
spacing: Joint,
|
spacing: Joint,
|
||||||
span: #0 bytes(333..334),
|
span: #0 bytes(299..300),
|
||||||
},
|
},
|
||||||
Punct {
|
Punct {
|
||||||
ch: ':',
|
ch: ':',
|
||||||
spacing: Alone,
|
spacing: Alone,
|
||||||
span: #0 bytes(334..335),
|
span: #0 bytes(300..301),
|
||||||
},
|
},
|
||||||
Ident {
|
Ident {
|
||||||
ident: "print_attr",
|
ident: "print_attr",
|
||||||
span: #0 bytes(335..345),
|
span: #0 bytes(301..311),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
span: #0 bytes(306..347),
|
span: #0 bytes(272..313),
|
||||||
},
|
},
|
||||||
Ident {
|
Ident {
|
||||||
ident: "struct",
|
ident: "struct",
|
||||||
span: #0 bytes(348..354),
|
span: #0 bytes(314..320),
|
||||||
},
|
},
|
||||||
Ident {
|
Ident {
|
||||||
ident: "S",
|
ident: "S",
|
||||||
span: #0 bytes(355..356),
|
span: #0 bytes(321..322),
|
||||||
},
|
},
|
||||||
Punct {
|
Punct {
|
||||||
ch: ';',
|
ch: ';',
|
||||||
spacing: Alone,
|
spacing: Alone,
|
||||||
span: #0 bytes(356..357),
|
span: #0 bytes(322..323),
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
PRINT-ATTR INPUT (DISPLAY): struct S;
|
PRINT-ATTR INPUT (DISPLAY): struct S;
|
||||||
PRINT-ATTR INPUT (DEBUG): TokenStream [
|
PRINT-ATTR INPUT (DEBUG): TokenStream [
|
||||||
Ident {
|
Ident {
|
||||||
ident: "struct",
|
ident: "struct",
|
||||||
span: #0 bytes(348..354),
|
span: #0 bytes(314..320),
|
||||||
},
|
},
|
||||||
Ident {
|
Ident {
|
||||||
ident: "S",
|
ident: "S",
|
||||||
span: #0 bytes(355..356),
|
span: #0 bytes(321..322),
|
||||||
},
|
},
|
||||||
Punct {
|
Punct {
|
||||||
ch: ';',
|
ch: ';',
|
||||||
spacing: Alone,
|
spacing: Alone,
|
||||||
span: #0 bytes(356..357),
|
span: #0 bytes(322..323),
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
PRINT-ATTR INPUT (DISPLAY): struct Z;
|
PRINT-ATTR INPUT (DISPLAY): struct Z;
|
||||||
PRINT-ATTR INPUT (DEBUG): TokenStream [
|
PRINT-ATTR INPUT (DEBUG): TokenStream [
|
||||||
Ident {
|
Ident {
|
||||||
ident: "struct",
|
ident: "struct",
|
||||||
span: #0 bytes(411..417),
|
span: #0 bytes(377..383),
|
||||||
},
|
},
|
||||||
Ident {
|
Ident {
|
||||||
ident: "Z",
|
ident: "Z",
|
||||||
span: #0 bytes(418..419),
|
span: #0 bytes(384..385),
|
||||||
},
|
},
|
||||||
Punct {
|
Punct {
|
||||||
ch: ';',
|
ch: ';',
|
||||||
spacing: Alone,
|
spacing: Alone,
|
||||||
span: #0 bytes(419..420),
|
span: #0 bytes(385..386),
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue