|
6 | 6 | > | _ExpressionWithBlock_
|
7 | 7 | >
|
8 | 8 | > _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 | +> [_OuterAttribute_]<sup>\*</sup>[†](#expression-attributes)\ |
| 10 | +> (\ |
| 11 | +> [_LiteralExpression_]\ |
| 12 | +> | [_PathExpression_]\ |
| 13 | +> | [_OperatorExpression_]\ |
| 14 | +> | [_GroupedExpression_]\ |
| 15 | +> | [_ArrayExpression_]\ |
| 16 | +> | [_IndexExpression_]\ |
| 17 | +> | [_TupleExpression_]\ |
| 18 | +> | [_TupleIndexingExpression_]\ |
| 19 | +> | [_StructExpression_]\ |
| 20 | +> | [_EnumerationVariantExpression_]\ |
| 21 | +> | [_CallExpression_]\ |
| 22 | +> | [_MethodCallExpression_]\ |
| 23 | +> | [_FieldExpression_]\ |
| 24 | +> | [_ClosureExpression_]\ |
| 25 | +> | [_ContinueExpression_]\ |
| 26 | +> | [_BreakExpression_]\ |
| 27 | +> | [_RangeExpression_]\ |
| 28 | +> | [_ReturnExpression_]\ |
| 29 | +> ) |
27 | 30 | >
|
28 | 31 | > _ExpressionWithBlock_ :\
|
29 |
| -> [_BlockExpression_]\ |
30 |
| -> | [_UnsafeBlockExpression_]\ |
31 |
| -> | [_LoopExpression_]\ |
32 |
| -> | [_IfExpression_]\ |
33 |
| -> | [_IfLetExpression_]\ |
34 |
| -> | [_MatchExpression_] |
| 32 | +> [_OuterAttribute_]<sup>\*</sup>[†](#expression-attributes)\ |
| 33 | +> (\ |
| 34 | +> [_BlockExpression_]\ |
| 35 | +> | [_UnsafeBlockExpression_]\ |
| 36 | +> | [_LoopExpression_]\ |
| 37 | +> | [_IfExpression_]\ |
| 38 | +> | [_IfLetExpression_]\ |
| 39 | +> | [_MatchExpression_]\ |
| 40 | +> ) |
35 | 41 |
|
36 | 42 | An expression may have two roles: it always produces a *value*, and it may have
|
37 | 43 | *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
|
279 | 285 | other types using traits in `std::ops` or `std::cmp`. These traits also
|
280 | 286 | exist in `core::ops` and `core::cmp` with the same names.
|
281 | 287 |
|
| 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 | + |
282 | 312 | [block expressions]: expressions/block-expr.html
|
283 | 313 | [call expressions]: expressions/call-expr.html
|
284 | 314 | [closure expressions]: expressions/closure-expr.html
|
@@ -321,31 +351,40 @@ exist in `core::ops` and `core::cmp` with the same names.
|
321 | 351 | [let statement]: statements.html#let-statements
|
322 | 352 | [Mutable `static` items]: items/static-items.html#mutable-statics
|
323 | 353 | [slice]: types.html#array-and-slice-types
|
| 354 | +[statement]: statements.html |
324 | 355 | [static variables]: items/static-items.html
|
325 | 356 | [Temporary values]: #temporary-lifetimes
|
326 | 357 | [Variables]: variables.html
|
327 | 358 |
|
| 359 | + |
| 360 | +[_ArithmeticOrLogicalExpression_]: expressions/operator-expr.html#arithmetic-and-logical-binary-operators |
328 | 361 | [_ArrayExpression_]: expressions/array-expr.html
|
| 362 | +[_AssignmentExpression_]: expressions/operator-expr.html#assignment-expressions |
329 | 363 | [_BlockExpression_]: expressions/block-expr.html
|
330 | 364 | [_BreakExpression_]: expressions/loop-expr.html#break-expressions
|
331 | 365 | [_CallExpression_]: expressions/call-expr.html
|
332 | 366 | [_ClosureExpression_]: expressions/closure-expr.html
|
| 367 | +[_ComparisonExpression_]: expressions/operator-expr.html#comparison-operators |
| 368 | +[_CompoundAssignmentExpression_]: expressions/operator-expr.html#compound-assignment-expressions |
333 | 369 | [_ContinueExpression_]: expressions/loop-expr.html#continue-expressions
|
334 | 370 | [_EnumerationVariantExpression_]: expressions/enum-variant-expr.html
|
335 | 371 | [_FieldExpression_]: expressions/field-expr.html
|
336 | 372 | [_GroupedExpression_]: expressions/grouped-expr.html
|
337 | 373 | [_IfExpression_]: expressions/if-expr.html#if-expressions
|
338 | 374 | [_IfLetExpression_]: expressions/if-expr.html#if-let-expressions
|
339 | 375 | [_IndexExpression_]: expressions/array-expr.html#array-and-slice-indexing-expressions
|
| 376 | +[_LazyBooleanExpression_]: expressions/operator-expr.html#lazy-boolean-operators |
340 | 377 | [_LiteralExpression_]: expressions/literal-expr.html
|
341 | 378 | [_LoopExpression_]: expressions/loop-expr.html
|
342 | 379 | [_MatchExpression_]: expressions/match-expr.html
|
343 | 380 | [_MethodCallExpression_]: expressions/method-call-expr.html
|
344 | 381 | [_OperatorExpression_]: expressions/operator-expr.html
|
| 382 | +[_OuterAttribute_]: attributes.html |
345 | 383 | [_PathExpression_]: expressions/path-expr.html
|
346 | 384 | [_RangeExpression_]: expressions/range-expr.html
|
347 | 385 | [_ReturnExpression_]: expressions/return-expr.html
|
348 | 386 | [_StructExpression_]: expressions/struct-expr.html
|
349 | 387 | [_TupleExpression_]: expressions/tuple-expr.html
|
350 | 388 | [_TupleIndexingExpression_]: expressions/tuple-expr.html#tuple-indexing-expressions
|
| 389 | +[_TypeCastExpression_]: expressions/operator-expr.html#type-cast-expressions |
351 | 390 | [_UnsafeBlockExpression_]: expressions/block-expr.html#unsafe-blocks
|
0 commit comments