From f0c730b819939f691076fec85319a6d11fa7b67d Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Fri, 20 Jun 2014 09:53:12 -0700 Subject: [PATCH] syntax: Parse GT tokens from `>=` and `>>=` The parser already has special logic for parsing `>` tokens from `>>`, and this commit extends the logic to the acquiring a `>` from the `>=` and `>>=` tokens as well. Closes #15043 --- src/libsyntax/parse/parser.rs | 14 +++++++++++++- src/test/run-pass/issue-15043.rs | 21 +++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 src/test/run-pass/issue-15043.rs diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index ae2ec216bee..b56919c53c7 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -706,6 +706,16 @@ impl<'a> Parser<'a> { let lo = span.lo + BytePos(1); self.replace_token(token::GT, lo, span.hi) } + token::BINOPEQ(token::SHR) => { + let span = self.span; + let lo = span.lo + BytePos(1); + self.replace_token(token::GE, lo, span.hi) + } + token::GE => { + let span = self.span; + let lo = span.lo + BytePos(1); + self.replace_token(token::EQ, lo, span.hi) + } _ => { let gt_str = Parser::token_to_str(&token::GT); let this_token_str = self.this_token_to_str(); @@ -726,7 +736,9 @@ impl<'a> Parser<'a> { let mut first = true; let mut v = Vec::new(); while self.token != token::GT - && self.token != token::BINOP(token::SHR) { + && self.token != token::BINOP(token::SHR) + && self.token != token::GE + && self.token != token::BINOPEQ(token::SHR) { match sep { Some(ref t) => { if first { first = false; } diff --git a/src/test/run-pass/issue-15043.rs b/src/test/run-pass/issue-15043.rs new file mode 100644 index 00000000000..edca9cbaa30 --- /dev/null +++ b/src/test/run-pass/issue-15043.rs @@ -0,0 +1,21 @@ +// 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. + +#![allow(warnings)] + +struct S(T); + +static s1: S>=S(S(0)); +static s2: S=S(0); + +fn main() { + let foo: S>=S(S(0)); + let foo: S=S(0); +}