|
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
|
@@ -242,6 +248,30 @@ Many of the following operators and expressions can also be overloaded for
|
242 | 248 | other types using traits in `std::ops` or `std::cmp`. These traits also
|
243 | 249 | exist in `core::ops` and `core::cmp` with the same names.
|
244 | 250 |
|
| 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 | + |
245 | 275 | [block expressions]: expressions/block-expr.html
|
246 | 276 | [call expressions]: expressions/call-expr.html
|
247 | 277 | [closure expressions]: expressions/closure-expr.html
|
@@ -285,31 +315,40 @@ exist in `core::ops` and `core::cmp` with the same names.
|
285 | 315 | [Mutable `static` items]: items/static-items.html#mutable-statics
|
286 | 316 | [const contexts]: const_eval.html
|
287 | 317 | [slice]: types.html#array-and-slice-types
|
| 318 | +[statement]: statements.html |
288 | 319 | [static variables]: items/static-items.html
|
289 | 320 | [Temporary values]: #temporary-lifetimes
|
290 | 321 | [Variables]: variables.html
|
291 | 322 |
|
| 323 | + |
| 324 | +[_ArithmeticOrLogicalExpression_]: expressions/operator-expr.html#arithmetic-and-logical-binary-operators |
292 | 325 | [_ArrayExpression_]: expressions/array-expr.html
|
| 326 | +[_AssignmentExpression_]: expressions/operator-expr.html#assignment-expressions |
293 | 327 | [_BlockExpression_]: expressions/block-expr.html
|
294 | 328 | [_BreakExpression_]: expressions/loop-expr.html#break-expressions
|
295 | 329 | [_CallExpression_]: expressions/call-expr.html
|
296 | 330 | [_ClosureExpression_]: expressions/closure-expr.html
|
| 331 | +[_ComparisonExpression_]: expressions/operator-expr.html#comparison-operators |
| 332 | +[_CompoundAssignmentExpression_]: expressions/operator-expr.html#compound-assignment-expressions |
297 | 333 | [_ContinueExpression_]: expressions/loop-expr.html#continue-expressions
|
298 | 334 | [_EnumerationVariantExpression_]: expressions/enum-variant-expr.html
|
299 | 335 | [_FieldExpression_]: expressions/field-expr.html
|
300 | 336 | [_GroupedExpression_]: expressions/grouped-expr.html
|
301 | 337 | [_IfExpression_]: expressions/if-expr.html#if-expressions
|
302 | 338 | [_IfLetExpression_]: expressions/if-expr.html#if-let-expressions
|
303 | 339 | [_IndexExpression_]: expressions/array-expr.html#array-and-slice-indexing-expressions
|
| 340 | +[_LazyBooleanExpression_]: expressions/operator-expr.html#lazy-boolean-operators |
304 | 341 | [_LiteralExpression_]: expressions/literal-expr.html
|
305 | 342 | [_LoopExpression_]: expressions/loop-expr.html
|
306 | 343 | [_MatchExpression_]: expressions/match-expr.html
|
307 | 344 | [_MethodCallExpression_]: expressions/method-call-expr.html
|
308 | 345 | [_OperatorExpression_]: expressions/operator-expr.html
|
| 346 | +[_OuterAttribute_]: attributes.html |
309 | 347 | [_PathExpression_]: expressions/path-expr.html
|
310 | 348 | [_RangeExpression_]: expressions/range-expr.html
|
311 | 349 | [_ReturnExpression_]: expressions/return-expr.html
|
312 | 350 | [_StructExpression_]: expressions/struct-expr.html
|
313 | 351 | [_TupleExpression_]: expressions/tuple-expr.html
|
314 | 352 | [_TupleIndexingExpression_]: expressions/tuple-expr.html#tuple-indexing-expressions
|
| 353 | +[_TypeCastExpression_]: expressions/operator-expr.html#type-cast-expressions |
315 | 354 | [_UnsafeBlockExpression_]: expressions/block-expr.html#unsafe-blocks
|
0 commit comments