Skip to content

Commit

Permalink
Rollup merge of rust-lang#54261 - varkor:dyn-keyword-2018, r=petroche…
Browse files Browse the repository at this point in the history
…nkov

Make `dyn` a keyword in the 2018 edition

Proposed in rust-lang#44662 (comment).
  • Loading branch information
pietroalbini committed Sep 22, 2018
2 parents e6ee4e0 + cb594cf commit 822c511
Show file tree
Hide file tree
Showing 9 changed files with 72 additions and 14 deletions.
3 changes: 1 addition & 2 deletions src/librustc_lint/builtin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}
}
Expand Down
5 changes: 3 additions & 2 deletions src/libsyntax/parse/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1578,8 +1578,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()?;
Expand Down
1 change: 1 addition & 0 deletions src/libsyntax/parse/token.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

Expand Down
19 changes: 9 additions & 10 deletions src/libsyntax_pos/symbol.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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()
}
}

Expand Down
10 changes: 10 additions & 0 deletions src/test/ui/rust-2018/dyn-keyword.fixed
Original file line number Diff line number Diff line change
@@ -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
}
10 changes: 10 additions & 0 deletions src/test/ui/rust-2018/dyn-keyword.rs
Original file line number Diff line number Diff line change
@@ -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
}
16 changes: 16 additions & 0 deletions src/test/ui/rust-2018/dyn-keyword.stderr
Original file line number Diff line number Diff line change
@@ -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 <https://github.com/rust-lang/rust/issues/49716>

error: aborting due to previous error

8 changes: 8 additions & 0 deletions src/test/ui/rust-2018/dyn-trait-compatibility.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// edition:2018

type A0 = dyn;
type A1 = dyn::dyn; //~ERROR expected identifier, found reserved keyword
type A2 = dyn<dyn, dyn>; //~ERROR expected identifier, found `<`
type A3 = dyn<<dyn as dyn>::dyn>;

fn main() {}
14 changes: 14 additions & 0 deletions src/test/ui/rust-2018/dyn-trait-compatibility.stderr
Original file line number Diff line number Diff line change
@@ -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<dyn, dyn>; //~ERROR expected identifier, found `<`
| ^ expected identifier

error: aborting due to 2 previous errors

0 comments on commit 822c511

Please sign in to comment.