parser: Permit trailing +'s in bound lists
This commit is contained in:
parent
375cb2eec7
commit
65aeafa24f
8 changed files with 11 additions and 61 deletions
|
@ -4003,14 +4003,7 @@ impl<'a> Parser<'a> {
|
|||
break
|
||||
}}
|
||||
|
||||
// Trailing plus is not allowed for now and we have to detect it.
|
||||
let is_bound_start = |token: &token::Token| {
|
||||
token == &token::Question || token.is_lifetime() ||
|
||||
token.is_keyword(keywords::For) || token.is_path_start()
|
||||
};
|
||||
if self.check(&token::BinOp(token::Plus)) && self.look_ahead(1, is_bound_start) {
|
||||
self.bump();
|
||||
} else {
|
||||
if !self.eat(&token::BinOp(token::Plus)) {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
@ -4024,9 +4017,8 @@ impl<'a> Parser<'a> {
|
|||
let mut lifetimes = Vec::new();
|
||||
while let Some(lifetime) = self.eat_lifetime() {
|
||||
lifetimes.push(lifetime);
|
||||
if self.check(&token::BinOp(token::Plus)) && self.look_ahead(1, |t| t.is_lifetime()) {
|
||||
self.bump();
|
||||
} else {
|
||||
|
||||
if !self.eat(&token::BinOp(token::Plus)) {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,15 +0,0 @@
|
|||
// Copyright 2017 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.
|
||||
|
||||
// compile-flags: -Z parse-only
|
||||
|
||||
type A = for<,> fn(); //~ ERROR expected one of `>`, identifier, or lifetime, found `,`
|
||||
|
||||
fn main() {}
|
|
@ -1,15 +0,0 @@
|
|||
// Copyright 2017 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.
|
||||
|
||||
// compile-flags: -Z parse-only
|
||||
|
||||
type A where , = u8; //~ ERROR expected one of `=`, lifetime, or type, found `,`
|
||||
|
||||
fn main() {}
|
|
@ -16,6 +16,7 @@ type A where 'a: = u8; // OK
|
|||
type A where 'a:, = u8; // OK
|
||||
type A where 'a: 'b + 'c = u8; // OK
|
||||
type A where = u8; // OK
|
||||
type A where 'a: 'b + = u8; //~ ERROR expected one of `,` or `=`, found `+`
|
||||
type A where 'a: 'b + = u8; // OK
|
||||
type A where , = u8; //~ ERROR expected one of `=`, lifetime, or type, found `,`
|
||||
|
||||
fn main() {}
|
||||
|
|
|
@ -16,8 +16,9 @@ type A = for<'a:> fn(); // OK
|
|||
type A = for<'a:,> fn(); // OK
|
||||
type A = for<'a> fn(); // OK
|
||||
type A = for<> fn(); // OK
|
||||
type A = for<'a: 'b +> fn(); // OK
|
||||
|
||||
type A = for<'a, T> fn(); //~ ERROR only lifetime parameters can be used in this context
|
||||
type A = for<'a: 'b +> fn(); //~ ERROR expected one of `,` or `>`, found `+`
|
||||
type A = for<,> fn(); //~ ERROR expected one of `>`, identifier, or lifetime, found `,`
|
||||
|
||||
fn main() {}
|
||||
|
|
|
@ -1,16 +0,0 @@
|
|||
// Copyright 2017 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.
|
||||
|
||||
// compile-flags: -Z parse-only
|
||||
|
||||
type A where T, = u8;
|
||||
//~^ ERROR expected one of `!`, `(`, `+`, `::`, `:`, `<`, `==`, or `=`, found `,`
|
||||
|
||||
fn main() {}
|
|
@ -16,6 +16,8 @@ type A where T: = u8; // OK
|
|||
type A where T:, = u8; // OK
|
||||
type A where T: Trait + Trait = u8; // OK
|
||||
type A where = u8; // OK
|
||||
type A where T: Trait + = u8; //~ ERROR expected one of `(`, `,`, `::`, `<`, or `=`, found `+`
|
||||
type A where T: Trait + = u8; // OK
|
||||
type A where T, = u8;
|
||||
//~^ ERROR expected one of `!`, `(`, `+`, `::`, `:`, `<`, `==`, or `=`, found `,`
|
||||
|
||||
fn main() {}
|
||||
|
|
|
@ -16,8 +16,8 @@ struct S<
|
|||
T: 'a, // OK
|
||||
T:, // OK
|
||||
T: ?for<'a: 'b + 'c> Trait, // OK
|
||||
T: Tr +, // OK
|
||||
T: ?'a, //~ ERROR `?` may only modify trait bounds, not lifetime bounds
|
||||
T: Tr +, //~ ERROR expected one of `(`, `,`, `::`, `<`, `=`, or `>`, found `+`
|
||||
>;
|
||||
|
||||
fn main() {}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue