diff --git a/src/items/external-blocks.md b/src/items/external-blocks.md index 7acb5ce3c..b31dd17d4 100644 --- a/src/items/external-blocks.md +++ b/src/items/external-blocks.md @@ -2,7 +2,7 @@ > **Syntax**\ > _ExternBlock_ :\ ->    `extern` [_Abi_]? `{`\ +>    `unsafe`? `extern` [_Abi_]? `{`\ >       [_InnerAttribute_]\*\ >       _ExternalItem_\*\ >    `}` @@ -38,6 +38,11 @@ Two kind of item _declarations_ are allowed in external blocks: [functions] and [statics]. Calling functions or accessing statics that are declared in external blocks is only allowed in an `unsafe` context. +The `unsafe` keyword is syntactically allowed to appear before the `extern` +keyword, but it is rejected at a semantic level. This allows macros to consume +the syntax and make use of the `unsafe` keyword, before removing it from the +token stream. + ## Functions Functions within external blocks are declared in the same way as other Rust diff --git a/src/items/modules.md b/src/items/modules.md index a58bd37a2..b688665c0 100644 --- a/src/items/modules.md +++ b/src/items/modules.md @@ -2,8 +2,8 @@ > **Syntax:**\ > _Module_ :\ ->       `mod` [IDENTIFIER] `;`\ ->    | `mod` [IDENTIFIER] `{`\ +>       `unsafe`? `mod` [IDENTIFIER] `;`\ +>    | `unsafe`? `mod` [IDENTIFIER] `{`\ >         [_InnerAttribute_]\*\ >         [_Item_]\*\ >       `}` @@ -40,6 +40,11 @@ struct, enumeration, union, type parameter or crate can't shadow the name of a module in scope, or vice versa. Items brought into scope with `use` also have this restriction. +The `unsafe` keyword is syntactically allowed to appear before the `mod` +keyword, but it is rejected at a semantic level. This allows macros to consume +the syntax and make use of the `unsafe` keyword, before removing it from the +token stream. + ## Module Source Filenames A module without a body is loaded from an external file. When the module does