struct SeedBorrowKind<'a, 'gcx: 'a+'tcx, 'tcx: 'a> {
fcx: &'a FnCtxt<'a, 'gcx, 'tcx>,
- temp_closure_kinds: NodeMap<(ty::ClosureKind, Option<Span>)>,
+ temp_closure_kinds: NodeMap<(ty::ClosureKind, Option<(Span, ast::Name)>)>,
}
impl<'a, 'gcx, 'tcx> Visitor<'gcx> for SeedBorrowKind<'a, 'gcx, 'tcx> {
struct AdjustBorrowKind<'a, 'gcx: 'a+'tcx, 'tcx: 'a> {
fcx: &'a FnCtxt<'a, 'gcx, 'tcx>,
- temp_closure_kinds: NodeMap<(ty::ClosureKind, Option<Span>)>,
+ temp_closure_kinds: NodeMap<(ty::ClosureKind, Option<(Span, ast::Name)>)>,
}
impl<'a, 'gcx, 'tcx> AdjustBorrowKind<'a, 'gcx, 'tcx> {
fn new(fcx: &'a FnCtxt<'a, 'gcx, 'tcx>,
- temp_closure_kinds: NodeMap<(ty::ClosureKind, Option<Span>)>)
+ temp_closure_kinds: NodeMap<(ty::ClosureKind, Option<(Span, ast::Name)>)>)
-> AdjustBorrowKind<'a, 'gcx, 'tcx> {
AdjustBorrowKind { fcx: fcx, temp_closure_kinds: temp_closure_kinds }
}
// If we are also inferred the closure kind here, update the
// main table and process any deferred resolutions.
- if let Some(&(kind, span)) = self.temp_closure_kinds.get(&id) {
- self.fcx.tables.borrow_mut().closure_kinds.insert(id, (kind, span));
+ if let Some(&(kind, context)) = self.temp_closure_kinds.get(&id) {
+ self.fcx.tables.borrow_mut().closure_kinds.insert(id, (kind, context));
let closure_def_id = self.fcx.tcx.hir.local_def_id(id);
debug!("closure_kind({:?}) = {:?}", closure_def_id, kind);
euv::Move(_) => { }
}
+ let tcx = self.fcx.tcx;
+
// watch out for a move of the deref of a borrowed pointer;
// for that to be legal, the upvar would have to be borrowed
// by value instead
let guarantor = cmt.guarantor();
- let tcx = self.fcx.tcx;
debug!("adjust_upvar_borrow_kind_for_consume: guarantor={:?}",
guarantor);
match guarantor.cat {
// to move out of an upvar, this must be a FnOnce closure
self.adjust_closure_kind(upvar_id.closure_expr_id,
ty::ClosureKind::FnOnce,
- tcx.hir.span(upvar_id.var_id));
+ guarantor.span,
+ tcx.hir.name(upvar_id.var_id));
let upvar_capture_map =
&mut self.fcx.tables.borrow_mut().upvar_capture_map;
// of the environment.
self.adjust_closure_kind(upvar_id.closure_expr_id,
ty::ClosureKind::FnOnce,
- tcx.hir.span(upvar_id.var_id));
+ guarantor.span,
+ tcx.hir.name(upvar_id.var_id));
}
mc::NoteNone => {
}
Categorization::Deref(base, _, mc::BorrowedPtr(..)) |
Categorization::Deref(base, _, mc::Implicit(..)) => {
- if !self.try_adjust_upvar_deref(&cmt.note, ty::MutBorrow) {
+ if !self.try_adjust_upvar_deref(cmt, ty::MutBorrow) {
// assignment to deref of an `&mut`
// borrowed pointer implies that the
// pointer itself must be unique, but not
Categorization::Deref(base, _, mc::BorrowedPtr(..)) |
Categorization::Deref(base, _, mc::Implicit(..)) => {
- if !self.try_adjust_upvar_deref(&cmt.note, ty::UniqueImmBorrow) {
+ if !self.try_adjust_upvar_deref(cmt, ty::UniqueImmBorrow) {
// for a borrowed pointer to be unique, its
// base must be unique
self.adjust_upvar_borrow_kind_for_unique(base);
}
fn try_adjust_upvar_deref(&mut self,
- note: &mc::Note,
+ cmt: mc::cmt<'tcx>,
borrow_kind: ty::BorrowKind)
-> bool
{
let tcx = self.fcx.tcx;
- match *note {
+ match cmt.note {
mc::NoteUpvarRef(upvar_id) => {
// if this is an implicit deref of an
// upvar, then we need to modify the
// also need to be in an FnMut closure since this is not an ImmBorrow
self.adjust_closure_kind(upvar_id.closure_expr_id,
ty::ClosureKind::FnMut,
- tcx.hir.span(upvar_id.var_id));
+ cmt.span,
+ tcx.hir.name(upvar_id.var_id));
true
}
// upvar, we need to be an FnMut closure
self.adjust_closure_kind(upvar_id.closure_expr_id,
ty::ClosureKind::FnMut,
- tcx.hir.span(upvar_id.var_id));
+ cmt.span,
+ tcx.hir.name(upvar_id.var_id));
true
}
fn adjust_closure_kind(&mut self,
closure_id: ast::NodeId,
new_kind: ty::ClosureKind,
- upvar_span: Span) {
- debug!("adjust_closure_kind(closure_id={}, new_kind={:?})",
- closure_id, new_kind);
+ upvar_span: Span,
+ var_name: ast::Name) {
+ debug!("adjust_closure_kind(closure_id={}, new_kind={:?}, upvar_span={:?}, var_name={})",
+ closure_id, new_kind, upvar_span, var_name);
if let Some(&(existing_kind, _)) = self.temp_closure_kinds.get(&closure_id) {
debug!("adjust_closure_kind: closure_id={}, existing_kind={:?}, new_kind={:?}",
(ty::ClosureKind::Fn, ty::ClosureKind::FnOnce) |
(ty::ClosureKind::FnMut, ty::ClosureKind::FnOnce) => {
// new kind is stronger than the old kind
- self.temp_closure_kinds.insert(closure_id, (new_kind, Some(upvar_span)));
+ self.temp_closure_kinds.insert(
+ closure_id,
+ (new_kind, Some((upvar_span, var_name)))
+ );
}
}
}