diff options
| author | LeSeulArtichaut <leseulartichaut@gmail.com> | 2020-11-11 16:14:04 +0100 |
|---|---|---|
| committer | LeSeulArtichaut <leseulartichaut@gmail.com> | 2020-12-06 11:48:08 +0100 |
| commit | cfaaa21e2a8d0871be0e1e0120ead44e7c8c3625 (patch) | |
| tree | 7ba334918fffb336d06013be06d69de38cf952ed /compiler/rustc_passes/src | |
| parent | f9cc626028d5ae1bcecf4703fae59d165338ee20 (diff) | |
| download | rust-cfaaa21e2a8d0871be0e1e0120ead44e7c8c3625.tar.gz rust-cfaaa21e2a8d0871be0e1e0120ead44e7c8c3625.zip | |
Implement liveness passes for if-let guards
Diffstat (limited to 'compiler/rustc_passes/src')
| -rw-r--r-- | compiler/rustc_passes/src/liveness.rs | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/compiler/rustc_passes/src/liveness.rs b/compiler/rustc_passes/src/liveness.rs index debb873beb9..5ff5fd3a6b6 100644 --- a/compiler/rustc_passes/src/liveness.rs +++ b/compiler/rustc_passes/src/liveness.rs @@ -358,6 +358,9 @@ impl<'tcx> Visitor<'tcx> for IrMaps<'tcx> { fn visit_arm(&mut self, arm: &'tcx hir::Arm<'tcx>) { self.add_from_pat(&arm.pat); + if let Some(hir::Guard::IfLet(ref pat, _)) = arm.guard { + self.add_from_pat(pat); + } intravisit::walk_arm(self, arm); } @@ -1029,10 +1032,13 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> { for arm in arms { let body_succ = self.propagate_through_expr(&arm.body, succ); - let guard_succ = self.propagate_through_opt_expr( - arm.guard.as_ref().map(|hir::Guard::If(e)| *e), - body_succ, - ); + let guard_succ = arm.guard.as_ref().map_or(body_succ, |g| match g { + hir::Guard::If(e) => self.propagate_through_expr(e, body_succ), + hir::Guard::IfLet(pat, e) => { + let let_bind = self.define_bindings_in_pat(pat, body_succ); + self.propagate_through_expr(e, let_bind) + } + }); let arm_succ = self.define_bindings_in_pat(&arm.pat, guard_succ); self.merge_from_succ(ln, arm_succ, first_merge); first_merge = false; |
