]> git.lizzy.rs Git - rust.git/commitdiff
pre-expansion gate exclusive_range_pattern
authorMazdak Farrokhzad <twingoow@gmail.com>
Sat, 21 Sep 2019 18:11:00 +0000 (20:11 +0200)
committerMazdak Farrokhzad <twingoow@gmail.com>
Wed, 23 Oct 2019 22:32:03 +0000 (00:32 +0200)
src/libsyntax/feature_gate/check.rs
src/libsyntax/parse/parser/pat.rs
src/libsyntax/sess.rs
src/test/ui/feature-gates/feature-gate-exclusive-range-pattern.rs
src/test/ui/feature-gates/feature-gate-exclusive-range-pattern.stderr
src/test/ui/parser/pat-tuple-4.rs
src/test/ui/parser/pat-tuple-4.stderr
src/test/ui/parser/pat-tuple-5.stderr

index 7c4668122a4c2e6b219ff917b647739513a7d7df..0b4289b139fc15eeaf0c1600da604703554a8703 100644 (file)
@@ -3,9 +3,8 @@
 use super::removed::{REMOVED_FEATURES, STABLE_REMOVED_FEATURES};
 use super::builtin_attrs::{AttributeGate, BUILTIN_ATTRIBUTE_MAP};
 
-use crate::ast::{self, NodeId, PatKind, RangeEnd, VariantData};
+use crate::ast::{self, NodeId, PatKind, VariantData};
 use crate::attr::{self, check_builtin_attribute};
-use crate::source_map::Spanned;
 use crate::edition::{ALL_EDITIONS, Edition};
 use crate::visit::{self, FnKind, Visitor};
 use crate::parse::token;
@@ -529,10 +528,6 @@ fn visit_pat(&mut self, pattern: &'a ast::Pat) {
                     }
                 }
             }
-            PatKind::Range(_, _, Spanned { node: RangeEnd::Excluded, .. }) => {
-                gate_feature_post!(&self, exclusive_range_pattern, pattern.span,
-                                   "exclusive range pattern syntax is experimental");
-            }
             _ => {}
         }
         visit::walk_pat(self, pattern)
@@ -815,6 +810,7 @@ macro_rules! gate_all {
     gate_all!(const_generics, "const generics are unstable");
     gate_all!(decl_macro, "`macro` is experimental");
     gate_all!(box_patterns, "box pattern syntax is experimental");
+    gate_all!(exclusive_range_pattern, "exclusive range pattern syntax is experimental");
 
     visit::walk_crate(&mut visitor, krate);
 }
index 5374671d4b895f10c843a38d27f26a8372415af0..969d5dd8374805668d010553aa47cccd627101d7 100644 (file)
@@ -611,6 +611,11 @@ fn parse_pat_mac_invoc(&mut self, lo: Span, path: Path) -> PResult<'a, PatKind>
         Ok(PatKind::Mac(mac))
     }
 
+    fn excluded_range_end(&self, span: Span) -> RangeEnd {
+        self.sess.gated_spans.exclusive_range_pattern.borrow_mut().push(span);
+        RangeEnd::Excluded
+    }
+
     /// Parse a range pattern `$path $form $end?` where `$form = ".." | "..." | "..=" ;`.
     /// The `$path` has already been parsed and the next token is the `$form`.
     fn parse_pat_range_starting_with_path(
@@ -620,7 +625,7 @@ fn parse_pat_range_starting_with_path(
         path: Path
     ) -> PResult<'a, PatKind> {
         let (end_kind, form) = match self.token.kind {
-            token::DotDot => (RangeEnd::Excluded, ".."),
+            token::DotDot => (self.excluded_range_end(self.token.span), ".."),
             token::DotDotDot => (RangeEnd::Included(RangeSyntax::DotDotDot), "..."),
             token::DotDotEq => (RangeEnd::Included(RangeSyntax::DotDotEq), "..="),
             _ => panic!("can only parse `..`/`...`/`..=` for ranges (checked above)"),
@@ -643,7 +648,7 @@ fn parse_pat_range_starting_with_lit(&mut self, begin: P<Expr>) -> PResult<'a, P
         } else if self.eat(&token::DotDotEq) {
             (RangeEnd::Included(RangeSyntax::DotDotEq), "..=")
         } else if self.eat(&token::DotDot) {
-            (RangeEnd::Excluded, "..")
+            (self.excluded_range_end(op_span), "..")
         } else {
             panic!("impossible case: we already matched on a range-operator token")
         };
index c8e60be1db948fb484e6e79524d37f42dbf29742..09331924c60216b0d66417be132171d9f0ad9430 100644 (file)
@@ -42,6 +42,8 @@
     pub decl_macro: Lock<Vec<Span>>,
     /// Spans collected for gating `box_patterns`, e.g. `box 0`.
     pub box_patterns: Lock<Vec<Span>>,
+    /// Spans collected for gating `exclusive_range_pattern`, e.g. `0..2`.
+    pub exclusive_range_pattern: Lock<Vec<Span>>,
 }
 
 /// Info about a parsing session.
index ded08b93fe81c525cfa71480c39364fbe8cc84e6..594ec73fe26f7954948392b138944aa7852e3133 100644 (file)
@@ -1,6 +1,10 @@
-pub fn main() {
+#[cfg(FALSE)]
+fn foo() {
     match 22 {
         0 .. 3 => {} //~ ERROR exclusive range pattern syntax is experimental
+        PATH .. 3 => {} //~ ERROR exclusive range pattern syntax is experimental
         _ => {}
     }
 }
+
+fn main() {}
index ee20408d1781f2262f192e3d0cfa8afbea4cbc18..075fdbed90d6c7b0c6ae58824c8591a5a28e47f6 100644 (file)
@@ -1,12 +1,21 @@
 error[E0658]: exclusive range pattern syntax is experimental
-  --> $DIR/feature-gate-exclusive-range-pattern.rs:3:9
+  --> $DIR/feature-gate-exclusive-range-pattern.rs:4:11
    |
 LL |         0 .. 3 => {}
-   |         ^^^^^^
+   |           ^^
    |
    = note: for more information, see https://github.com/rust-lang/rust/issues/37854
    = help: add `#![feature(exclusive_range_pattern)]` to the crate attributes to enable
 
-error: aborting due to previous error
+error[E0658]: exclusive range pattern syntax is experimental
+  --> $DIR/feature-gate-exclusive-range-pattern.rs:5:14
+   |
+LL |         PATH .. 3 => {}
+   |              ^^
+   |
+   = note: for more information, see https://github.com/rust-lang/rust/issues/37854
+   = help: add `#![feature(exclusive_range_pattern)]` to the crate attributes to enable
+
+error: aborting due to 2 previous errors
 
 For more information about this error, try `rustc --explain E0658`.
index 2f03160430a22fa4df6befd3495e0f3a5cab158a..6b8c146949aecc5916581e1fe1760d4f55ca480a 100644 (file)
@@ -4,7 +4,6 @@ fn main() {
     match 0 {
         (.. PAT) => {}
         //~^ ERROR `..X` range patterns are not supported
-        //~| ERROR exclusive range pattern syntax is experimental
     }
 }
 
index af3ecce1846497d485d7ad5bf0671d593b79cc9e..1962dc4ff20a87d29016b3894f14dc373e105c62 100644 (file)
@@ -4,17 +4,8 @@ error: `..X` range patterns are not supported
 LL |         (.. PAT) => {}
    |          ^^^^^^ help: try using the minimum value for the type: `MIN..PAT`
 
-error[E0658]: exclusive range pattern syntax is experimental
-  --> $DIR/pat-tuple-4.rs:5:10
-   |
-LL |         (.. PAT) => {}
-   |          ^^^^^^
-   |
-   = note: for more information, see https://github.com/rust-lang/rust/issues/37854
-   = help: add `#![feature(exclusive_range_pattern)]` to the crate attributes to enable
-
 error[E0308]: mismatched types
-  --> $DIR/pat-tuple-4.rs:11:30
+  --> $DIR/pat-tuple-4.rs:10:30
    |
 LL | const RECOVERY_WITNESS: () = 0;
    |                              ^ expected (), found integer
@@ -22,7 +13,6 @@ LL | const RECOVERY_WITNESS: () = 0;
    = note: expected type `()`
               found type `{integer}`
 
-error: aborting due to 3 previous errors
+error: aborting due to 2 previous errors
 
-Some errors have detailed explanations: E0308, E0658.
-For more information about an error, try `rustc --explain E0308`.
+For more information about this error, try `rustc --explain E0308`.
index 09ebdc29a21613cbe0dc25278324d6678f593d2d..17155b4dd49544050eb5772e3d2b4347bde3cc16 100644 (file)
@@ -5,10 +5,10 @@ LL |         (PAT ..) => {}
    |          ^^^^^^ help: try using the maximum value for the type: `PAT..MAX`
 
 error[E0658]: exclusive range pattern syntax is experimental
-  --> $DIR/pat-tuple-5.rs:5:10
+  --> $DIR/pat-tuple-5.rs:5:14
    |
 LL |         (PAT ..) => {}
-   |          ^^^^^^
+   |              ^^
    |
    = note: for more information, see https://github.com/rust-lang/rust/issues/37854
    = help: add `#![feature(exclusive_range_pattern)]` to the crate attributes to enable