@@ -54,17 +54,25 @@ fn outer() {
54
54
> ** <sup >Syntax</sup >** \
55
55
> _ LetStatement_ :\
56
56
>   ;  ; [ _ OuterAttribute_ ] <sup >\* </sup > ` let ` [ _ PatternNoTopAlt_ ]
57
- > ( ` : ` [ _ Type_ ] )<sup >?</sup > (` = ` [ _ Expression_ ] )<sup >?</sup > ` ; `
57
+ > ( ` : ` [ _ Type_ ] )<sup >?</sup > ( | ` = ` [ _ Expression_ ] | ` = ` [ _ Expression_ ]
58
+ > ` else ` [ _ BlockExpression_ ] ) ` ; `
58
59
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
63
64
an error if insufficient type information is available for definite
64
65
inference. Any variables introduced by a variable declaration are visible
65
66
from the point of declaration until the end of the enclosing block scope,
66
67
except when they are shadowed by another variable declaration.
67
68
69
+ If an ` else ` block is not present, the pattern has to be irrefutable.
70
+ If an ` else ` block is present, the pattern may be refutable, and if it is, it
71
+ will be checked on run time. On a mismatch, the ` else ` block is executed.
72
+ The ` else ` block has to always diverge (evaluate to type ` ! ` ).
73
+ If an ` else ` block is present, restrictions apply on the expression:
74
+ It might not be a [ _ LazyBooleanExpression_ ] , or end in a ` } ` token.
75
+
68
76
## Expression statements
69
77
70
78
> ** <sup >Syntax</sup >** \
@@ -128,9 +136,11 @@ statement are [`cfg`], and [the lint check attributes].
128
136
[ `cfg` ] : conditional-compilation.md
129
137
[ the lint check attributes ] : attributes/diagnostics.md#lint-check-attributes
130
138
[ pattern ] : patterns.md
139
+ [ _BlockExpression_ ] : expressions/block-expr.md
131
140
[ _ExpressionStatement_ ] : #expression-statements
132
141
[ _Expression_ ] : expressions.md
133
142
[ _Item_ ] : items.md
143
+ [ _LazyBooleanExpression_ ] : expressions/operator-expr.md#lazy-boolean-operators
134
144
[ _LetStatement_ ] : #let-statements
135
145
[ _MacroInvocationSemi_ ] : macros.md#macro-invocation
136
146
[ _OuterAttribute_ ] : attributes.md
0 commit comments