# Keywords
-Rust divides keywords in three categories:
- - [strict](#strict-keywords)
- - [weak](#weak-keywords)
- - [reserved](#reserved-keywords)
+Rust divides keywords into three categories:
+
+* [strict](#strict-keywords)
+* [reserved](#reserved-keywords)
+* [weak](#weak-keywords)
## Strict keywords
-These keywords can only be used in their correct contexts. For example, it is
-not allowed to declare a variable with name `struct`.
-
-> **<sup>Lexer:<sup>**
-> KW_AS : `as`
-> KW_BOX : `box`
-> KW_BREAK : `break`
-> KW_CONST : `const`
-> KW_CONTINUE : `continue`
-> KW_CRATE : `crate`
-> KW_ELSE : `else`
-> KW_ENUM : `enum`
-> KW_EXTERN : `extern`
-> KW_FALSE : `false`
-> KW_FN : `fn`
-> KW_FOR : `for`
-> KW_IF : `if`
-> KW_IMPL : `impl`
-> KW_IN : `in`
-> KW_LET : `let`
-> KW_LOOP : `loop`
-> KW_MATCH : `match`
-> KW_MOD : `mod`
-> KW_MOVE : `move`
-> KW_MUT : `mut`
-> KW_PUB : `pub`
-> KW_REF : `ref`
-> KW_RETURN : `return`
-> KW_SELFVALUE : `self`
-> KW_SELFTYPE : `Self`
-> KW_STATIC : `static`
-> KW_STRUCT : `struct`
-> KW_SUPER : `super`
-> KW_TRAIT : `trait`
-> KW_TRUE : `true`
-> KW_TYPE : `type`
-> KW_UNSAFE : `unsafe`
-> KW_USE : `use`
-> KW_WHERE : `wher`
-> KW_WHILE : `while`
+These keywords can only be used in their correct contexts. They cannot
+be used as the names of:
-## Weak keywords
+* [Items]
+* [Variables] and function parameters
+* Fields and [variants]
+* [Type parameters]
+* Lifetime parameters or [loop labels]
+* [Macros] or [attributes]
+* [Macro placeholders]
+* [Crates]
-These keywords have special meaning only in certain contexts. For example,
-it is possible to declare a variable or method with the name `union`.
+> **<sup>Lexer:<sup>**\
+> KW_AS : `as`\
+> KW_BREAK : `break`\
+> KW_CONST : `const`\
+> KW_CONTINUE : `continue`\
+> KW_CRATE : `crate`\
+> KW_ELSE : `else`\
+> KW_ENUM : `enum`\
+> KW_EXTERN : `extern`\
+> KW_FALSE : `false`\
+> KW_FN : `fn`\
+> KW_FOR : `for`\
+> KW_IF : `if`\
+> KW_IMPL : `impl`\
+> KW_IN : `in`\
+> KW_LET : `let`\
+> KW_LOOP : `loop`\
+> KW_MATCH : `match`\
+> KW_MOD : `mod`\
+> KW_MOVE : `move`\
+> KW_MUT : `mut`\
+> KW_PUB : `pub`\
+> KW_REF : `ref`\
+> KW_RETURN : `return`\
+> KW_SELFVALUE : `self`\
+> KW_SELFTYPE : `Self`\
+> KW_STATIC : `static`\
+> KW_STRUCT : `struct`\
+> KW_SUPER : `super`\
+> KW_TRAIT : `trait`\
+> KW_TRUE : `true`\
+> KW_TYPE : `type`\
+> KW_UNSAFE : `unsafe`\
+> KW_USE : `use`\
+> KW_WHERE : `where`\
+> KW_WHILE : `while`
-> **<sup>Lexer</sup>**
-> KW_CATCH : `catch`
-> KW_DEFAULT : `default`
-> KW_UNION : `union`
-> KW_STATICLIFETIME : `'static`
+The following keywords were added beginning in the 2018 edition.
+
+> **<sup>Lexer 2018+</sup>**\
+> KW_ASYNC : `async`\
+> KW_AWAIT : `await`\
+> KW_DYN : `dyn`
## Reserved keywords
-These keywords aren't used yet, but they are reserved for future use.
-The reasoning behind this is to make current programs forward compatible with
-future versions of rust by forbiding them to use these keywords.
-
-> **<sup>Lexer</sup>**
-> KW_ABSTRACT : `abstract`
-> KW_ALIGNOF : `alignof`
-> KW_BECOME : `become`
-> KW_DO : `do`
-> KW_FINAL : `final`
-> KW_MACRO : `macro`
-> KW_OFFSETOF : `offsetof`
-> KW_OVERRIDE : `override`
-> KW_PRIV : `priv`
-> KW_PROC : `proc`
-> KW_PURE : `pure`
-> KW_SIZEOF : `sizeof`
-> KW_TYPEOF : `typeof`
-> KW_UNSIZED : `unsized`
-> KW_VIRTUAL : `virtual`
-> KW_YIELD : `yield`
+These keywords aren't used yet, but they are reserved for future use. They have
+the same restrictions as strict keywords. The reasoning behind this is to make
+current programs forward compatible with future versions of Rust by forbidding
+them to use these keywords.
+
+> **<sup>Lexer</sup>**\
+> KW_ABSTRACT : `abstract`\
+> KW_BECOME : `become`\
+> KW_BOX : `box`\
+> KW_DO : `do`\
+> KW_FINAL : `final`\
+> KW_MACRO : `macro`\
+> KW_OVERRIDE : `override`\
+> KW_PRIV : `priv`\
+> KW_TYPEOF : `typeof`\
+> KW_UNSIZED : `unsized`\
+> KW_VIRTUAL : `virtual`\
+> KW_YIELD : `yield`
+
+The following keywords are reserved beginning in the 2018 edition.
+
+> **<sup>Lexer 2018+</sup>**\
+> KW_TRY : `try`
+
+## Weak keywords
+
+These keywords have special meaning only in certain contexts. For example, it
+is possible to declare a variable or method with the name `union`.
+
+* `union` is used to declare a [union] and is only a keyword when used in a
+ union declaration.
+* `'static` is used for the static lifetime and cannot be used as a [generic
+ lifetime parameter] or [loop label]
+
+ ```compile_fail
+ // error[E0262]: invalid lifetime parameter name: `'static`
+ fn invalid_lifetime_parameter<'static>(s: &'static str) -> &'static str { s }
+ ```
+* In the 2015 edition, [`dyn`] is a keyword when used in a type position
+ followed by a path that does not start with `::`.
+
+ Beginning in the 2018 edition, `dyn` has been promoted to a strict keyword.
+
+> **<sup>Lexer</sup>**\
+> KW_UNION : `union`\
+> KW_STATICLIFETIME : `'static`
+>
+> **<sup>Lexer 2015</sup>**\
+> KW_DYN : `dyn`
+
+[items]: items.md
+[Variables]: variables.md
+[Type parameters]: types/parameters.md
+[loop labels]: expressions/loop-expr.md#loop-labels
+[Macros]: macros.md
+[attributes]: attributes.md
+[Macro placeholders]: macros-by-example.md
+[Crates]: crates-and-source-files.md
+[union]: items/unions.md
+[variants]: items/enumerations.md
+[`dyn`]: types/trait-object.md
+[loop label]: expressions/loop-expr.md#loop-labels
+[generic lifetime parameter]: items/generics.md