hir::ExprKind::Match(ref discr, arms, _) => {
let discr_place = return_if_err!(self.mc.cat_expr(discr));
- self.maybe_read_scrutinee(
+ return_if_err!(self.maybe_read_scrutinee(
discr,
discr_place.clone(),
arms.iter().map(|arm| arm.pat),
- );
+ ));
// treatment of the discriminant is handled while walking the arms.
for arm in arms {
self.consume_expr(base);
}
- hir::ExprKind::Closure { .. } => {
- self.walk_captures(expr);
+ hir::ExprKind::Closure(closure) => {
+ self.walk_captures(closure);
}
hir::ExprKind::Box(ref base) => {
discr: &Expr<'_>,
discr_place: PlaceWithHirId<'tcx>,
pats: impl Iterator<Item = &'t hir::Pat<'t>>,
- ) {
+ ) -> Result<(), ()> {
// Matching should not always be considered a use of the place, hence
// discr does not necessarily need to be borrowed.
// We only want to borrow discr if the pattern contain something other
let ExprUseVisitor { ref mc, body_owner: _, delegate: _ } = *self;
let mut needs_to_be_read = false;
for pat in pats {
- return_if_err!(mc.cat_pattern(discr_place.clone(), pat, |place, pat| {
+ mc.cat_pattern(discr_place.clone(), pat, |place, pat| {
match &pat.kind {
PatKind::Binding(.., opt_sub_pat) => {
// If the opt_sub_pat is None, than the binding does not count as
// examined
}
}
- }));
+ })?
}
if needs_to_be_read {
// that the discriminant has been initialized.
self.walk_expr(discr);
}
+ Ok(())
}
fn walk_local<F>(
f(self);
if let Some(els) = els {
// borrowing because we need to test the discriminant
- self.maybe_read_scrutinee(expr, expr_place.clone(), from_ref(pat).iter());
+ return_if_err!(self.maybe_read_scrutinee(
+ expr,
+ expr_place.clone(),
+ from_ref(pat).iter()
+ ));
self.walk_block(els)
}
self.walk_irrefutable_pat(&expr_place, &pat);
///
/// - When reporting the Place back to the Delegate, ensure that the UpvarId uses the enclosing
/// closure as the DefId.
- fn walk_captures(&mut self, closure_expr: &hir::Expr<'_>) {
+ fn walk_captures(&mut self, closure_expr: &hir::Closure<'_>) {
fn upvar_is_local_variable<'tcx>(
upvars: Option<&'tcx FxIndexMap<hir::HirId, hir::Upvar>>,
upvar_id: hir::HirId,
debug!("walk_captures({:?})", closure_expr);
let tcx = self.tcx();
- let closure_def_id = tcx.hir().local_def_id(closure_expr.hir_id);
+ let closure_def_id = closure_expr.def_id;
let upvars = tcx.upvars_mentioned(self.body_owner);
// For purposes of this function, generator and closures are equivalent.
// be a local variable
PlaceBase::Local(*var_hir_id)
};
+ let closure_hir_id = tcx.hir().local_def_id_to_hir_id(closure_def_id);
let place_with_id = PlaceWithHirId::new(
- capture_info.path_expr_id.unwrap_or(
- capture_info.capture_kind_expr_id.unwrap_or(closure_expr.hir_id),
- ),
+ capture_info
+ .path_expr_id
+ .unwrap_or(capture_info.capture_kind_expr_id.unwrap_or(closure_hir_id)),
place.base_ty,
place_base,
place.projections.clone(),