@@ -53,9 +53,13 @@ declaration until the end of the enclosing block scope.
5353
5454An * expression statement* is one that evaluates an [ expression] and ignores its
5555result. As a rule, an expression statement's purpose is to trigger the effects
56- of evaluating its expression. An expression that consists of only a [ block
57- expression] [ block ] or control flow expression and that does not end a block
58- can also be used as an expression statement by omitting the trailing semicolon.
56+ of evaluating its expression.
57+
58+ An expression that consists of only a [ block expression] [ block ] or control flow
59+ expression, if used in a context where a statement is permitted, can omit the
60+ trailing semicolon. This can cause an ambiguity between it being parsed as a
61+ standalone statement and as a part of another expression; in this case, it is
62+ parsed as a statement.
5963
6064``` rust
6165# let mut v = vec! [1 , 2 , 3 ];
@@ -68,10 +72,25 @@ if v.is_empty() {
6872[1 ]; // Separate expression statement, not an indexing expression.
6973```
7074
75+ When the trailing semicolon is omitted, the result must be type ` () ` .
76+
77+ ``` rust
78+ // bad: the block's type is i32, not ()
79+ // Error: expected `()` because of default return type
80+ // if true {
81+ // 1
82+ // }
83+
84+ // good: the block's type is i32
85+ if true {
86+ 1
87+ };
88+ ```
89+
7190[ block ] : expressions/block-expr.html
7291[ expression ] : expressions.html
7392[ function ] : items/functions.html
7493[ item ] : items.html
7594[ module ] : items/modules.html
7695[ canonical path ] : path.html#canonical-paths
77- [ implementations ] : items/implementations.html
96+ [ implementations ] : items/implementations.html
0 commit comments