or-patterns: remove hack from lowering.
diff --git a/src/librustc/hir/lowering.rs b/src/librustc/hir/lowering.rs
index 58789a1..a5f08cd 100644
--- a/src/librustc/hir/lowering.rs
+++ b/src/librustc/hir/lowering.rs
@@ -434,35 +434,6 @@
visit::walk_pat(self, p)
}
- // HACK(or_patterns; Centril | dlrobertson): Avoid creating
- // HIR nodes for `PatKind::Or` for the top level of a `ast::Arm`.
- // This is a temporary hack that should go away once we push down
- // `arm.pats: HirVec<P<Pat>>` -> `arm.pat: P<Pat>` to HIR. // Centril
- fn visit_arm(&mut self, arm: &'tcx Arm) {
- match &arm.pat.node {
- PatKind::Or(pats) => pats.iter().for_each(|p| self.visit_pat(p)),
- _ => self.visit_pat(&arm.pat),
- }
- walk_list!(self, visit_expr, &arm.guard);
- self.visit_expr(&arm.body);
- walk_list!(self, visit_attribute, &arm.attrs);
- }
-
- // HACK(or_patterns; Centril | dlrobertson): Same as above. // Centril
- fn visit_expr(&mut self, e: &'tcx Expr) {
- if let ExprKind::Let(pat, scrutinee) = &e.node {
- walk_list!(self, visit_attribute, e.attrs.iter());
- match &pat.node {
- PatKind::Or(pats) => pats.iter().for_each(|p| self.visit_pat(p)),
- _ => self.visit_pat(&pat),
- }
- self.visit_expr(scrutinee);
- self.visit_expr_post(e);
- return;
- }
- visit::walk_expr(self, e)
- }
-
fn visit_item(&mut self, item: &'tcx Item) {
let hir_id = self.lctx.allocate_hir_id_counter(item.id);
diff --git a/src/librustc/hir/lowering/expr.rs b/src/librustc/hir/lowering/expr.rs
index a46cdab..d71dc53 100644
--- a/src/librustc/hir/lowering/expr.rs
+++ b/src/librustc/hir/lowering/expr.rs
@@ -250,14 +250,14 @@
// 4. The return type of the block is `bool` which seems like what the user wanted.
let scrutinee = self.lower_expr(scrutinee);
let then_arm = {
- let pat = self.lower_pat_top_hack(pat);
+ let pat = self.lower_pat(pat);
let expr = self.expr_bool(span, true);
self.arm(pat, P(expr))
};
let else_arm = {
let pat = self.pat_wild(span);
let expr = self.expr_bool(span, false);
- self.arm(hir_vec![pat], P(expr))
+ self.arm(pat, P(expr))
};
hir::ExprKind::Match(
P(scrutinee),
@@ -281,7 +281,7 @@
None => (self.expr_block_empty(span), false),
Some(els) => (self.lower_expr(els), true),
};
- let else_arm = self.arm(hir_vec![else_pat], P(else_expr));
+ let else_arm = self.arm(else_pat, P(else_expr));
// Handle then + scrutinee:
let then_blk = self.lower_block(then, false);
@@ -290,7 +290,7 @@
// `<pat> => <then>`:
ExprKind::Let(ref pat, ref scrutinee) => {
let scrutinee = self.lower_expr(scrutinee);
- let pat = self.lower_pat_top_hack(pat);
+ let pat = self.lower_pat(pat);
(pat, scrutinee, hir::MatchSource::IfLetDesugar { contains_else_clause })
}
// `true => <then>`:
@@ -307,7 +307,7 @@
// let temporaries live outside of `cond`.
let cond = self.expr_drop_temps(span_block, P(cond), ThinVec::new());
let pat = self.pat_bool(span, true);
- (hir_vec![pat], cond, hir::MatchSource::IfDesugar { contains_else_clause })
+ (pat, cond, hir::MatchSource::IfDesugar { contains_else_clause })
}
};
let then_arm = self.arm(then_pat, P(then_expr));
@@ -331,7 +331,7 @@
let else_arm = {
let else_pat = self.pat_wild(span);
let else_expr = self.expr_break(span, ThinVec::new());
- self.arm(hir_vec![else_pat], else_expr)
+ self.arm(else_pat, else_expr)
};
// Handle then + scrutinee:
@@ -348,7 +348,7 @@
// }
// }
let scrutinee = self.with_loop_condition_scope(|t| t.lower_expr(scrutinee));
- let pat = self.lower_pat_top_hack(pat);
+ let pat = self.lower_pat(pat);
(pat, scrutinee, hir::MatchSource::WhileLetDesugar, hir::LoopSource::WhileLet)
}
_ => {
@@ -376,7 +376,7 @@
let cond = self.expr_drop_temps(span_block, P(cond), ThinVec::new());
// `true => <then>`:
let pat = self.pat_bool(span, true);
- (hir_vec![pat], cond, hir::MatchSource::WhileDesugar, hir::LoopSource::While)
+ (pat, cond, hir::MatchSource::WhileDesugar, hir::LoopSource::While)
}
};
let then_arm = self.arm(then_pat, P(then_expr));
@@ -429,7 +429,7 @@
hir::Arm {
hir_id: self.next_id(),
attrs: self.lower_attrs(&arm.attrs),
- pats: self.lower_pat_top_hack(&arm.pat),
+ pat: self.lower_pat(&arm.pat),
guard: match arm.guard {
Some(ref x) => Some(hir::Guard::If(P(self.lower_expr(x)))),
_ => None,
@@ -439,16 +439,6 @@
}
}
- /// HACK(or_patterns; Centril | dlrobertson): For now we don't push down top level or-patterns
- /// `p | q` into `hir::PatKind::Or(...)` as post-lowering bits of the compiler are not ready
- /// to deal with it. This should by fixed by pushing it down to HIR and then HAIR.
- fn lower_pat_top_hack(&mut self, pat: &Pat) -> HirVec<P<hir::Pat>> {
- match pat.node {
- PatKind::Or(ref ps) => ps.iter().map(|x| self.lower_pat(x)).collect(),
- _ => hir_vec![self.lower_pat(pat)],
- }
- }
-
pub(super) fn make_async_expr(
&mut self,
capture_clause: CaptureBy,
@@ -597,7 +587,7 @@
);
P(this.expr(await_span, expr_break, ThinVec::new()))
});
- self.arm(hir_vec![ready_pat], break_x)
+ self.arm(ready_pat, break_x)
};
// `::std::task::Poll::Pending => {}`
@@ -608,7 +598,7 @@
hir_vec![],
);
let empty_block = P(self.expr_block_empty(span));
- self.arm(hir_vec![pending_pat], empty_block)
+ self.arm(pending_pat, empty_block)
};
let inner_match_stmt = {
@@ -650,7 +640,7 @@
});
// mut pinned => loop { ... }
- let pinned_arm = self.arm(hir_vec![pinned_pat], loop_expr);
+ let pinned_arm = self.arm(pinned_pat, loop_expr);
// match <expr> {
// mut pinned => loop { .. }
@@ -1084,7 +1074,7 @@
ThinVec::new(),
));
let some_pat = self.pat_some(pat.span, val_pat);
- self.arm(hir_vec![some_pat], assign)
+ self.arm(some_pat, assign)
};
// `::std::option::Option::None => break`
@@ -1092,7 +1082,7 @@
let break_expr =
self.with_loop_scope(e.id, |this| this.expr_break(e.span, ThinVec::new()));
let pat = self.pat_none(e.span);
- self.arm(hir_vec![pat], break_expr)
+ self.arm(pat, break_expr)
};
// `mut iter`
@@ -1163,7 +1153,7 @@
});
// `mut iter => { ... }`
- let iter_arm = self.arm(hir_vec![iter_pat], loop_expr);
+ let iter_arm = self.arm(iter_pat, loop_expr);
// `match ::std::iter::IntoIterator::into_iter(<head>) { ... }`
let into_iter_expr = {
@@ -1249,7 +1239,7 @@
ThinVec::from(attrs.clone()),
));
let ok_pat = self.pat_ok(span, val_pat);
- self.arm(hir_vec![ok_pat], val_expr)
+ self.arm(ok_pat, val_expr)
};
// `Err(err) => #[allow(unreachable_code)]
@@ -1284,7 +1274,7 @@
};
let err_pat = self.pat_err(try_span, err_local);
- self.arm(hir_vec![err_pat], ret_expr)
+ self.arm(err_pat, ret_expr)
};
hir::ExprKind::Match(
@@ -1479,14 +1469,11 @@
}
}
- /// HACK(or_patterns; Centril | dlrobertson): For now we don't push down top level or-patterns
- /// `p | q` into `hir::PatKind::Or(...)` as post-lowering bits of the compiler are not ready
- /// to deal with it. This should by fixed by pushing it down to HIR and then HAIR.
- fn arm(&mut self, pats: HirVec<P<hir::Pat>>, expr: P<hir::Expr>) -> hir::Arm {
+ fn arm(&mut self, pat: P<hir::Pat>, expr: P<hir::Expr>) -> hir::Arm {
hir::Arm {
hir_id: self.next_id(),
attrs: hir_vec![],
- pats,
+ pat,
guard: None,
span: expr.span,
body: expr,
diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs
index d7c537b..4fc29d7 100644
--- a/src/libsyntax/visit.rs
+++ b/src/libsyntax/visit.rs
@@ -834,8 +834,6 @@
pub fn walk_arm<'a, V: Visitor<'a>>(visitor: &mut V, arm: &'a Arm) {
visitor.visit_pat(&arm.pat);
- // NOTE(or_patterns; Centril | dlrobertson):
- // If you change this, also change the hack in `lowering.rs`.
walk_list!(visitor, visit_expr, &arm.guard);
visitor.visit_expr(&arm.body);
walk_list!(visitor, visit_attribute, &arm.attrs);