From cb594cf3730c35fd6c514e98d9c7a0d78a00a02d Mon Sep 17 00:00:00 2001 From: varkor Date: Sat, 15 Sep 2018 18:18:49 +0100 Subject: [PATCH] Treat `dyn` as a keyword in the 2018 edition --- src/librustc_lint/builtin.rs | 3 +-- src/libsyntax/parse/parser.rs | 5 +++-- src/libsyntax/parse/token.rs | 1 + src/libsyntax_pos/symbol.rs | 19 +++++++++---------- src/test/ui/rust-2018/dyn-keyword.fixed | 10 ++++++++++ src/test/ui/rust-2018/dyn-keyword.rs | 10 ++++++++++ src/test/ui/rust-2018/dyn-keyword.stderr | 16 ++++++++++++++++ .../ui/rust-2018/dyn-trait-compatibility.rs | 8 ++++++++ .../rust-2018/dyn-trait-compatibility.stderr | 14 ++++++++++++++ 9 files changed, 72 insertions(+), 14 deletions(-) create mode 100644 src/test/ui/rust-2018/dyn-keyword.fixed create mode 100644 src/test/ui/rust-2018/dyn-keyword.rs create mode 100644 src/test/ui/rust-2018/dyn-keyword.stderr create mode 100644 src/test/ui/rust-2018/dyn-trait-compatibility.rs create mode 100644 src/test/ui/rust-2018/dyn-trait-compatibility.stderr diff --git a/src/librustc_lint/builtin.rs b/src/librustc_lint/builtin.rs index b662b82501393..7da84ccd28dd2 100644 --- a/src/librustc_lint/builtin.rs +++ b/src/librustc_lint/builtin.rs @@ -1937,8 +1937,7 @@ impl EarlyLintPass for KeywordIdents { let next_edition = match cx.sess.edition() { Edition::Edition2015 => { match &ident.as_str()[..] { - "async" | - "try" => Edition::Edition2018, + "async" | "try" | "dyn" => Edition::Edition2018, _ => return, } } diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index f57fca2cfcf60..ab1f46c4bb921 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -1562,8 +1562,9 @@ impl<'a> Parser<'a> { impl_dyn_multi = bounds.len() > 1 || self.prev_token_kind == PrevTokenKind::Plus; TyKind::ImplTrait(ast::DUMMY_NODE_ID, bounds) } else if self.check_keyword(keywords::Dyn) && - self.look_ahead(1, |t| t.can_begin_bound() && - !can_continue_type_after_non_fn_ident(t)) { + (self.span.edition() == Edition::Edition2018 || + self.look_ahead(1, |t| t.can_begin_bound() && + !can_continue_type_after_non_fn_ident(t))) { self.bump(); // `dyn` // Always parse bounds greedily for better error recovery. let bounds = self.parse_generic_bounds()?; diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs index 6e8014284ec40..01bc7f6ad302b 100644 --- a/src/libsyntax/parse/token.rs +++ b/src/libsyntax/parse/token.rs @@ -136,6 +136,7 @@ fn ident_can_begin_type(ident: ast::Ident, is_raw: bool) -> bool { keywords::Unsafe.name(), keywords::Extern.name(), keywords::Typeof.name(), + keywords::Dyn.name(), ].contains(&ident.name) } diff --git a/src/libsyntax_pos/symbol.rs b/src/libsyntax_pos/symbol.rs index defdca9abd15a..d412412fc655e 100644 --- a/src/libsyntax_pos/symbol.rs +++ b/src/libsyntax_pos/symbol.rs @@ -414,26 +414,25 @@ declare_keywords! { (50, Yield, "yield") // Edition-specific keywords reserved for future use. - (51, Async, "async") // >= 2018 Edition Only - (52, Try, "try") // >= 2018 Edition Only + (51, Async, "async") // >= 2018 Edition only + (52, Dyn, "dyn") // >= 2018 Edition only + (53, Try, "try") // >= 2018 Edition only // Special lifetime names - (53, UnderscoreLifetime, "'_") - (54, StaticLifetime, "'static") + (54, UnderscoreLifetime, "'_") + (55, StaticLifetime, "'static") // Weak keywords, have special meaning only in specific contexts. - (55, Auto, "auto") - (56, Catch, "catch") - (57, Default, "default") - (58, Dyn, "dyn") + (56, Auto, "auto") + (57, Catch, "catch") + (58, Default, "default") (59, Union, "union") (60, Existential, "existential") } impl Symbol { fn is_unused_keyword_2018(self) -> bool { - self >= keywords::Async.name() && - self <= keywords::Try.name() + self >= keywords::Async.name() && self <= keywords::Try.name() } } diff --git a/src/test/ui/rust-2018/dyn-keyword.fixed b/src/test/ui/rust-2018/dyn-keyword.fixed new file mode 100644 index 0000000000000..e9cda1af93932 --- /dev/null +++ b/src/test/ui/rust-2018/dyn-keyword.fixed @@ -0,0 +1,10 @@ +// edition:2015 +// run-rustfix + +#![allow(unused_variables)] +#![deny(keyword_idents)] + +fn main() { + let r#dyn = (); //~ ERROR dyn + //~^ WARN hard error in the 2018 edition +} diff --git a/src/test/ui/rust-2018/dyn-keyword.rs b/src/test/ui/rust-2018/dyn-keyword.rs new file mode 100644 index 0000000000000..bdd3a90cab9ec --- /dev/null +++ b/src/test/ui/rust-2018/dyn-keyword.rs @@ -0,0 +1,10 @@ +// edition:2015 +// run-rustfix + +#![allow(unused_variables)] +#![deny(keyword_idents)] + +fn main() { + let dyn = (); //~ ERROR dyn + //~^ WARN hard error in the 2018 edition +} diff --git a/src/test/ui/rust-2018/dyn-keyword.stderr b/src/test/ui/rust-2018/dyn-keyword.stderr new file mode 100644 index 0000000000000..5a3e00ab1d96a --- /dev/null +++ b/src/test/ui/rust-2018/dyn-keyword.stderr @@ -0,0 +1,16 @@ +error: `dyn` is a keyword in the 2018 edition + --> $DIR/dyn-keyword.rs:8:9 + | +LL | let dyn = (); //~ ERROR dyn + | ^^^ help: you can use a raw identifier to stay compatible: `r#dyn` + | +note: lint level defined here + --> $DIR/dyn-keyword.rs:5:9 + | +LL | #![deny(keyword_idents)] + | ^^^^^^^^^^^^^^ + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in the 2018 edition! + = note: for more information, see issue #49716 + +error: aborting due to previous error + diff --git a/src/test/ui/rust-2018/dyn-trait-compatibility.rs b/src/test/ui/rust-2018/dyn-trait-compatibility.rs new file mode 100644 index 0000000000000..9548df5959bd4 --- /dev/null +++ b/src/test/ui/rust-2018/dyn-trait-compatibility.rs @@ -0,0 +1,8 @@ +// edition:2018 + +type A0 = dyn; +type A1 = dyn::dyn; //~ERROR expected identifier, found reserved keyword +type A2 = dyn; //~ERROR expected identifier, found `<` +type A3 = dyn<::dyn>; + +fn main() {} diff --git a/src/test/ui/rust-2018/dyn-trait-compatibility.stderr b/src/test/ui/rust-2018/dyn-trait-compatibility.stderr new file mode 100644 index 0000000000000..ea0483394b5ea --- /dev/null +++ b/src/test/ui/rust-2018/dyn-trait-compatibility.stderr @@ -0,0 +1,14 @@ +error: expected identifier, found reserved keyword `dyn` + --> $DIR/dyn-trait-compatibility.rs:4:16 + | +LL | type A1 = dyn::dyn; //~ERROR expected identifier, found reserved keyword + | ^^^ expected identifier, found reserved keyword + +error: expected identifier, found `<` + --> $DIR/dyn-trait-compatibility.rs:5:14 + | +LL | type A2 = dyn; //~ERROR expected identifier, found `<` + | ^ expected identifier + +error: aborting due to 2 previous errors +