diff options
| author | Patrick Walton <pcwalton@mimiga.net> | 2014-08-12 10:33:16 -0700 |
|---|---|---|
| committer | Patrick Walton <pcwalton@mimiga.net> | 2014-08-12 10:33:16 -0700 |
| commit | 857ba988f189c9a2ebc7d30b1b7b6ec018908aa6 (patch) | |
| tree | 053d49330a0bf9c2af3a925ef40442faeae00041 | |
| parent | c7d0b5259d95ab4ef821bdf93a434538c3a84dad (diff) | |
| download | rust-857ba988f189c9a2ebc7d30b1b7b6ec018908aa6.tar.gz rust-857ba988f189c9a2ebc7d30b1b7b6ec018908aa6.zip | |
libsyntax: Don't strip types and lifetimes from single-segment paths in
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]
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 11 | ||||
| -rw-r--r-- | src/test/compile-fail/pattern-ident-path-generics.rs | 17 |
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(_) => {} + } +} + |
