about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2019-01-12 08:40:17 +0000
committerbors <bors@rust-lang.org>2019-01-12 08:40:17 +0000
commit1190f7cdf7a62e25c9a8eaf58e0906849692bf2b (patch)
treeded178d6a40bf214117f545d8c3f614b6b438d56
parent0c91f3d97fe78d31c8cf3abb1858c65d73c6aa17 (diff)
parent561483e4e84405f832ada8f9435cd8c471139afb (diff)
downloadrust-1190f7cdf7a62e25c9a8eaf58e0906849692bf2b.tar.gz
rust-1190f7cdf7a62e25c9a8eaf58e0906849692bf2b.zip
Auto merge of #57532 - Centril:stabilize-2175, r=varkor
Stabilize #![feature(if_while_or_patterns)]

r? @varkor

Per https://github.com/rust-lang/rust/issues/56212#issue-384085857.
Leading `|` is also accepted per the comment in the stabilization proposal.
-rw-r--r--src/librustc_mir/lib.rs2
-rw-r--r--src/libsyntax/feature_gate.rs11
-rw-r--r--src/libsyntax/parse/parser.rs5
-rw-r--r--src/test/run-pass/rfcs/rfc-2175-or-if-while-let/basic.rs13
-rw-r--r--src/test/ui/feature-gates/feature-gate-if_while_or_patterns.rs8
-rw-r--r--src/test/ui/feature-gates/feature-gate-if_while_or_patterns.stderr23
6 files changed, 18 insertions, 44 deletions
diff --git a/src/librustc_mir/lib.rs b/src/librustc_mir/lib.rs
index 4735ebae9d4..9395da60b38 100644
--- a/src/librustc_mir/lib.rs
+++ b/src/librustc_mir/lib.rs
@@ -24,7 +24,7 @@ Rust MIR: a lowered representation of Rust. Also: an experiment!
 #![feature(unicode_internals)]
 #![feature(step_trait)]
 #![feature(slice_concat_ext)]
-#![feature(if_while_or_patterns)]
+#![cfg_attr(stage0, feature(if_while_or_patterns))]
 #![feature(try_from)]
 #![feature(reverse_bits)]
 #![cfg_attr(stage0, feature(underscore_imports))]
diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs
index cddec3eb23a..45b3ba604c6 100644
--- a/src/libsyntax/feature_gate.rs
+++ b/src/libsyntax/feature_gate.rs
@@ -384,9 +384,6 @@ declare_features! (
     // Infer static outlives requirements (RFC 2093).
     (active, infer_static_outlives_requirements, "1.26.0", Some(54185), None),
 
-    // Multiple patterns with `|` in `if let` and `while let`.
-    (active, if_while_or_patterns, "1.26.0", Some(48215), None),
-
     // Allows macro invocations in `extern {}` blocks.
     (active, macros_in_extern, "1.27.0", Some(49476), None),
 
@@ -688,6 +685,8 @@ declare_features! (
     (accepted, min_const_unsafe_fn, "1.33.0", Some(55607), None),
     // `#[cfg_attr(predicate, multiple, attributes, here)]`
     (accepted, cfg_attr_multi, "1.33.0", Some(54881), None),
+    // Top level or-patterns (`p | q`) in `if let` and `while let`.
+    (accepted, if_while_or_patterns, "1.33.0", Some(48215), None),
 );
 
 // 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> {
             ast::ExprKind::TryBlock(_) => {
                 gate_feature_post!(&self, try_blocks, e.span, "`try` expression is experimental");
             }
-            ast::ExprKind::IfLet(ref pats, ..) | ast::ExprKind::WhileLet(ref pats, ..) => {
-                if pats.len() > 1 {
-                    gate_feature_post!(&self, if_while_or_patterns, e.span,
-                                    "multiple patterns in `if let` and `while let` are unstable");
-                }
-            }
             ast::ExprKind::Block(_, opt_label) => {
                 if let Some(label) = opt_label {
                     gate_feature_post!(&self, label_break_value, label.ident.span,
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 1e4a26b3537..b90eeaca54b 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -3660,8 +3660,6 @@ impl<'a> Parser<'a> {
         maybe_whole!(self, NtArm, |x| x);
 
         let attrs = self.parse_outer_attributes()?;
-        // Allow a '|' before the pats (RFC 1925)
-        self.eat(&token::BinOp(token::Or));
         let pats = self.parse_pats()?;
         let guard = if self.eat_keyword(keywords::If) {
             Some(Guard::If(self.parse_expr()?))
@@ -3768,6 +3766,9 @@ impl<'a> Parser<'a> {
 
     /// Parse patterns, separated by '|' s
     fn parse_pats(&mut self) -> PResult<'a, Vec<P<Pat>>> {
+        // Allow a '|' before the pats (RFC 1925 + RFC 2530)
+        self.eat(&token::BinOp(token::Or));
+
         let mut pats = Vec::new();
         loop {
             pats.push(self.parse_top_level_pat()?);
diff --git a/src/test/run-pass/rfcs/rfc-2175-or-if-while-let/basic.rs b/src/test/run-pass/rfcs/rfc-2175-or-if-while-let/basic.rs
index f9bd2f471ae..22f04c58f3b 100644
--- a/src/test/run-pass/rfcs/rfc-2175-or-if-while-let/basic.rs
+++ b/src/test/run-pass/rfcs/rfc-2175-or-if-while-let/basic.rs
@@ -1,6 +1,5 @@
 // run-pass
 #![allow(dead_code)]
-#![feature(if_while_or_patterns)]
 
 enum E {
     V(u8),
@@ -19,4 +18,16 @@ fn main() {
         assert_eq!(x, 10);
         e = W;
     }
+
+    // Accept leading `|`:
+
+    let mut e = V(10);
+
+    if let | V(x) | U(x) = e {
+        assert_eq!(x, 10);
+    }
+    while let | V(x) | U(x) = e {
+        assert_eq!(x, 10);
+        e = W;
+    }
 }
diff --git a/src/test/ui/feature-gates/feature-gate-if_while_or_patterns.rs b/src/test/ui/feature-gates/feature-gate-if_while_or_patterns.rs
deleted file mode 100644
index 233185f92e3..00000000000
--- a/src/test/ui/feature-gates/feature-gate-if_while_or_patterns.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-fn main() {
-    if let 0 | 1 = 0 { //~ ERROR multiple patterns in `if let` and `while let` are unstable
-        ;
-    }
-    while let 0 | 1 = 1 { //~ ERROR multiple patterns in `if let` and `while let` are unstable
-        break;
-    }
-}
diff --git a/src/test/ui/feature-gates/feature-gate-if_while_or_patterns.stderr b/src/test/ui/feature-gates/feature-gate-if_while_or_patterns.stderr
deleted file mode 100644
index ff991819a92..00000000000
--- a/src/test/ui/feature-gates/feature-gate-if_while_or_patterns.stderr
+++ /dev/null
@@ -1,23 +0,0 @@
-error[E0658]: multiple patterns in `if let` and `while let` are unstable (see issue #48215)
-  --> $DIR/feature-gate-if_while_or_patterns.rs:2:5
-   |
-LL | /     if let 0 | 1 = 0 { //~ ERROR multiple patterns in `if let` and `while let` are unstable
-LL | |         ;
-LL | |     }
-   | |_____^
-   |
-   = help: add #![feature(if_while_or_patterns)] to the crate attributes to enable
-
-error[E0658]: multiple patterns in `if let` and `while let` are unstable (see issue #48215)
-  --> $DIR/feature-gate-if_while_or_patterns.rs:5:5
-   |
-LL | /     while let 0 | 1 = 1 { //~ ERROR multiple patterns in `if let` and `while let` are unstable
-LL | |         break;
-LL | |     }
-   | |_____^
-   |
-   = help: add #![feature(if_while_or_patterns)] to the crate attributes to enable
-
-error: aborting due to 2 previous errors
-
-For more information about this error, try `rustc --explain E0658`.