|
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