]> git.proxmox.com Git - rustc.git/blobdiff - src/doc/reference/src/keywords.md
New upstream version 1.51.0+dfsg1
[rustc.git] / src / doc / reference / src / keywords.md
index bf743f6c42bde2ad9bda0b1365f9e13b1fb78d58..e303b449e37a710338f4674b0f3e9c08731f50c9 100644 (file)
 # 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