Refactoring out the HirId of the UpvarId in another struct.
}
}
-impl_stable_hash_for!(struct ty::UpvarId { var_id, closure_expr_id });
+impl_stable_hash_for!(struct ty::UpvarPath { hir_id });
+
+impl_stable_hash_for!(struct ty::UpvarId { var_path, closure_expr_id });
impl_stable_hash_for!(enum ty::BorrowKind {
ImmBorrow,
format!(" for lifetime parameter `{}` in coherence check", name)
}
infer::UpvarRegion(ref upvar_id, _) => {
- let var_node_id = self.tcx.hir.hir_to_node_id(upvar_id.var_id);
+ let var_node_id = self.tcx.hir.hir_to_node_id(upvar_id.var_path.hir_id);
let var_name = self.tcx.hir.name(var_node_id);
format!(" for capture of `{}` by closure", var_name)
}
"...so that reference does not outlive borrowed content");
}
infer::ReborrowUpvar(span, ref upvar_id) => {
- let var_node_id = self.tcx.hir.hir_to_node_id(upvar_id.var_id);
+ let var_node_id = self.tcx.hir.hir_to_node_id(upvar_id.var_path.hir_id);
let var_name = self.tcx.hir.name(var_node_id);
err.span_note(span,
&format!("...so that closure can access `{}`", var_name));
err
}
infer::ReborrowUpvar(span, ref upvar_id) => {
- let var_node_id = self.tcx.hir.hir_to_node_id(upvar_id.var_id);
+ let var_node_id = self.tcx.hir.hir_to_node_id(upvar_id.var_path.hir_id);
let var_name = self.tcx.hir.name(var_node_id);
let mut err = struct_span_err!(self.tcx.sess,
span,
let var_hir_id = self.tcx().hir.node_to_hir_id(freevar.var_id());
let closure_def_id = self.tcx().hir.local_def_id(closure_expr.id);
let upvar_id = ty::UpvarId {
- var_id: var_hir_id,
+ var_path: ty::UpvarPath { hir_id: var_hir_id },
closure_expr_id: closure_def_id.to_local(),
};
let upvar_capture = self.mc.tables.upvar_capture(upvar_id);
let closure_expr_def_id = self.tcx.hir.local_def_id(fn_node_id);
let var_hir_id = self.tcx.hir.node_to_hir_id(var_id);
let upvar_id = ty::UpvarId {
- var_id: var_hir_id,
+ var_path: ty::UpvarPath { hir_id: var_hir_id },
closure_expr_id: closure_expr_def_id.to_local(),
};
pat_adjustments.hash_stable(hcx, hasher);
hash_stable_hashmap(hcx, hasher, upvar_capture_map, |up_var_id, hcx| {
let ty::UpvarId {
- var_id,
+ var_path,
closure_expr_id
} = *up_var_id;
let var_owner_def_id = DefId {
krate: local_id_root.krate,
- index: var_id.owner,
+ index: var_path.hir_id.owner,
};
let closure_def_id = DefId {
krate: local_id_root.krate,
index: closure_expr_id.to_def_id().index,
};
(hcx.def_path_hash(var_owner_def_id),
- var_id.local_id,
+ var_path.hir_id.local_id,
hcx.def_path_hash(closure_def_id))
});
}
}
+#[derive(Clone, Copy, PartialEq, Eq, Hash, RustcEncodable, RustcDecodable)]
+pub struct UpvarPath {
+ pub hir_id: hir::HirId,
+}
+
/// Upvars do not get their own node-id. Instead, we use the pair of
/// the original var id (that is, the root variable that is referenced
/// by the upvar) and the id of the closure expression.
#[derive(Clone, Copy, PartialEq, Eq, Hash, RustcEncodable, RustcDecodable)]
pub struct UpvarId {
- pub var_id: hir::HirId,
+ pub var_path: UpvarPath,
pub closure_expr_id: LocalDefId,
}
impl fmt::Debug for ty::UpvarId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "UpvarId({:?};`{}`;{:?})",
- self.var_id,
- ty::tls::with(|tcx| tcx.hir.name(tcx.hir.hir_to_node_id(self.var_id))),
+ self.var_path.hir_id,
+ ty::tls::with(|tcx| tcx.hir.name(tcx.hir.hir_to_node_id(self.var_path.hir_id))),
self.closure_expr_id)
}
}
}
None
}
- LpUpvar(ty::UpvarId{ var_id, closure_expr_id: _ }) => {
- self.bccx.used_mut_nodes.borrow_mut().insert(var_id);
+ LpUpvar(ty::UpvarId{ var_path: ty::UpvarPath { hir_id }, closure_expr_id: _ }) => {
+ self.bccx.used_mut_nodes.borrow_mut().insert(hir_id);
None
}
LpExtend(ref base, mc::McInherited, LpDeref(pointer_kind)) |
}
}
if let NoteClosureEnv(upvar_id) = error.move_from.note {
- let var_node_id = bccx.tcx.hir.hir_to_node_id(upvar_id.var_id);
+ let var_node_id = bccx.tcx.hir.hir_to_node_id(upvar_id.var_path.hir_id);
err.span_label(bccx.tcx.hir.span(var_node_id),
"captured outer variable");
}
MutabilityViolation => {
let mut db = self.cannot_assign(error_span, &descr, Origin::Ast);
if let mc::NoteClosureEnv(upvar_id) = err.cmt.note {
- let node_id = self.tcx.hir.hir_to_node_id(upvar_id.var_id);
+ let node_id = self.tcx.hir.hir_to_node_id(upvar_id.var_path.hir_id);
let sp = self.tcx.hir.span(node_id);
let fn_closure_msg = "`Fn` closures cannot capture their enclosing \
environment for modifications";
loan_path: &LoanPath<'tcx>,
out: &mut String) {
match loan_path.kind {
- LpUpvar(ty::UpvarId { var_id: id, closure_expr_id: _ }) => {
+ LpUpvar(ty::UpvarId { var_path: ty::UpvarPath { hir_id: id}, closure_expr_id: _ }) => {
out.push_str(&self.tcx.hir.name(self.tcx.hir.hir_to_node_id(id)).as_str());
}
LpVar(id) => {
write!(f, "$({})", ty::tls::with(|tcx| tcx.hir.node_to_string(id)))
}
- LpUpvar(ty::UpvarId{ var_id, closure_expr_id }) => {
+ LpUpvar(ty::UpvarId{ var_path: ty::UpvarPath {hir_id: var_id}, closure_expr_id }) => {
let s = ty::tls::with(|tcx| {
let var_node_id = tcx.hir.hir_to_node_id(var_id);
tcx.hir.node_to_string(var_node_id)
write!(f, "$({})", ty::tls::with(|tcx| tcx.hir.node_to_user_string(id)))
}
- LpUpvar(ty::UpvarId{ var_id, closure_expr_id: _ }) => {
+ LpUpvar(ty::UpvarId{ var_path: ty::UpvarPath { hir_id }, closure_expr_id: _ }) => {
let s = ty::tls::with(|tcx| {
- let var_node_id = tcx.hir.hir_to_node_id(var_id);
+ let var_node_id = tcx.hir.hir_to_node_id(hir_id);
tcx.hir.node_to_string(var_node_id)
});
write!(f, "$({} captured by closure)", s)
let var_hir_id = tcx.hir.node_to_hir_id(var_id);
let closure_expr_id = tcx.hir.local_def_id(fn_id);
let capture = hir.tables().upvar_capture(ty::UpvarId {
- var_id: var_hir_id,
+ var_path: ty::UpvarPath {hir_id: var_hir_id},
closure_expr_id: LocalDefId::from_def_id(closure_expr_id),
});
let by_ref = match capture {
// ...but the upvar might be an `&T` or `&mut T` capture, at which
// point we need an implicit deref
let upvar_id = ty::UpvarId {
- var_id: var_hir_id,
+ var_path: ty::UpvarPath {hir_id: var_hir_id},
closure_expr_id: LocalDefId::from_def_id(closure_def_id),
};
match cx.tables().upvar_capture(upvar_id) {
-> ExprRef<'tcx> {
let var_hir_id = cx.tcx.hir.node_to_hir_id(freevar.var_id());
let upvar_id = ty::UpvarId {
- var_id: var_hir_id,
+ var_path: ty::UpvarPath { hir_id: var_hir_id },
closure_expr_id: cx.tcx.hir.local_def_id(closure_expr.id).to_local(),
};
let upvar_capture = cx.tables().upvar_capture(upvar_id);
self.tcx.with_freevars(closure_node_id, |freevars| {
for freevar in freevars {
let upvar_id = ty::UpvarId {
- var_id: self.tcx.hir.node_to_hir_id(freevar.var_id()),
+ var_path: ty::UpvarPath {
+ hir_id : self.tcx.hir.node_to_hir_id(freevar.var_id()),
+ },
closure_expr_id: LocalDefId::from_def_id(closure_def_id),
};
debug!("seed upvar_id {:?}", upvar_id);
let var_hir_id = tcx.hir.node_to_hir_id(var_node_id);
let freevar_ty = self.node_ty(var_hir_id);
let upvar_id = ty::UpvarId {
- var_id: var_hir_id,
+ var_path: ty::UpvarPath {
+ hir_id: var_hir_id,
+ },
closure_expr_id: LocalDefId::from_def_id(closure_def_index),
};
let capture = self.tables.borrow().upvar_capture(upvar_id);
upvar_id.closure_expr_id,
ty::ClosureKind::FnOnce,
guarantor.span,
- var_name(tcx, upvar_id.var_id),
+ var_name(tcx, upvar_id.var_path.hir_id),
);
self.adjust_upvar_captures
upvar_id.closure_expr_id,
ty::ClosureKind::FnOnce,
guarantor.span,
- var_name(tcx, upvar_id.var_id),
+ var_name(tcx, upvar_id.var_path.hir_id),
);
}
mc::NoteIndex | mc::NoteNone => {}
upvar_id.closure_expr_id,
ty::ClosureKind::FnMut,
cmt.span,
- var_name(tcx, upvar_id.var_id),
+ var_name(tcx, upvar_id.var_path.hir_id),
);
true
upvar_id.closure_expr_id,
ty::ClosureKind::FnMut,
cmt.span,
- var_name(tcx, upvar_id.var_id),
+ var_name(tcx, upvar_id.var_path.hir_id),
);
true
ty::UpvarCapture::ByValue => ty::UpvarCapture::ByValue,
ty::UpvarCapture::ByRef(ref upvar_borrow) => {
let r = upvar_borrow.region;
- let r = self.resolve(&r, &upvar_id.var_id);
+ let r = self.resolve(&r, &upvar_id.var_path.hir_id);
ty::UpvarCapture::ByRef(ty::UpvarBorrow {
kind: upvar_borrow.kind,
region: r,