Skip to content

Commit 561483e

Browse files
committed
stabilize top level or-pats in if/while let.
1 parent b439861 commit 561483e

File tree

6 files changed

+18
-44
lines changed

6 files changed

+18
-44
lines changed

src/librustc_mir/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ Rust MIR: a lowered representation of Rust. Also: an experiment!
2424
#![feature(unicode_internals)]
2525
#![feature(step_trait)]
2626
#![feature(slice_concat_ext)]
27-
#![feature(if_while_or_patterns)]
27+
#![cfg_attr(stage0, feature(if_while_or_patterns))]
2828
#![feature(try_from)]
2929
#![feature(reverse_bits)]
3030
#![cfg_attr(stage0, feature(underscore_imports))]

src/libsyntax/feature_gate.rs

+2-9
Original file line numberDiff line numberDiff line change
@@ -384,9 +384,6 @@ declare_features! (
384384
// Infer static outlives requirements (RFC 2093).
385385
(active, infer_static_outlives_requirements, "1.26.0", Some(54185), None),
386386

387-
// Multiple patterns with `|` in `if let` and `while let`.
388-
(active, if_while_or_patterns, "1.26.0", Some(48215), None),
389-
390387
// Allows macro invocations in `extern {}` blocks.
391388
(active, macros_in_extern, "1.27.0", Some(49476), None),
392389

@@ -688,6 +685,8 @@ declare_features! (
688685
(accepted, min_const_unsafe_fn, "1.33.0", Some(55607), None),
689686
// `#[cfg_attr(predicate, multiple, attributes, here)]`
690687
(accepted, cfg_attr_multi, "1.33.0", Some(54881), None),
688+
// Top level or-patterns (`p | q`) in `if let` and `while let`.
689+
(accepted, if_while_or_patterns, "1.33.0", Some(48215), None),
691690
);
692691

693692
// If you change this, please modify `src/doc/unstable-book` as well. You must
@@ -1701,12 +1700,6 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
17011700
ast::ExprKind::TryBlock(_) => {
17021701
gate_feature_post!(&self, try_blocks, e.span, "`try` expression is experimental");
17031702
}
1704-
ast::ExprKind::IfLet(ref pats, ..) | ast::ExprKind::WhileLet(ref pats, ..) => {
1705-
if pats.len() > 1 {
1706-
gate_feature_post!(&self, if_while_or_patterns, e.span,
1707-
"multiple patterns in `if let` and `while let` are unstable");
1708-
}
1709-
}
17101703
ast::ExprKind::Block(_, opt_label) => {
17111704
if let Some(label) = opt_label {
17121705
gate_feature_post!(&self, label_break_value, label.ident.span,

src/libsyntax/parse/parser.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -3660,8 +3660,6 @@ impl<'a> Parser<'a> {
36603660
maybe_whole!(self, NtArm, |x| x);
36613661

36623662
let attrs = self.parse_outer_attributes()?;
3663-
// Allow a '|' before the pats (RFC 1925)
3664-
self.eat(&token::BinOp(token::Or));
36653663
let pats = self.parse_pats()?;
36663664
let guard = if self.eat_keyword(keywords::If) {
36673665
Some(Guard::If(self.parse_expr()?))
@@ -3768,6 +3766,9 @@ impl<'a> Parser<'a> {
37683766

37693767
/// Parse patterns, separated by '|' s
37703768
fn parse_pats(&mut self) -> PResult<'a, Vec<P<Pat>>> {
3769+
// Allow a '|' before the pats (RFC 1925 + RFC 2530)
3770+
self.eat(&token::BinOp(token::Or));
3771+
37713772
let mut pats = Vec::new();
37723773
loop {
37733774
pats.push(self.parse_top_level_pat()?);

src/test/run-pass/rfcs/rfc-2175-or-if-while-let/basic.rs

+12-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
// run-pass
22
#![allow(dead_code)]
3-
#![feature(if_while_or_patterns)]
43

54
enum E {
65
V(u8),
@@ -19,4 +18,16 @@ fn main() {
1918
assert_eq!(x, 10);
2019
e = W;
2120
}
21+
22+
// Accept leading `|`:
23+
24+
let mut e = V(10);
25+
26+
if let | V(x) | U(x) = e {
27+
assert_eq!(x, 10);
28+
}
29+
while let | V(x) | U(x) = e {
30+
assert_eq!(x, 10);
31+
e = W;
32+
}
2233
}

src/test/ui/feature-gates/feature-gate-if_while_or_patterns.rs

-8
This file was deleted.

src/test/ui/feature-gates/feature-gate-if_while_or_patterns.stderr

-23
This file was deleted.

0 commit comments

Comments
 (0)