Restore if let guard temporary scoping difference
Match guards with an if let guard or an if let chain guard should have a temporary scope of the whole arm. This is to allow ref bindings to temporaries to borrow check.
This commit is contained in:
parent
a549711f6e
commit
1a267e3f40
3 changed files with 89 additions and 2 deletions
|
@ -177,6 +177,14 @@ fn resolve_block<'tcx>(visitor: &mut RegionResolutionVisitor<'tcx>, blk: &'tcx h
|
|||
}
|
||||
|
||||
fn resolve_arm<'tcx>(visitor: &mut RegionResolutionVisitor<'tcx>, arm: &'tcx hir::Arm<'tcx>) {
|
||||
fn has_let_expr(expr: &Expr<'_>) -> bool {
|
||||
match &expr.kind {
|
||||
hir::ExprKind::Binary(_, lhs, rhs) => has_let_expr(lhs) || has_let_expr(rhs),
|
||||
hir::ExprKind::Let(..) => true,
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
||||
let prev_cx = visitor.cx;
|
||||
|
||||
visitor.terminating_scopes.insert(arm.hir_id.local_id);
|
||||
|
@ -184,8 +192,9 @@ fn resolve_arm<'tcx>(visitor: &mut RegionResolutionVisitor<'tcx>, arm: &'tcx hir
|
|||
visitor.enter_node_scope_with_dtor(arm.hir_id.local_id);
|
||||
visitor.cx.var_parent = visitor.cx.parent;
|
||||
|
||||
if let Some(expr) = arm.guard {
|
||||
// Check for if??
|
||||
if let Some(expr) = arm.guard
|
||||
&& !has_let_expr(expr)
|
||||
{
|
||||
visitor.terminating_scopes.insert(expr.hir_id.local_id);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue