未验证 提交 1439c2ac 编写于 作者: K kennytm 提交者: GitHub

Rollup merge of #47947 - goodmanjonathan:stabilize_match_beginning_vert, r=petrochenkov

Stabilize feature(match_beginning_vert)

With this feature stabilized, match expressions can optionally have a `|` at the beginning of each arm.

Reference PR: rust-lang-nursery/reference#231

Closes #44101
# `match_beginning_vert`
The tracking issue for this feature is [#44101].
With this feature enabled, you are allowed to add a '|' to the beginning of a
match arm:
```rust
#![feature(match_beginning_vert)]
enum Foo { A, B, C }
fn main() {
let x = Foo::A;
match x {
| Foo::A
| Foo::B => println!("AB"),
| Foo::C => println!("C"),
}
}
```
[#44101]: https://github.com/rust-lang/rust/issues/44101
\ No newline at end of file
......@@ -883,7 +883,6 @@ pub struct Arm {
pub pats: Vec<P<Pat>>,
pub guard: Option<P<Expr>>,
pub body: P<Expr>,
pub beginning_vert: Option<Span>, // For RFC 1925 feature gate
}
#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)]
......
......@@ -883,7 +883,6 @@ fn arm(&self, _span: Span, pats: Vec<P<ast::Pat>>, expr: P<ast::Expr>) -> ast::A
pats,
guard: None,
body: expr,
beginning_vert: None,
}
}
......
......@@ -386,9 +386,6 @@ pub fn new() -> Features {
// allow `#[must_use]` on functions and comparison operators (RFC 1940)
(active, fn_must_use, "1.21.0", Some(43302)),
// allow '|' at beginning of match arms (RFC 1925)
(active, match_beginning_vert, "1.21.0", Some(44101)),
// Future-proofing enums/structs with #[non_exhaustive] attribute (RFC 2008)
(active, non_exhaustive, "1.22.0", Some(44109)),
......@@ -545,6 +542,8 @@ pub fn new() -> Features {
(accepted, abi_sysv64, "1.24.0", Some(36167)),
// Allows `repr(align(16))` struct attribute (RFC 1358)
(accepted, repr_align, "1.24.0", Some(33626)),
// allow '|' at beginning of match arms (RFC 1925)
(accepted, match_beginning_vert, "1.25.0", Some(44101)),
);
// If you change this, please modify src/doc/unstable-book as well. You must
......@@ -1683,11 +1682,6 @@ fn visit_expr(&mut self, e: &'a ast::Expr) {
}
fn visit_arm(&mut self, arm: &'a ast::Arm) {
if let Some(span) = arm.beginning_vert {
gate_feature_post!(&self, match_beginning_vert,
span,
"Use of a '|' at the beginning of a match arm is experimental")
}
visit::walk_arm(self, arm)
}
......
......@@ -340,14 +340,13 @@ pub fn fold_thin_attrs<T: Folder>(attrs: ThinVec<Attribute>, fld: &mut T) -> Thi
fold_attrs(attrs.into(), fld).into()
}
pub fn noop_fold_arm<T: Folder>(Arm {attrs, pats, guard, body, beginning_vert}: Arm,
pub fn noop_fold_arm<T: Folder>(Arm {attrs, pats, guard, body}: Arm,
fld: &mut T) -> Arm {
Arm {
attrs: fold_attrs(attrs, fld),
pats: pats.move_map(|x| fld.fold_pat(x)),
guard: guard.map(|x| fld.fold_expr(x)),
body: fld.fold_expr(body),
beginning_vert,
}
}
......
......@@ -3398,11 +3398,7 @@ pub fn parse_arm(&mut self) -> PResult<'a, Arm> {
let attrs = self.parse_outer_attributes()?;
// Allow a '|' before the pats (RFC 1925)
let beginning_vert = if self.eat(&token::BinOp(token::Or)) {
Some(self.prev_span)
} else {
None
};
self.eat(&token::BinOp(token::Or));
let pats = self.parse_pats()?;
let guard = if self.eat_keyword(keywords::If) {
Some(self.parse_expr()?)
......@@ -3426,7 +3422,6 @@ pub fn parse_arm(&mut self) -> PResult<'a, Arm> {
pats,
guard,
body: expr,
beginning_vert,
})
}
......
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
......@@ -8,7 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#[allow(dead_code)]
enum Foo {
A,
B,
......@@ -19,18 +18,11 @@ enum Foo {
use Foo::*;
fn main() {
let x = Foo::A;
match x {
| A => println!("A"),
//~^ ERROR: Use of a '|' at the beginning of a match arm is experimental (see issue #44101)
| B | C => println!("BC!"),
//~^ ERROR: Use of a '|' at the beginning of a match arm is experimental (see issue #44101)
| _ => {},
//~^ ERROR: Use of a '|' at the beginning of a match arm is experimental (see issue #44101)
};
match x {
A | B | C => println!("ABC!"),
_ => {},
};
for foo in &[A, B, C, D, E] {
match *foo {
| A => println!("A"),
| B | C if 1 < 2 => println!("BC!"),
| _ => {},
}
}
}
error[E0658]: Use of a '|' at the beginning of a match arm is experimental (see issue #44101)
--> $DIR/feature-gate-match_beginning_vert.rs:24:9
|
24 | | A => println!("A"),
| ^
|
= help: add #![feature(match_beginning_vert)] to the crate attributes to enable
error[E0658]: Use of a '|' at the beginning of a match arm is experimental (see issue #44101)
--> $DIR/feature-gate-match_beginning_vert.rs:26:9
|
26 | | B | C => println!("BC!"),
| ^
|
= help: add #![feature(match_beginning_vert)] to the crate attributes to enable
error[E0658]: Use of a '|' at the beginning of a match arm is experimental (see issue #44101)
--> $DIR/feature-gate-match_beginning_vert.rs:28:9
|
28 | | _ => {},
| ^
|
= help: add #![feature(match_beginning_vert)] to the crate attributes to enable
error: aborting due to 3 previous errors
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册