Skip to content

Commit f30c45d

Browse files
committed
Update statements and expressions with outer attributes.
1 parent 6110929 commit f30c45d

File tree

2 files changed

+66
-25
lines changed

2 files changed

+66
-25
lines changed

src/expressions.md

Lines changed: 63 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,32 +6,38 @@
66
>    | _ExpressionWithBlock_
77
>
88
> _ExpressionWithoutBlock_ :\
9-
>       [_LiteralExpression_]\
10-
>    | [_PathExpression_]\
11-
>    | [_OperatorExpression_]\
12-
>    | [_GroupedExpression_]\
13-
>    | [_ArrayExpression_]\
14-
>    | [_IndexExpression_]\
15-
>    | [_TupleExpression_]\
16-
>    | [_TupleIndexingExpression_]\
17-
>    | [_StructExpression_]\
18-
>    | [_EnumerationVariantExpression_]\
19-
>    | [_CallExpression_]\
20-
>    | [_MethodCallExpression_]\
21-
>    | [_FieldExpression_]\
22-
>    | [_ClosureExpression_]\
23-
>    | [_ContinueExpression_]\
24-
>    | [_BreakExpression_]\
25-
>    | [_RangeExpression_]\
26-
>    | [_ReturnExpression_]
9+
> &nbsp;&nbsp; [_OuterAttribute_]<sup>\*</sup>[](#expression-attributes)\
10+
> &nbsp;&nbsp; (\
11+
> &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; [_LiteralExpression_]\
12+
> &nbsp;&nbsp; &nbsp;&nbsp; | [_PathExpression_]\
13+
> &nbsp;&nbsp; &nbsp;&nbsp; | [_OperatorExpression_]\
14+
> &nbsp;&nbsp; &nbsp;&nbsp; | [_GroupedExpression_]\
15+
> &nbsp;&nbsp; &nbsp;&nbsp; | [_ArrayExpression_]\
16+
> &nbsp;&nbsp; &nbsp;&nbsp; | [_IndexExpression_]\
17+
> &nbsp;&nbsp; &nbsp;&nbsp; | [_TupleExpression_]\
18+
> &nbsp;&nbsp; &nbsp;&nbsp; | [_TupleIndexingExpression_]\
19+
> &nbsp;&nbsp; &nbsp;&nbsp; | [_StructExpression_]\
20+
> &nbsp;&nbsp; &nbsp;&nbsp; | [_EnumerationVariantExpression_]\
21+
> &nbsp;&nbsp; &nbsp;&nbsp; | [_CallExpression_]\
22+
> &nbsp;&nbsp; &nbsp;&nbsp; | [_MethodCallExpression_]\
23+
> &nbsp;&nbsp; &nbsp;&nbsp; | [_FieldExpression_]\
24+
> &nbsp;&nbsp; &nbsp;&nbsp; | [_ClosureExpression_]\
25+
> &nbsp;&nbsp; &nbsp;&nbsp; | [_ContinueExpression_]\
26+
> &nbsp;&nbsp; &nbsp;&nbsp; | [_BreakExpression_]\
27+
> &nbsp;&nbsp; &nbsp;&nbsp; | [_RangeExpression_]\
28+
> &nbsp;&nbsp; &nbsp;&nbsp; | [_ReturnExpression_]\
29+
> &nbsp;&nbsp; )
2730
>
2831
> _ExpressionWithBlock_ :\
29-
> &nbsp;&nbsp; &nbsp;&nbsp; [_BlockExpression_]\
30-
> &nbsp;&nbsp; | [_UnsafeBlockExpression_]\
31-
> &nbsp;&nbsp; | [_LoopExpression_]\
32-
> &nbsp;&nbsp; | [_IfExpression_]\
33-
> &nbsp;&nbsp; | [_IfLetExpression_]\
34-
> &nbsp;&nbsp; | [_MatchExpression_]
32+
> &nbsp;&nbsp; [_OuterAttribute_]<sup>\*</sup>[](#expression-attributes)\
33+
> &nbsp;&nbsp; (\
34+
> &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; [_BlockExpression_]\
35+
> &nbsp;&nbsp; &nbsp;&nbsp; | [_UnsafeBlockExpression_]\
36+
> &nbsp;&nbsp; &nbsp;&nbsp; | [_LoopExpression_]\
37+
> &nbsp;&nbsp; &nbsp;&nbsp; | [_IfExpression_]\
38+
> &nbsp;&nbsp; &nbsp;&nbsp; | [_IfLetExpression_]\
39+
> &nbsp;&nbsp; &nbsp;&nbsp; | [_MatchExpression_]\
40+
> &nbsp;&nbsp; )
3541
3642
An expression may have two roles: it always produces a *value*, and it may have
3743
*effects* (otherwise known as "side effects"). An expression *evaluates to* a
@@ -279,6 +285,30 @@ Many of the following operators and expressions can also be overloaded for
279285
other types using traits in `std::ops` or `std::cmp`. These traits also
280286
exist in `core::ops` and `core::cmp` with the same names.
281287

288+
## Expression Attributes
289+
290+
[Outer attributes][_OuterAttribute_] before an expression are allowed only in
291+
a few specific cases:
292+
293+
* Before an expression used as a [statement].
294+
* Elements of [array expressions], [tuple expressions], [call expressions],
295+
tuple-style [struct] and [enum variant] expressions.
296+
<!--
297+
These were likely stabilized inadvertently.
298+
See https://github.com/rust-lang/rust/issues/32796 and
299+
https://github.com/rust-lang/rust/issues/15701
300+
-->
301+
* The tail expression of [block expressions].
302+
303+
They are never allowed before:
304+
305+
* [`if`][_IfExpression_] and [`if let`][_IfLetExpression_] expressions.
306+
* [Range][_RangeExpression_] expressions.
307+
* Binary operator expressions ([_ArithmeticOrLogicalExpression_],
308+
[_ComparisonExpression_], [_LazyBooleanExpression_], [_TypeCastExpression_],
309+
[_AssignmentExpression_], [_CompoundAssignmentExpression_]).
310+
311+
282312
[block expressions]: expressions/block-expr.html
283313
[call expressions]: expressions/call-expr.html
284314
[closure expressions]: expressions/closure-expr.html
@@ -321,31 +351,40 @@ exist in `core::ops` and `core::cmp` with the same names.
321351
[let statement]: statements.html#let-statements
322352
[Mutable `static` items]: items/static-items.html#mutable-statics
323353
[slice]: types.html#array-and-slice-types
354+
[statement]: statements.html
324355
[static variables]: items/static-items.html
325356
[Temporary values]: #temporary-lifetimes
326357
[Variables]: variables.html
327358

359+
360+
[_ArithmeticOrLogicalExpression_]: expressions/operator-expr.html#arithmetic-and-logical-binary-operators
328361
[_ArrayExpression_]: expressions/array-expr.html
362+
[_AssignmentExpression_]: expressions/operator-expr.html#assignment-expressions
329363
[_BlockExpression_]: expressions/block-expr.html
330364
[_BreakExpression_]: expressions/loop-expr.html#break-expressions
331365
[_CallExpression_]: expressions/call-expr.html
332366
[_ClosureExpression_]: expressions/closure-expr.html
367+
[_ComparisonExpression_]: expressions/operator-expr.html#comparison-operators
368+
[_CompoundAssignmentExpression_]: expressions/operator-expr.html#compound-assignment-expressions
333369
[_ContinueExpression_]: expressions/loop-expr.html#continue-expressions
334370
[_EnumerationVariantExpression_]: expressions/enum-variant-expr.html
335371
[_FieldExpression_]: expressions/field-expr.html
336372
[_GroupedExpression_]: expressions/grouped-expr.html
337373
[_IfExpression_]: expressions/if-expr.html#if-expressions
338374
[_IfLetExpression_]: expressions/if-expr.html#if-let-expressions
339375
[_IndexExpression_]: expressions/array-expr.html#array-and-slice-indexing-expressions
376+
[_LazyBooleanExpression_]: expressions/operator-expr.html#lazy-boolean-operators
340377
[_LiteralExpression_]: expressions/literal-expr.html
341378
[_LoopExpression_]: expressions/loop-expr.html
342379
[_MatchExpression_]: expressions/match-expr.html
343380
[_MethodCallExpression_]: expressions/method-call-expr.html
344381
[_OperatorExpression_]: expressions/operator-expr.html
382+
[_OuterAttribute_]: attributes.html
345383
[_PathExpression_]: expressions/path-expr.html
346384
[_RangeExpression_]: expressions/range-expr.html
347385
[_ReturnExpression_]: expressions/return-expr.html
348386
[_StructExpression_]: expressions/struct-expr.html
349387
[_TupleExpression_]: expressions/tuple-expr.html
350388
[_TupleIndexingExpression_]: expressions/tuple-expr.html#tuple-indexing-expressions
389+
[_TypeCastExpression_]: expressions/operator-expr.html#type-cast-expressions
351390
[_UnsafeBlockExpression_]: expressions/block-expr.html#unsafe-blocks

src/statements.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ fn outer() {
5353

5454
> **<sup>Syntax</sup>**\
5555
> _LetStatement_ :\
56-
> &nbsp;&nbsp; `let` [_Pattern_] ( `:` [_Type_] )<sup>?</sup> (`=` [_Expression_] )<sup>?</sup> `;`
56+
> &nbsp;&nbsp; [_OuterAttribute_]<sup>\*</sup> `let` [_Pattern_]
57+
> ( `:` [_Type_] )<sup>?</sup> (`=` [_Expression_] )<sup>?</sup> `;`
5758
5859
A *`let` statement* introduces a new set of [variables], given by a [pattern]. The
5960
pattern is followed optionally by a type annotation and then optionally by an
@@ -123,5 +124,6 @@ statement are [`cfg`], and [the lint check attributes].
123124
[_Expression_]: expressions.html
124125
[_Item_]: items.html
125126
[_LetStatement_]: #let-statements
127+
[_OuterAttribute_]: attributes.html
126128
[_Pattern_]: patterns.html
127129
[_Type_]: types.html

0 commit comments

Comments
 (0)