about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2014-05-20 20:28:00 -0700
committerAlex Crichton <alex@alexcrichton.com>2014-05-20 20:28:00 -0700
commitfd88e2b7291170d0dac536130307a8cc680c8294 (patch)
treec35b662d096e00957887bfe920620c700ab4d651
parente546452727379f701f2104eb826141a29d4b39fd (diff)
downloadrust-fd88e2b7291170d0dac536130307a8cc680c8294.tar.gz
rust-fd88e2b7291170d0dac536130307a8cc680c8294.zip
syntax: Parse global paths in patterns
Closes #6449
-rw-r--r--src/libsyntax/parse/parser.rs2
-rw-r--r--src/test/run-pass/issue-6449.rs51
2 files changed, 52 insertions, 1 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index c42febcd607..5829f63b2c5 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -2920,7 +2920,7 @@ impl<'a> Parser<'a> {
           _ => {}
         }
 
-        if !is_ident_or_path(&self.token)
+        if (!is_ident_or_path(&self.token) && self.token != token::MOD_SEP)
                 || self.is_keyword(keywords::True)
                 || self.is_keyword(keywords::False) {
             // Parse an expression pattern or exp .. exp.
diff --git a/src/test/run-pass/issue-6449.rs b/src/test/run-pass/issue-6449.rs
new file mode 100644
index 00000000000..48e2890b259
--- /dev/null
+++ b/src/test/run-pass/issue-6449.rs
@@ -0,0 +1,51 @@
+// Copyright 2012-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.
+
+enum Foo {
+    Bar(int),
+    Baz,
+}
+
+enum Other {
+    Other1(Foo),
+    Other2(Foo, Foo),
+}
+
+fn main() {
+    match Baz {
+        ::Bar(3) => fail!(),
+        ::Bar(_) if false => fail!(),
+        ::Bar(..) if false => fail!(),
+        ::Bar(_n) => fail!(),
+        ::Baz => {}
+    }
+    match Bar(3) {
+        ::Bar(3) => {}
+        ::Bar(_) if false => fail!(),
+        ::Bar(..) if false => fail!(),
+        ::Bar(_n) => fail!(),
+        ::Baz => fail!(),
+    }
+    match Bar(4) {
+        ::Bar(3) => fail!(),
+        ::Bar(_) if false => fail!(),
+        ::Bar(..) if false => fail!(),
+        ::Bar(n) => assert_eq!(n, 4),
+        ::Baz => fail!(),
+    }
+
+    match Other1(Baz) {
+        ::Other1(::Baz) => {}
+        ::Other1(::Bar(_)) => {}
+        ::Other2(::Baz, ::Bar(_)) => {}
+        ::Other2(::Bar(..), ::Baz) => {}
+        ::Other2(..) => {}
+    }
+}