Split inline const to two feature gates
This commit is contained in:
parent
cebd2dda1d
commit
6d61d87b22
@ -719,6 +719,7 @@ pub fn check_crate(krate: &ast::Crate, sess: &Session) {
|
|||||||
gate_all!(const_trait_impl, "const trait impls are experimental");
|
gate_all!(const_trait_impl, "const trait impls are experimental");
|
||||||
gate_all!(half_open_range_patterns, "half-open range patterns are unstable");
|
gate_all!(half_open_range_patterns, "half-open range patterns are unstable");
|
||||||
gate_all!(inline_const, "inline-const is experimental");
|
gate_all!(inline_const, "inline-const is experimental");
|
||||||
|
gate_all!(inline_const_pat, "inline-const in pattern position is experimental");
|
||||||
gate_all!(
|
gate_all!(
|
||||||
const_generics_defaults,
|
const_generics_defaults,
|
||||||
"default values for const generic parameters are experimental"
|
"default values for const generic parameters are experimental"
|
||||||
|
@ -410,6 +410,8 @@ declare_features! (
|
|||||||
(incomplete, inherent_associated_types, "1.52.0", Some(8995), None),
|
(incomplete, inherent_associated_types, "1.52.0", Some(8995), None),
|
||||||
/// Allow anonymous constants from an inline `const` block
|
/// Allow anonymous constants from an inline `const` block
|
||||||
(incomplete, inline_const, "1.49.0", Some(76001), None),
|
(incomplete, inline_const, "1.49.0", Some(76001), None),
|
||||||
|
/// Allow anonymous constants from an inline `const` block in pattern position
|
||||||
|
(incomplete, inline_const_pat, "1.58.0", Some(76001), None),
|
||||||
/// Allows using `pointer` and `reference` in intra-doc links
|
/// Allows using `pointer` and `reference` in intra-doc links
|
||||||
(active, intra_doc_pointers, "1.51.0", Some(80896), None),
|
(active, intra_doc_pointers, "1.51.0", Some(80896), None),
|
||||||
/// Allows `#[instruction_set(_)]` attribute
|
/// Allows `#[instruction_set(_)]` attribute
|
||||||
|
@ -1243,7 +1243,7 @@ impl<'a> Parser<'a> {
|
|||||||
} else if self.eat_keyword(kw::Unsafe) {
|
} else if self.eat_keyword(kw::Unsafe) {
|
||||||
self.parse_block_expr(None, lo, BlockCheckMode::Unsafe(ast::UserProvided), attrs)
|
self.parse_block_expr(None, lo, BlockCheckMode::Unsafe(ast::UserProvided), attrs)
|
||||||
} else if self.check_inline_const(0) {
|
} else if self.check_inline_const(0) {
|
||||||
self.parse_const_block(lo.to(self.token.span))
|
self.parse_const_block(lo.to(self.token.span), false)
|
||||||
} else if self.is_do_catch_block() {
|
} else if self.is_do_catch_block() {
|
||||||
self.recover_do_catch(attrs)
|
self.recover_do_catch(attrs)
|
||||||
} else if self.is_try_block() {
|
} else if self.is_try_block() {
|
||||||
|
@ -1095,8 +1095,12 @@ impl<'a> Parser<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Parses inline const expressions.
|
/// Parses inline const expressions.
|
||||||
fn parse_const_block(&mut self, span: Span) -> PResult<'a, P<Expr>> {
|
fn parse_const_block(&mut self, span: Span, pat: bool) -> PResult<'a, P<Expr>> {
|
||||||
self.sess.gated_spans.gate(sym::inline_const, span);
|
if pat {
|
||||||
|
self.sess.gated_spans.gate(sym::inline_const_pat, span);
|
||||||
|
} else {
|
||||||
|
self.sess.gated_spans.gate(sym::inline_const, span);
|
||||||
|
}
|
||||||
self.eat_keyword(kw::Const);
|
self.eat_keyword(kw::Const);
|
||||||
let blk = self.parse_block()?;
|
let blk = self.parse_block()?;
|
||||||
let anon_const = AnonConst {
|
let anon_const = AnonConst {
|
||||||
|
@ -437,7 +437,7 @@ impl<'a> Parser<'a> {
|
|||||||
PatKind::Box(pat)
|
PatKind::Box(pat)
|
||||||
} else if self.check_inline_const(0) {
|
} else if self.check_inline_const(0) {
|
||||||
// Parse `const pat`
|
// Parse `const pat`
|
||||||
let const_expr = self.parse_const_block(lo.to(self.token.span))?;
|
let const_expr = self.parse_const_block(lo.to(self.token.span), true)?;
|
||||||
|
|
||||||
if let Some(re) = self.parse_range_end() {
|
if let Some(re) = self.parse_range_end() {
|
||||||
self.parse_pat_range_begin_with(const_expr, re)?
|
self.parse_pat_range_begin_with(const_expr, re)?
|
||||||
@ -884,7 +884,7 @@ impl<'a> Parser<'a> {
|
|||||||
|
|
||||||
fn parse_pat_range_end(&mut self) -> PResult<'a, P<Expr>> {
|
fn parse_pat_range_end(&mut self) -> PResult<'a, P<Expr>> {
|
||||||
if self.check_inline_const(0) {
|
if self.check_inline_const(0) {
|
||||||
self.parse_const_block(self.token.span)
|
self.parse_const_block(self.token.span, true)
|
||||||
} else if self.check_path() {
|
} else if self.check_path() {
|
||||||
let lo = self.token.span;
|
let lo = self.token.span;
|
||||||
let (qself, path) = if self.eat_lt() {
|
let (qself, path) = if self.eat_lt() {
|
||||||
|
@ -731,6 +731,7 @@ symbols! {
|
|||||||
inlateout,
|
inlateout,
|
||||||
inline,
|
inline,
|
||||||
inline_const,
|
inline_const,
|
||||||
|
inline_const_pat,
|
||||||
inout,
|
inout,
|
||||||
instruction_set,
|
instruction_set,
|
||||||
intel,
|
intel,
|
||||||
|
@ -0,0 +1,24 @@
|
|||||||
|
# `inline_const_pat`
|
||||||
|
|
||||||
|
The tracking issue for this feature is: [#76001]
|
||||||
|
|
||||||
|
See also [`inline_const`](inline-const.md)
|
||||||
|
|
||||||
|
------
|
||||||
|
|
||||||
|
This feature allows you to use inline constant expressions in pattern position:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
#![feature(inline_const_pat)]
|
||||||
|
|
||||||
|
const fn one() -> i32 { 1 }
|
||||||
|
|
||||||
|
let some_int = 3;
|
||||||
|
match some_int {
|
||||||
|
const { 1 + 2 } => println!("Matched 1 + 2"),
|
||||||
|
const { one() } => println!("Matched const fn returning 1"),
|
||||||
|
_ => println!("Didn't match anything :("),
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
[#76001]: https://github.com/rust-lang/rust/issues/76001
|
@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
The tracking issue for this feature is: [#76001]
|
The tracking issue for this feature is: [#76001]
|
||||||
|
|
||||||
|
See also [`inline_const_pat`](inline-const-pat.md)
|
||||||
|
|
||||||
------
|
------
|
||||||
|
|
||||||
This feature allows you to use inline constant expressions. For example, you can
|
This feature allows you to use inline constant expressions. For example, you can
|
||||||
@ -27,19 +29,4 @@ fn main() {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
You can also use inline constant expressions in patterns:
|
|
||||||
|
|
||||||
```rust
|
|
||||||
#![feature(inline_const)]
|
|
||||||
|
|
||||||
const fn one() -> i32 { 1 }
|
|
||||||
|
|
||||||
let some_int = 3;
|
|
||||||
match some_int {
|
|
||||||
const { 1 + 2 } => println!("Matched 1 + 2"),
|
|
||||||
const { one() } => println!("Matched const fn returning 1"),
|
|
||||||
_ => println!("Didn't match anything :("),
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
[#76001]: https://github.com/rust-lang/rust/issues/76001
|
[#76001]: https://github.com/rust-lang/rust/issues/76001
|
||||||
|
@ -0,0 +1,4 @@
|
|||||||
|
fn main() {
|
||||||
|
let const { () } = ();
|
||||||
|
//~^ ERROR inline-const in pattern position is experimental [E0658]
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
error[E0658]: inline-const in pattern position is experimental
|
||||||
|
--> $DIR/feature-gate-inline_const_pat.rs:2:9
|
||||||
|
|
|
||||||
|
LL | let const { () } = ();
|
||||||
|
| ^^^^^
|
||||||
|
|
|
||||||
|
= note: see issue #76001 <https://github.com/rust-lang/rust/issues/76001> for more information
|
||||||
|
= help: add `#![feature(inline_const_pat)]` to the crate attributes to enable
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0658`.
|
@ -2,7 +2,7 @@
|
|||||||
#![allow(incomplete_features)]
|
#![allow(incomplete_features)]
|
||||||
#![feature(exclusive_range_pattern)]
|
#![feature(exclusive_range_pattern)]
|
||||||
#![feature(half_open_range_patterns)]
|
#![feature(half_open_range_patterns)]
|
||||||
#![feature(inline_const)]
|
#![feature(inline_const_pat)]
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let mut if_lettable = vec![];
|
let mut if_lettable = vec![];
|
||||||
|
@ -12,7 +12,7 @@ fn main() {
|
|||||||
y @ (0..5 | 6) => or_two.push(y),
|
y @ (0..5 | 6) => or_two.push(y),
|
||||||
//~^ exclusive range pattern syntax is experimental
|
//~^ exclusive range pattern syntax is experimental
|
||||||
y @ 0..const { 5 + 1 } => assert_eq!(y, 5),
|
y @ 0..const { 5 + 1 } => assert_eq!(y, 5),
|
||||||
//~^ inline-const is experimental
|
//~^ inline-const in pattern position is experimental
|
||||||
//~| exclusive range pattern syntax is experimental
|
//~| exclusive range pattern syntax is experimental
|
||||||
y @ -5.. => range_from.push(y),
|
y @ -5.. => range_from.push(y),
|
||||||
y @ ..-7 => assert_eq!(y, -8),
|
y @ ..-7 => assert_eq!(y, -8),
|
||||||
|
@ -7,14 +7,14 @@ LL | y @ ..-7 => assert_eq!(y, -8),
|
|||||||
= note: see issue #67264 <https://github.com/rust-lang/rust/issues/67264> for more information
|
= note: see issue #67264 <https://github.com/rust-lang/rust/issues/67264> for more information
|
||||||
= help: add `#![feature(half_open_range_patterns)]` to the crate attributes to enable
|
= help: add `#![feature(half_open_range_patterns)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0658]: inline-const is experimental
|
error[E0658]: inline-const in pattern position is experimental
|
||||||
--> $DIR/range_pat_interactions3.rs:14:20
|
--> $DIR/range_pat_interactions3.rs:14:20
|
||||||
|
|
|
|
||||||
LL | y @ 0..const { 5 + 1 } => assert_eq!(y, 5),
|
LL | y @ 0..const { 5 + 1 } => assert_eq!(y, 5),
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
|
|
|
|
||||||
= note: see issue #76001 <https://github.com/rust-lang/rust/issues/76001> for more information
|
= note: see issue #76001 <https://github.com/rust-lang/rust/issues/76001> for more information
|
||||||
= help: add `#![feature(inline_const)]` to the crate attributes to enable
|
= help: add `#![feature(inline_const_pat)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0658]: exclusive range pattern syntax is experimental
|
error[E0658]: exclusive range pattern syntax is experimental
|
||||||
--> $DIR/range_pat_interactions3.rs:10:17
|
--> $DIR/range_pat_interactions3.rs:10:17
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#![allow(incomplete_features)]
|
#![allow(incomplete_features)]
|
||||||
#![feature(inline_const)]
|
#![feature(inline_const_pat)]
|
||||||
|
|
||||||
// rust-lang/rust#82518: ICE with inline-const in match referencing const-generic parameter
|
// rust-lang/rust#82518: ICE with inline-const in match referencing const-generic parameter
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// check-pass
|
// check-pass
|
||||||
|
|
||||||
#![feature(inline_const)]
|
#![feature(inline_const_pat)]
|
||||||
#![allow(incomplete_features)]
|
#![allow(incomplete_features)]
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#![allow(incomplete_features)]
|
#![allow(incomplete_features)]
|
||||||
#![feature(const_mut_refs)]
|
#![feature(const_mut_refs)]
|
||||||
#![feature(inline_const)]
|
#![feature(inline_const_pat)]
|
||||||
|
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#![allow(incomplete_features)]
|
#![allow(incomplete_features)]
|
||||||
#![feature(const_mut_refs)]
|
#![feature(const_mut_refs)]
|
||||||
#![feature(inline_const)]
|
#![feature(inline_const)]
|
||||||
|
#![feature(inline_const_pat)]
|
||||||
|
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// build-pass
|
// build-pass
|
||||||
|
|
||||||
#![allow(incomplete_features)]
|
#![allow(incomplete_features)]
|
||||||
#![feature(inline_const, half_open_range_patterns, exclusive_range_pattern)]
|
#![feature(inline_const_pat, half_open_range_patterns, exclusive_range_pattern)]
|
||||||
fn main() {
|
fn main() {
|
||||||
const N: u32 = 10;
|
const N: u32 = 10;
|
||||||
let x: u32 = 3;
|
let x: u32 = 3;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// run-pass
|
// run-pass
|
||||||
|
|
||||||
#![allow(incomplete_features)]
|
#![allow(incomplete_features)]
|
||||||
#![feature(inline_const)]
|
#![feature(inline_const_pat)]
|
||||||
const MMIO_BIT1: u8 = 4;
|
const MMIO_BIT1: u8 = 4;
|
||||||
const MMIO_BIT2: u8 = 5;
|
const MMIO_BIT2: u8 = 5;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
// check-pass
|
// check-pass
|
||||||
#![feature(inline_const)]
|
#![feature(inline_const_pat)]
|
||||||
#![allow(incomplete_features)]
|
#![allow(incomplete_features)]
|
||||||
#![deny(dead_code)]
|
#![deny(dead_code)]
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#![allow(incomplete_features)]
|
#![allow(incomplete_features)]
|
||||||
#![allow(unreachable_code)]
|
#![allow(unreachable_code)]
|
||||||
#![feature(const_async_blocks)]
|
#![feature(const_async_blocks)]
|
||||||
#![feature(inline_const)]
|
#![feature(inline_const_pat)]
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
match loop {} {
|
match loop {} {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user