From 52fa187431b4209a4e8606790287eaf08741ef25 Mon Sep 17 00:00:00 2001 From: defuz Date: Thu, 22 Jan 2015 21:56:27 +0200 Subject: [PATCH 1/3] FIX #21475: Interval match patterns won't parse namespace specifiers correctly --- src/libsyntax/parse/parser.rs | 13 +++++++++++++ src/test/run-pass/issue-21475.rs | 26 ++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 src/test/run-pass/issue-21475.rs diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index f171e8279f49c..1ef62cdf315d5 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -3539,6 +3539,19 @@ impl<'a> Parser<'a> { 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> = 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 index 0000000000000..b0f5fe628b01f --- /dev/null +++ b/src/test/run-pass/issue-21475.rs @@ -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 or the MIT license +// , 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; +} From f84c25721e097e52fa77903881f73fe55890da0d Mon Sep 17 00:00:00 2001 From: defuz Date: Wed, 18 Feb 2015 20:21:32 +0200 Subject: [PATCH 2/3] FIX #21475: mixing literals and paths in interval --- src/test/run-pass/issue-21475.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/test/run-pass/issue-21475.rs b/src/test/run-pass/issue-21475.rs index b0f5fe628b01f..145145af5194d 100644 --- a/src/test/run-pass/issue-21475.rs +++ b/src/test/run-pass/issue-21475.rs @@ -13,9 +13,8 @@ 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 => {}, + 0u32...m::END => {}, + m::START...59u32 => {}, _ => {}, } } From 6c35bf4fbc4f795eb18bbb0c750ed478a47fff4e Mon Sep 17 00:00:00 2001 From: defuz Date: Sat, 28 Feb 2015 11:01:28 +0200 Subject: [PATCH 3/3] FIX #21475: Expr_::ExprPath with two fields --- src/libsyntax/parse/parser.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 1ef62cdf315d5..9a265cb592d9c 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -3541,12 +3541,12 @@ impl<'a> Parser<'a> { } token::DotDotDot => { let hi = self.last_span.hi; - let start = self.mk_expr(lo, hi, ExprPath(enum_path)); + let start = self.mk_expr(lo, hi, ExprPath(None, 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)) + self.mk_expr(lo, hi, ExprPath(None, path)) } else { self.parse_literal_maybe_minus() };