Skip to content

Commit b30ee54

Browse files
committed
Document let else statements
1 parent a7cdac3 commit b30ee54

File tree

1 file changed

+17
-5
lines changed

1 file changed

+17
-5
lines changed

src/statements.md

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,17 +54,26 @@ fn outer() {
5454
> **<sup>Syntax</sup>**\
5555
> _LetStatement_ :\
5656
> &nbsp;&nbsp; [_OuterAttribute_]<sup>\*</sup> `let` [_PatternNoTopAlt_]
57-
> ( `:` [_Type_] )<sup>?</sup> (`=` [_Expression_] )<sup>?</sup> `;`
57+
> ( `:` [_Type_] )<sup>?</sup> (`=` [_Expression_]
58+
> ( `else` [_BlockExpression_]) <sup>?</sup> ) <sup>?</sup> `;`
5859
59-
A *`let` statement* introduces a new set of [variables], given by an
60-
irrefutable [pattern]. The pattern is followed optionally by a type
61-
annotation and then optionally by an initializer expression. When no
62-
type annotation is given, the compiler will infer the type, or signal
60+
A *`let` statement* introduces a new set of [variables], given by a [pattern].
61+
The pattern is followed optionally by a type annotation and then either ends,
62+
or is followed by an initializer expression plus an optional `else` block.
63+
When no type annotation is given, the compiler will infer the type, or signal
6364
an error if insufficient type information is available for definite
6465
inference. Any variables introduced by a variable declaration are visible
6566
from the point of declaration until the end of the enclosing block scope,
6667
except when they are shadowed by another variable declaration.
6768

69+
If an `else` block is not present, the pattern must be irrefutable.
70+
If an `else` block is present, the pattern may be refutable.
71+
If the pattern does not match (this requires it to be refutable), the `else`
72+
block is executed.
73+
The `else` block must always diverge (evaluate to the [never type]).
74+
If an `else` block is present, restrictions apply on the expression:
75+
It must not be a [_LazyBooleanExpression_], or end in a `}` token.
76+
6877
## Expression statements
6978

7079
> **<sup>Syntax</sup>**\
@@ -121,16 +130,19 @@ statement are [`cfg`], and [the lint check attributes].
121130
[function]: items/functions.md
122131
[item]: items.md
123132
[module]: items/modules.md
133+
[never type]: types/never.md
124134
[canonical path]: paths.md#canonical-paths
125135
[implementations]: items/implementations.md
126136
[variables]: variables.md
127137
[outer attributes]: attributes.md
128138
[`cfg`]: conditional-compilation.md
129139
[the lint check attributes]: attributes/diagnostics.md#lint-check-attributes
130140
[pattern]: patterns.md
141+
[_BlockExpression_]: expressions/block-expr.md
131142
[_ExpressionStatement_]: #expression-statements
132143
[_Expression_]: expressions.md
133144
[_Item_]: items.md
145+
[_LazyBooleanExpression_]: expressions/operator-expr.md#lazy-boolean-operators
134146
[_LetStatement_]: #let-statements
135147
[_MacroInvocationSemi_]: macros.md#macro-invocation
136148
[_OuterAttribute_]: attributes.md

0 commit comments

Comments
 (0)