Skip to content

Commit 6eaf971

Browse files
authored
Rollup merge of #121892 - Zalathar:expr-kind-let, r=Nadrieril
The ordinary lowering of `thir::ExprKind::Let` is unreachable After desugaring, `let` expressions should only appear inside `if` expressions or `match` guards, possibly nested within a let-chain. In both cases they are specifically handled by the lowerings of those expressions, so this case is currently unreachable. --- Context: https://rust-lang.zulipchat.com/#narrow/stream/182449-t-compiler.2Fhelp/topic/Lowering.20of.20.60thir.3A.3AExprKind.3A.3ALet.60.20is.20unreachable My conclusions are partly based on the observation that stubbing out this match arm doesn't cause any test failures. So either this really is unreachable, or it can be reached in some obscure circumstances that our test suite doesn't cover. If we end up needing this code (or something like it) for an implementation of rust-lang/rfcs#3573, it should be easy enough to pull it back out of version control history. I looked into having the `if`/`match` lowerings call back into `expr_into_dest`, but from what I can tell that won't work well, because there are extra scoping considerations that require some awareness of the enclosing if/match. r? ``@Nadrieril``
2 parents e5efece + 972d8da commit 6eaf971

File tree

1 file changed

+6
-32
lines changed
  • compiler/rustc_mir_build/src/build/expr

1 file changed

+6
-32
lines changed

compiler/rustc_mir_build/src/build/expr/into.rs

+6-32
Original file line numberDiff line numberDiff line change
@@ -109,38 +109,12 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
109109
this.cfg.goto(else_blk, source_info, join_block);
110110
join_block.unit()
111111
}
112-
ExprKind::Let { expr, ref pat } => {
113-
let scope = this.local_scope();
114-
let (true_block, false_block) = this.in_if_then_scope(scope, expr_span, |this| {
115-
this.lower_let_expr(block, expr, pat, scope, None, expr_span, true)
116-
});
117-
118-
this.cfg.push_assign_constant(
119-
true_block,
120-
source_info,
121-
destination,
122-
ConstOperand {
123-
span: expr_span,
124-
user_ty: None,
125-
const_: Const::from_bool(this.tcx, true),
126-
},
127-
);
128-
129-
this.cfg.push_assign_constant(
130-
false_block,
131-
source_info,
132-
destination,
133-
ConstOperand {
134-
span: expr_span,
135-
user_ty: None,
136-
const_: Const::from_bool(this.tcx, false),
137-
},
138-
);
139-
140-
let join_block = this.cfg.start_new_block();
141-
this.cfg.goto(true_block, source_info, join_block);
142-
this.cfg.goto(false_block, source_info, join_block);
143-
join_block.unit()
112+
ExprKind::Let { .. } => {
113+
// After desugaring, `let` expressions should only appear inside `if`
114+
// expressions or `match` guards, possibly nested within a let-chain.
115+
// In both cases they are specifically handled by the lowerings of
116+
// those expressions, so this case is currently unreachable.
117+
span_bug!(expr_span, "unexpected let expression outside of if or match-guard");
144118
}
145119
ExprKind::NeverToAny { source } => {
146120
let source_expr = &this.thir[source];

0 commit comments

Comments
 (0)