From cb918e1a831782d6072a0b93dd57614cb9c2d961 Mon Sep 17 00:00:00 2001 From: Jeong YunWon Date: Sun, 5 May 2013 10:57:14 +0900 Subject: [PATCH] Allow non-literal static range pattern for match arms Fix unintended error problem of: static s: int = 1; static e: int = 42; fn main() { match 7 { s..e => (), ^~ error: expected `=>` but found `..` _ => (), } } --- src/libsyntax/parse/parser.rs | 10 ++++++++-- src/test/run-pass/match-range-static.rs | 10 ++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 src/test/run-pass/match-range-static.rs diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index a6528160398e8..de88089b1bf7d 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -2383,7 +2383,13 @@ pub impl Parser { can_be_enum_or_struct = false } - if is_plain_ident(&*self.token) && !can_be_enum_or_struct { + if self.look_ahead(1) == token::DOTDOT { + let start = self.parse_expr_res(RESTRICT_NO_BAR_OP); + self.eat(&token::DOTDOT); + let end = self.parse_expr_res(RESTRICT_NO_BAR_OP); + pat = pat_range(start, end); + } + else if is_plain_ident(&*self.token) && !can_be_enum_or_struct { let name = self.parse_path_without_tps(); let sub; if self.eat(&token::AT) { @@ -2392,7 +2398,7 @@ pub impl Parser { } else { // or just foo sub = None; - }; + } pat = pat_ident(binding_mode, name, sub); } else { // parse an enum pat diff --git a/src/test/run-pass/match-range-static.rs b/src/test/run-pass/match-range-static.rs new file mode 100644 index 0000000000000..3eefc386250ed --- /dev/null +++ b/src/test/run-pass/match-range-static.rs @@ -0,0 +1,10 @@ +static s: int = 1; +static e: int = 42; + +fn main() { + match 7 { + s..e => (), + _ => (), + } +} +