Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 7396fd1

Browse files
committed
Clarify how lowering if produces then/else blocks
This makes it easier to see that the call to `in_scope` returns both the then block and the else block. The rather confusing `unpack!` step is confined to its own separate line. (This patch reindents several lines, so using "ignore whitespace" is recommended in order to focus on the actual changes.)
1 parent 62415e2 commit 7396fd1

File tree

1 file changed

+31
-30
lines changed
  • compiler/rustc_mir_build/src/build/expr

1 file changed

+31
-30
lines changed

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

Lines changed: 31 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -58,42 +58,43 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
5858
this.thir[scrutinee].span,
5959
),
6060
ExprKind::If { cond, then, else_opt, if_then_scope } => {
61-
let then_blk;
6261
let then_span = this.thir[then].span;
6362
let then_source_info = this.source_info(then_span);
6463
let condition_scope = this.local_scope();
6564

66-
let mut else_blk = unpack!(
67-
then_blk = this.in_scope(
68-
(if_then_scope, then_source_info),
69-
LintLevel::Inherited,
70-
|this| {
71-
let source_info = if this.is_let(cond) {
72-
let variable_scope =
73-
this.new_source_scope(then_span, LintLevel::Inherited, None);
74-
this.source_scope = variable_scope;
75-
SourceInfo { span: then_span, scope: variable_scope }
76-
} else {
77-
this.source_info(then_span)
78-
};
79-
let (then_block, else_block) =
80-
this.in_if_then_scope(condition_scope, then_span, |this| {
81-
let then_blk = unpack!(this.then_else_break(
82-
block,
83-
cond,
84-
Some(condition_scope), // Temp scope
85-
condition_scope,
86-
source_info,
87-
true, // Declare `let` bindings normally
88-
));
89-
90-
this.expr_into_dest(destination, then_blk, then)
91-
});
92-
then_block.and(else_block)
93-
},
94-
)
65+
let then_and_else_blocks = this.in_scope(
66+
(if_then_scope, then_source_info),
67+
LintLevel::Inherited,
68+
|this| {
69+
let source_info = if this.is_let(cond) {
70+
let variable_scope =
71+
this.new_source_scope(then_span, LintLevel::Inherited, None);
72+
this.source_scope = variable_scope;
73+
SourceInfo { span: then_span, scope: variable_scope }
74+
} else {
75+
this.source_info(then_span)
76+
};
77+
let (then_block, else_block) =
78+
this.in_if_then_scope(condition_scope, then_span, |this| {
79+
let then_blk = unpack!(this.then_else_break(
80+
block,
81+
cond,
82+
Some(condition_scope), // Temp scope
83+
condition_scope,
84+
source_info,
85+
true, // Declare `let` bindings normally
86+
));
87+
88+
this.expr_into_dest(destination, then_blk, then)
89+
});
90+
then_block.and(else_block)
91+
},
9592
);
9693

94+
// Unpack `BlockAnd<BasicBlock>` into `(then_blk, else_blk)`.
95+
let (then_blk, mut else_blk);
96+
else_blk = unpack!(then_blk = then_and_else_blocks);
97+
9798
else_blk = if let Some(else_opt) = else_opt {
9899
unpack!(this.expr_into_dest(destination, else_blk, else_opt))
99100
} else {

0 commit comments

Comments
 (0)