stabilize match_beginning_vert

This commit is contained in:
Jonathan Goodman 2018-01-30 14:56:02 -06:00
parent def3269a71
commit a99b5db56a
9 changed files with 32 additions and 103 deletions

View file

@ -1,23 +0,0 @@
# `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

View 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)]

View file

@ -883,7 +883,6 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
pats,
guard: None,
body: expr,
beginning_vert: None,
}
}

View file

@ -386,9 +386,6 @@ declare_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 @@ declare_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
@ -1678,11 +1677,6 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
}
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)
}

View file

@ -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,
}
}

View file

@ -3398,11 +3398,7 @@ impl<'a> Parser<'a> {
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 @@ impl<'a> Parser<'a> {
pats,
guard,
body: expr,
beginning_vert,
})
}

View file

@ -0,0 +1,28 @@
// 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.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
enum Foo {
A,
B,
C,
D,
E,
}
use Foo::*;
fn main() {
for foo in &[A, B, C, D, E] {
match *foo {
| A => println!("A"),
| B | C if 1 < 2 => println!("BC!"),
| _ => {},
}
}
}

View file

@ -1,36 +0,0 @@
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#[allow(dead_code)]
enum Foo {
A,
B,
C,
D,
E,
}
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!"),
_ => {},
};
}

View file

@ -1,26 +0,0 @@
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