about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2014-08-12 20:06:30 +0000
committerbors <bors@rust-lang.org>2014-08-12 20:06:30 +0000
commit4bb4a43917bf702fb2c6a614786aa1abe6c1014c (patch)
treea2d4699c245af512a0e647afefeb0209e846321f
parente2273d945640442224a09e532865e4a58257a851 (diff)
parent857ba988f189c9a2ebc7d30b1b7b6ec018908aa6 (diff)
downloadrust-4bb4a43917bf702fb2c6a614786aa1abe6c1014c.tar.gz
rust-4bb4a43917bf702fb2c6a614786aa1abe6c1014c.zip
auto merge of #16454 : pcwalton/rust/types-in-path-patterns, r=brson
patterns.

This breaks code like:

    fn main() {
        match Some("foo") {
            None::<int> => {}
            Some(_) => {}
        }
    }

Change this code to not contain a type error. For example:

    fn main() {
        match Some("foo") {
            None::<&str> => {}
            Some(_) => {}
        }
    }

Closes #16353.

[breaking-change]

r? @huonw
-rw-r--r--src/libsyntax/parse/parser.rs11
-rw-r--r--src/test/compile-fail/pattern-ident-path-generics.rs17
2 files changed, 27 insertions, 1 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 7ea000d3aac..08d96f5b008 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -3157,7 +3157,16 @@ impl<'a> Parser<'a> {
                             }
                           },
                           _ => {
-                              if !enum_path.global && enum_path.segments.len() == 1 {
+                              if !enum_path.global &&
+                                    enum_path.segments.len() == 1 &&
+                                    enum_path.segments
+                                             .get(0)
+                                             .lifetimes
+                                             .len() == 0 &&
+                                    enum_path.segments
+                                             .get(0)
+                                             .types
+                                             .len() == 0 {
                                   // it could still be either an enum
                                   // or an identifier pattern, resolve
                                   // will sort it out:
diff --git a/src/test/compile-fail/pattern-ident-path-generics.rs b/src/test/compile-fail/pattern-ident-path-generics.rs
new file mode 100644
index 00000000000..ab77e376979
--- /dev/null
+++ b/src/test/compile-fail/pattern-ident-path-generics.rs
@@ -0,0 +1,17 @@
+// 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.
+
+fn main() {
+    match Some("foo") {
+        None::<int> => {}   //~ ERROR mismatched types
+        Some(_) => {}
+    }
+}
+