@@ -54,17 +54,27 @@ 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_ ] [ † ] (#let-else-restriction)
58
+ > ( ` else ` [ _ BlockExpression_ ] ) <sup >?</sup > ) <sup >?</sup > ` ; `
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
+ <span id =" let-else-restriction " >† When an ` else ` block is specified, the
61
+ _ Expression_ must not be a [ _ LazyBooleanExpression_ ] , or end with a ` } ` .</span >
62
+
63
+ A * ` let ` statement* introduces a new set of [ variables] , given by a [ pattern] .
64
+ The pattern is followed optionally by a type annotation and then either ends,
65
+ or is followed by an initializer expression plus an optional ` else ` block.
66
+ When no type annotation is given, the compiler will infer the type, or signal
63
67
an error if insufficient type information is available for definite
64
68
inference. Any variables introduced by a variable declaration are visible
65
69
from the point of declaration until the end of the enclosing block scope,
66
70
except when they are shadowed by another variable declaration.
67
71
72
+ If an ` else ` block is not present, the pattern must be irrefutable.
73
+ If an ` else ` block is present, the pattern may be refutable.
74
+ If the pattern does not match (this requires it to be refutable), the ` else `
75
+ block is executed.
76
+ The ` else ` block must always diverge (evaluate to the [ never type] ).
77
+
68
78
## Expression statements
69
79
70
80
> ** <sup >Syntax</sup >** \
@@ -121,16 +131,19 @@ statement are [`cfg`], and [the lint check attributes].
121
131
[ function ] : items/functions.md
122
132
[ item ] : items.md
123
133
[ module ] : items/modules.md
134
+ [ never type ] : types/never.md
124
135
[ canonical path ] : paths.md#canonical-paths
125
136
[ implementations ] : items/implementations.md
126
137
[ variables ] : variables.md
127
138
[ outer attributes ] : attributes.md
128
139
[ `cfg` ] : conditional-compilation.md
129
140
[ the lint check attributes ] : attributes/diagnostics.md#lint-check-attributes
130
141
[ pattern ] : patterns.md
142
+ [ _BlockExpression_ ] : expressions/block-expr.md
131
143
[ _ExpressionStatement_ ] : #expression-statements
132
144
[ _Expression_ ] : expressions.md
133
145
[ _Item_ ] : items.md
146
+ [ _LazyBooleanExpression_ ] : expressions/operator-expr.md#lazy-boolean-operators
134
147
[ _LetStatement_ ] : #let-statements
135
148
[ _MacroInvocationSemi_ ] : macros.md#macro-invocation
136
149
[ _OuterAttribute_ ] : attributes.md
0 commit comments