Skip to content

Commit e4c1770

Browse files
committed
Update statements and expressions with outer attributes.
1 parent f6f65fe commit e4c1770

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
@@ -242,6 +248,30 @@ Many of the following operators and expressions can also be overloaded for
242248
other types using traits in `std::ops` or `std::cmp`. These traits also
243249
exist in `core::ops` and `core::cmp` with the same names.
244250

251+
## Expression Attributes
252+
253+
[Outer attributes][_OuterAttribute_] before an expression are allowed only in
254+
a few specific cases:
255+
256+
* Before an expression used as a [statement].
257+
* Elements of [array expressions], [tuple expressions], [call expressions],
258+
tuple-style [struct] and [enum variant] expressions.
259+
<!--
260+
These were likely stabilized inadvertently.
261+
See https://github.com/rust-lang/rust/issues/32796 and
262+
https://github.com/rust-lang/rust/issues/15701
263+
-->
264+
* The tail expression of [block expressions].
265+
266+
They are never allowed before:
267+
268+
* [`if`][_IfExpression_] and [`if let`][_IfLetExpression_] expressions.
269+
* [Range][_RangeExpression_] expressions.
270+
* Binary operator expressions ([_ArithmeticOrLogicalExpression_],
271+
[_ComparisonExpression_], [_LazyBooleanExpression_], [_TypeCastExpression_],
272+
[_AssignmentExpression_], [_CompoundAssignmentExpression_]).
273+
274+
245275
[block expressions]: expressions/block-expr.html
246276
[call expressions]: expressions/call-expr.html
247277
[closure expressions]: expressions/closure-expr.html
@@ -285,31 +315,40 @@ exist in `core::ops` and `core::cmp` with the same names.
285315
[Mutable `static` items]: items/static-items.html#mutable-statics
286316
[const contexts]: const_eval.html
287317
[slice]: types.html#array-and-slice-types
318+
[statement]: statements.html
288319
[static variables]: items/static-items.html
289320
[Temporary values]: #temporary-lifetimes
290321
[Variables]: variables.html
291322

323+
324+
[_ArithmeticOrLogicalExpression_]: expressions/operator-expr.html#arithmetic-and-logical-binary-operators
292325
[_ArrayExpression_]: expressions/array-expr.html
326+
[_AssignmentExpression_]: expressions/operator-expr.html#assignment-expressions
293327
[_BlockExpression_]: expressions/block-expr.html
294328
[_BreakExpression_]: expressions/loop-expr.html#break-expressions
295329
[_CallExpression_]: expressions/call-expr.html
296330
[_ClosureExpression_]: expressions/closure-expr.html
331+
[_ComparisonExpression_]: expressions/operator-expr.html#comparison-operators
332+
[_CompoundAssignmentExpression_]: expressions/operator-expr.html#compound-assignment-expressions
297333
[_ContinueExpression_]: expressions/loop-expr.html#continue-expressions
298334
[_EnumerationVariantExpression_]: expressions/enum-variant-expr.html
299335
[_FieldExpression_]: expressions/field-expr.html
300336
[_GroupedExpression_]: expressions/grouped-expr.html
301337
[_IfExpression_]: expressions/if-expr.html#if-expressions
302338
[_IfLetExpression_]: expressions/if-expr.html#if-let-expressions
303339
[_IndexExpression_]: expressions/array-expr.html#array-and-slice-indexing-expressions
340+
[_LazyBooleanExpression_]: expressions/operator-expr.html#lazy-boolean-operators
304341
[_LiteralExpression_]: expressions/literal-expr.html
305342
[_LoopExpression_]: expressions/loop-expr.html
306343
[_MatchExpression_]: expressions/match-expr.html
307344
[_MethodCallExpression_]: expressions/method-call-expr.html
308345
[_OperatorExpression_]: expressions/operator-expr.html
346+
[_OuterAttribute_]: attributes.html
309347
[_PathExpression_]: expressions/path-expr.html
310348
[_RangeExpression_]: expressions/range-expr.html
311349
[_ReturnExpression_]: expressions/return-expr.html
312350
[_StructExpression_]: expressions/struct-expr.html
313351
[_TupleExpression_]: expressions/tuple-expr.html
314352
[_TupleIndexingExpression_]: expressions/tuple-expr.html#tuple-indexing-expressions
353+
[_TypeCastExpression_]: expressions/operator-expr.html#type-cast-expressions
315354
[_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)