]> git.lizzy.rs Git - rust.git/commitdiff
FIX #21475: Interval match patterns won't parse namespace specifiers correctly
authordefuz <defuz.net@gmail.com>
Thu, 22 Jan 2015 19:56:27 +0000 (21:56 +0200)
committerdefuz <defuz.net@gmail.com>
Sat, 28 Feb 2015 08:56:46 +0000 (10:56 +0200)
src/libsyntax/parse/parser.rs
src/test/run-pass/issue-21475.rs [new file with mode: 0644]

index f171e8279f49c47440ce715dd1e616d469a614fb..1ef62cdf315d5a7247a49cd97136eff1ca528d62 100644 (file)
@@ -3539,6 +3539,19 @@ pub fn parse_pat(&mut self) -> P<Pat> {
                         self.bump();
                         pat = PatStruct(enum_path, fields, etc);
                     }
+                    token::DotDotDot => {
+                        let hi = self.last_span.hi;
+                        let start = self.mk_expr(lo, hi, ExprPath(enum_path));
+                        self.eat(&token::DotDotDot);
+                        let end = if self.token.is_ident() || self.token.is_path() {
+                            let path = self.parse_path(LifetimeAndTypesWithColons);
+                            let hi = self.span.hi;
+                            self.mk_expr(lo, hi, ExprPath(path))
+                        } else {
+                            self.parse_literal_maybe_minus()
+                        };
+                        pat = PatRange(start, end);
+                    }
                     _ => {
                         let mut args: Vec<P<Pat>> = Vec::new();
                         match self.token {
diff --git a/src/test/run-pass/issue-21475.rs b/src/test/run-pass/issue-21475.rs
new file mode 100644 (file)
index 0000000..b0f5fe6
--- /dev/null
@@ -0,0 +1,26 @@
+// Copyright 2014 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.
+
+use m::{START, END};
+
+fn main() {
+    match 42u32 {
+        m::START...m::END => {},
+        // FIXME: Should also work (now: mismatched types in range [E0031])
+        // 0u32...m::END => {},
+        // m::START...59u32 => {},
+        _  => {},
+    }
+}
+
+mod m {
+  pub const START: u32 = 4;
+  pub const END:   u32 = 14;
+}