Add try to syntax_pos as an edition-2018-only keyword

This commit is contained in:
Scott McMurray 2018-07-21 19:34:45 -07:00
parent f2445fb507
commit 1c906093f9
3 changed files with 52 additions and 10 deletions

View file

@ -413,23 +413,30 @@ declare_keywords! {
(49, Virtual, "virtual")
(50, Yield, "yield")
// Edition-specific keywords currently in use.
(51, Try, "try") // >= 2018 Edition Only
// Edition-specific keywords reserved for future use.
(51, Async, "async") // >= 2018 Edition Only
(52, Async, "async") // >= 2018 Edition Only
// Special lifetime names
(52, UnderscoreLifetime, "'_")
(53, StaticLifetime, "'static")
(53, UnderscoreLifetime, "'_")
(54, StaticLifetime, "'static")
// Weak keywords, have special meaning only in specific contexts.
(54, Auto, "auto")
(55, Catch, "catch")
(56, Default, "default")
(57, Dyn, "dyn")
(58, Union, "union")
(59, Existential, "existential")
(55, Auto, "auto")
(56, Catch, "catch")
(57, Default, "default")
(58, Dyn, "dyn")
(59, Union, "union")
(60, Existential, "existential")
}
impl Symbol {
fn is_used_keyword_2018(self) -> bool {
self == keywords::Try.name()
}
fn is_unused_keyword_2018(self) -> bool {
self == keywords::Async.name()
}
@ -444,7 +451,9 @@ impl Ident {
/// Returns `true` if the token is a keyword used in the language.
pub fn is_used_keyword(self) -> bool {
self.name >= keywords::As.name() && self.name <= keywords::While.name()
// Note: `span.edition()` is relatively expensive, don't call it unless necessary.
self.name >= keywords::As.name() && self.name <= keywords::While.name() ||
self.name.is_used_keyword_2018() && self.span.edition() == Edition::Edition2018
}
/// Returns `true` if the token is a keyword reserved for possible future use.

View file

@ -0,0 +1,15 @@
// Copyright 2018 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 --edition 2018
fn main() {
let try = "foo"; //~ error: expected pattern, found keyword `try`
}

View file

@ -0,0 +1,18 @@
// Copyright 2018 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: --edition 2015
fn main() {
let try = 2;
struct try { try: u32 };
let try: try = try { try };
assert_eq!(try.try, 2);
}