From 255b7aa8bacfcb5e0ef4a81517660b36b60b9f1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Le=C3=B3n=20Orell=20Valerian=20Liehr?= Date: Mon, 11 May 2026 23:51:56 +0200 Subject: [PATCH] Grammar: Don't allow inner attrs in certain block expressions --- src/expressions/block-expr.md | 5 +++++ src/expressions/if-expr.md | 4 ++-- src/macros-by-example.md | 2 +- src/statements.md | 3 ++- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/expressions/block-expr.md b/src/expressions/block-expr.md index 4ae74d1674..52c3050619 100644 --- a/src/expressions/block-expr.md +++ b/src/expressions/block-expr.md @@ -9,6 +9,11 @@ BlockExpression -> Statements? `}` +BlockExpressionNoInnerAttributes -> + `{` + Statements? + `}` + Statements -> Statement+ | Statement+ ExpressionWithoutBlock diff --git a/src/expressions/if-expr.md b/src/expressions/if-expr.md index 26b895dcf2..95e12ecf01 100644 --- a/src/expressions/if-expr.md +++ b/src/expressions/if-expr.md @@ -4,8 +4,8 @@ r[expr.if] r[expr.if.syntax] ```grammar,expressions IfExpression -> - `if` Conditions BlockExpression - (`else` ( BlockExpression | IfExpression ) )? + `if` Conditions BlockExpressionNoInnerAttributes + (`else` ( BlockExpressionNoInnerAttributes | IfExpression ) )? Conditions -> Expression _except [StructExpression]_ diff --git a/src/macros-by-example.md b/src/macros-by-example.md index beee8e0935..790e55a0b0 100644 --- a/src/macros-by-example.md +++ b/src/macros-by-example.md @@ -106,7 +106,7 @@ In the matcher, `$` _name_ `:` _fragment-specifier_ matches a Rust syntax fragme r[macro.decl.meta.specifier] Valid fragment specifiers are: - * `block`: a [BlockExpression] + * `block`: a [BlockExpressionNoInnerAttributes] * `expr`: an [Expression] * `expr_2021`: an [Expression] except [UnderscoreExpression] and [ConstBlockExpression] (see [macro.decl.meta.edition2024]) * `ident`: an [IDENTIFIER_OR_KEYWORD] except `_`, [RAW_IDENTIFIER], or [`$crate`] diff --git a/src/statements.md b/src/statements.md index f194e343a6..a3e89e8d81 100644 --- a/src/statements.md +++ b/src/statements.md @@ -58,7 +58,8 @@ LetStatement -> OuterAttribute* `let` PatternNoTopAlt ( `:` Type )? ( `=` Expression - | `=` Expression _except [LazyBooleanExpression] or end with a `}`_ `else` BlockExpression + | `=` Expression _except [LazyBooleanExpression] or end with a `}`_ + `else` BlockExpressionNoInnerAttributes )? `;` ```