about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2017-09-02 22:22:54 +0000
committerbors <bors@rust-lang.org>2017-09-02 22:22:54 +0000
commit6f667301e22a665b0bf5587ef508da7e01c496c8 (patch)
tree835000191cc3ba3a24285b8c16c3334eac944254 /src/libsyntax
parent744dd6c1d5db522d5d3b7f2bb82abde5dc41cbeb (diff)
parent22ca03bde660e9bca0fbf23b5ab228441d39ab6f (diff)
downloadrust-6f667301e22a665b0bf5587ef508da7e01c496c8.tar.gz
rust-6f667301e22a665b0bf5587ef508da7e01c496c8.zip
Auto merge of #44108 - mattico:match-pipe, r=petrochenkov
Implement RFC 1925

cc #44101
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/ast.rs1
-rw-r--r--src/libsyntax/ext/build.rs3
-rw-r--r--src/libsyntax/feature_gate.rs12
-rw-r--r--src/libsyntax/fold.rs4
-rw-r--r--src/libsyntax/parse/parser.rs7
5 files changed, 25 insertions, 2 deletions
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs
index 925178f8639..720f6cd32bd 100644
--- a/src/libsyntax/ast.rs
+++ b/src/libsyntax/ast.rs
@@ -810,6 +810,7 @@ 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)]
diff --git a/src/libsyntax/ext/build.rs b/src/libsyntax/ext/build.rs
index 66df734b328..48d789372a0 100644
--- a/src/libsyntax/ext/build.rs
+++ b/src/libsyntax/ext/build.rs
@@ -878,7 +878,8 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
             attrs: vec![],
             pats,
             guard: None,
-            body: expr
+            body: expr,
+            beginning_vert: None,
         }
     }
 
diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs
index 8251b03632a..54d41a030fd 100644
--- a/src/libsyntax/feature_gate.rs
+++ b/src/libsyntax/feature_gate.rs
@@ -379,6 +379,9 @@ declare_features! (
 
     // allow `#[must_use]` on functions (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)),
 );
 
 declare_features! (
@@ -1435,6 +1438,15 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
         visit::walk_expr(self, e);
     }
 
+    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)
+    }
+
     fn visit_pat(&mut self, pattern: &'a ast::Pat) {
         match pattern.node {
             PatKind::Slice(_, Some(_), ref last) if !last.is_empty() => {
diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs
index d9f453a93ad..03c47b71d02 100644
--- a/src/libsyntax/fold.rs
+++ b/src/libsyntax/fold.rs
@@ -344,12 +344,14 @@ 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}: Arm, fld: &mut T) -> Arm {
+pub fn noop_fold_arm<T: Folder>(Arm {attrs, pats, guard, body, beginning_vert}: 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,
     }
 }
 
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index d08373334f1..1f033b25fe4 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -3155,6 +3155,12 @@ impl<'a> Parser<'a> {
         maybe_whole!(self, NtArm, |x| x);
 
         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
+        };
         let pats = self.parse_pats()?;
         let guard = if self.eat_keyword(keywords::If) {
             Some(self.parse_expr()?)
@@ -3178,6 +3184,7 @@ impl<'a> Parser<'a> {
             pats,
             guard,
             body: expr,
+            beginning_vert,
         })
     }