|
2 | 2 |
|
3 | 3 | > **<sup>Syntax</sup>**\ |
4 | 4 | > _Expression_ :\ |
5 | | -> [_LiteralExpression_]\ |
6 | | -> | [_PathExpression_]\ |
7 | | -> | [_BlockExpression_]\ |
8 | | -> | [_OperatorExpression_]\ |
9 | | -> | [_GroupedExpression_]\ |
10 | | -> | [_ArrayExpression_]\ |
11 | | -> | [_IndexExpression_]\ |
12 | | -> | [_TupleExpression_]\ |
13 | | -> | [_TupleIndexingExpression_]\ |
14 | | -> | [_StructExpression_]\ |
15 | | -> | [_EnumerationVariantExpression_]\ |
16 | | -> | [_CallExpression_]\ |
17 | | -> | [_MethodCallExpression_]\ |
18 | | -> | [_FieldExpression_]\ |
19 | | -> | [_ClosureExpression_]\ |
20 | | -> | [_LoopExpression_]\ |
21 | | -> | [_ContinueExpression_]\ |
22 | | -> | [_BreakExpression_]\ |
23 | | -> | [_RangeExpression_]\ |
24 | | -> | [_IfExpression_]\ |
25 | | -> | [_IfLetExpression_]\ |
26 | | -> | [_MatchExpression_]\ |
27 | | -> | [_ReturnExpression_] |
| 5 | +> _ExpressionWithoutBlock_\ |
| 6 | +> | _ExpressionWithBlock_ |
| 7 | +> |
| 8 | +> _ExpressionWithoutBlock_ :\ |
| 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 | +> ) |
| 30 | +> |
| 31 | +> _ExpressionWithBlock_ :\ |
| 32 | +> [_OuterAttribute_]<sup>\*</sup>[†](#expression-attributes)\ |
| 33 | +> (\ |
| 34 | +> [_BlockExpression_]\ |
| 35 | +> | [_UnsafeBlockExpression_]\ |
| 36 | +> | [_LoopExpression_]\ |
| 37 | +> | [_IfExpression_]\ |
| 38 | +> | [_IfLetExpression_]\ |
| 39 | +> | [_MatchExpression_]\ |
| 40 | +> ) |
28 | 41 |
|
29 | 42 | An expression may have two roles: it always produces a *value*, and it may have |
30 | 43 | *effects* (otherwise known as "side effects"). An expression *evaluates to* a |
@@ -235,6 +248,31 @@ Many of the following operators and expressions can also be overloaded for |
235 | 248 | other types using traits in `std::ops` or `std::cmp`. These traits also |
236 | 249 | exist in `core::ops` and `core::cmp` with the same names. |
237 | 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 | +<!-- Keep list in sync with block-expr.md --> |
| 266 | + |
| 267 | +They are never allowed before: |
| 268 | + |
| 269 | +* [`if`][_IfExpression_] and [`if let`][_IfLetExpression_] expressions. |
| 270 | +* [Range][_RangeExpression_] expressions. |
| 271 | +* Binary operator expressions ([_ArithmeticOrLogicalExpression_], |
| 272 | + [_ComparisonExpression_], [_LazyBooleanExpression_], [_TypeCastExpression_], |
| 273 | + [_AssignmentExpression_], [_CompoundAssignmentExpression_]). |
| 274 | + |
| 275 | + |
238 | 276 | [block expressions]: expressions/block-expr.html |
239 | 277 | [call expressions]: expressions/call-expr.html |
240 | 278 | [closure expressions]: expressions/closure-expr.html |
@@ -278,30 +316,40 @@ exist in `core::ops` and `core::cmp` with the same names. |
278 | 316 | [Mutable `static` items]: items/static-items.html#mutable-statics |
279 | 317 | [const contexts]: const_eval.html |
280 | 318 | [slice]: types.html#array-and-slice-types |
| 319 | +[statement]: statements.html |
281 | 320 | [static variables]: items/static-items.html |
282 | 321 | [Temporary values]: #temporary-lifetimes |
283 | 322 | [Variables]: variables.html |
284 | 323 |
|
| 324 | + |
| 325 | +[_ArithmeticOrLogicalExpression_]: expressions/operator-expr.html#arithmetic-and-logical-binary-operators |
285 | 326 | [_ArrayExpression_]: expressions/array-expr.html |
| 327 | +[_AssignmentExpression_]: expressions/operator-expr.html#assignment-expressions |
286 | 328 | [_BlockExpression_]: expressions/block-expr.html |
287 | 329 | [_BreakExpression_]: expressions/loop-expr.html#break-expressions |
288 | 330 | [_CallExpression_]: expressions/call-expr.html |
289 | 331 | [_ClosureExpression_]: expressions/closure-expr.html |
| 332 | +[_ComparisonExpression_]: expressions/operator-expr.html#comparison-operators |
| 333 | +[_CompoundAssignmentExpression_]: expressions/operator-expr.html#compound-assignment-expressions |
290 | 334 | [_ContinueExpression_]: expressions/loop-expr.html#continue-expressions |
291 | 335 | [_EnumerationVariantExpression_]: expressions/enum-variant-expr.html |
292 | 336 | [_FieldExpression_]: expressions/field-expr.html |
293 | 337 | [_GroupedExpression_]: expressions/grouped-expr.html |
294 | 338 | [_IfExpression_]: expressions/if-expr.html#if-expressions |
295 | 339 | [_IfLetExpression_]: expressions/if-expr.html#if-let-expressions |
296 | 340 | [_IndexExpression_]: expressions/array-expr.html#array-and-slice-indexing-expressions |
| 341 | +[_LazyBooleanExpression_]: expressions/operator-expr.html#lazy-boolean-operators |
297 | 342 | [_LiteralExpression_]: expressions/literal-expr.html |
298 | 343 | [_LoopExpression_]: expressions/loop-expr.html |
299 | 344 | [_MatchExpression_]: expressions/match-expr.html |
300 | 345 | [_MethodCallExpression_]: expressions/method-call-expr.html |
301 | 346 | [_OperatorExpression_]: expressions/operator-expr.html |
| 347 | +[_OuterAttribute_]: attributes.html |
302 | 348 | [_PathExpression_]: expressions/path-expr.html |
303 | 349 | [_RangeExpression_]: expressions/range-expr.html |
304 | 350 | [_ReturnExpression_]: expressions/return-expr.html |
305 | 351 | [_StructExpression_]: expressions/struct-expr.html |
306 | 352 | [_TupleExpression_]: expressions/tuple-expr.html |
307 | 353 | [_TupleIndexingExpression_]: expressions/tuple-expr.html#tuple-indexing-expressions |
| 354 | +[_TypeCastExpression_]: expressions/operator-expr.html#type-cast-expressions |
| 355 | +[_UnsafeBlockExpression_]: expressions/block-expr.html#unsafe-blocks |
0 commit comments