@@ -54,17 +54,26 @@ fn outer() {
5454> ** <sup >Syntax</sup >** \
5555> _ LetStatement_ :\
5656>   ;  ; [ _ 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
6364an error if insufficient type information is available for definite
6465inference. Any variables introduced by a variable declaration are visible
6566from the point of declaration until the end of the enclosing block scope,
6667except 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