Rollup merge of #55953 - blitzerr:master, r=nikomatsakis

#53488 Refactoring UpvarId
This commit is contained in:
Pietro Albini 2018-11-18 23:24:48 +01:00 committed by kennytm
commit 989d06a76d
No known key found for this signature in database
GPG Key ID: FEF6C8051D0E013C
15 changed files with 114 additions and 103 deletions

View File

@ -216,7 +216,9 @@ impl<'gcx> HashStable<StableHashingContext<'gcx>> for ty::adjustment::AutoBorrow
} }
} }
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 { impl_stable_hash_for!(enum ty::BorrowKind {
ImmBorrow, ImmBorrow,

View File

@ -1315,7 +1315,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
format!(" for lifetime parameter `{}` in coherence check", name) format!(" for lifetime parameter `{}` in coherence check", name)
} }
infer::UpvarRegion(ref upvar_id, _) => { 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); let var_name = self.tcx.hir.name(var_node_id);
format!(" for capture of `{}` by closure", var_name) format!(" for capture of `{}` by closure", var_name)
} }

View File

@ -41,7 +41,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
"...so that reference does not outlive borrowed content"); "...so that reference does not outlive borrowed content");
} }
infer::ReborrowUpvar(span, ref upvar_id) => { 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 var_name = self.tcx.hir.name(var_node_id);
err.span_note(span, err.span_note(span,
&format!("...so that closure can access `{}`", var_name)); &format!("...so that closure can access `{}`", var_name));
@ -174,7 +174,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
err err
} }
infer::ReborrowUpvar(span, ref upvar_id) => { 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 var_name = self.tcx.hir.name(var_node_id);
let mut err = struct_span_err!(self.tcx.sess, let mut err = struct_span_err!(self.tcx.sess,
span, span,

View File

@ -938,7 +938,7 @@ impl<'a, 'gcx, 'tcx> ExprUseVisitor<'a, 'gcx, 'tcx> {
let var_hir_id = self.tcx().hir.node_to_hir_id(freevar.var_id()); 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 closure_def_id = self.tcx().hir.local_def_id(closure_expr.id);
let upvar_id = ty::UpvarId { 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(), closure_expr_id: closure_def_id.to_local(),
}; };
let upvar_capture = self.mc.tables.upvar_capture(upvar_id); let upvar_capture = self.mc.tables.upvar_capture(upvar_id);

View File

@ -818,7 +818,7 @@ impl<'a, 'gcx, 'tcx> MemCategorizationContext<'a, 'gcx, 'tcx> {
let closure_expr_def_id = self.tcx.hir.local_def_id(fn_node_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 var_hir_id = self.tcx.hir.node_to_hir_id(var_id);
let upvar_id = ty::UpvarId { 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(), closure_expr_id: closure_expr_def_id.to_local(),
}; };

View File

@ -789,7 +789,7 @@ impl<'a, 'gcx> HashStable<StableHashingContext<'a>> for TypeckTables<'gcx> {
pat_adjustments.hash_stable(hcx, hasher); pat_adjustments.hash_stable(hcx, hasher);
hash_stable_hashmap(hcx, hasher, upvar_capture_map, |up_var_id, hcx| { hash_stable_hashmap(hcx, hasher, upvar_capture_map, |up_var_id, hcx| {
let ty::UpvarId { let ty::UpvarId {
var_id, var_path,
closure_expr_id closure_expr_id
} = *up_var_id; } = *up_var_id;
@ -798,14 +798,14 @@ impl<'a, 'gcx> HashStable<StableHashingContext<'a>> for TypeckTables<'gcx> {
let var_owner_def_id = DefId { let var_owner_def_id = DefId {
krate: local_id_root.krate, krate: local_id_root.krate,
index: var_id.owner, index: var_path.hir_id.owner,
}; };
let closure_def_id = DefId { let closure_def_id = DefId {
krate: local_id_root.krate, krate: local_id_root.krate,
index: closure_expr_id.to_def_id().index, index: closure_expr_id.to_def_id().index,
}; };
(hcx.def_path_hash(var_owner_def_id), (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)) hcx.def_path_hash(closure_def_id))
}); });

View File

@ -730,12 +730,17 @@ impl<T> List<T> {
} }
} }
#[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 /// 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 /// the original var id (that is, the root variable that is referenced
/// by the upvar) and the id of the closure expression. /// by the upvar) and the id of the closure expression.
#[derive(Clone, Copy, PartialEq, Eq, Hash, RustcEncodable, RustcDecodable)] #[derive(Clone, Copy, PartialEq, Eq, Hash, RustcEncodable, RustcDecodable)]
pub struct UpvarId { pub struct UpvarId {
pub var_id: hir::HirId, pub var_path: UpvarPath,
pub closure_expr_id: LocalDefId, pub closure_expr_id: LocalDefId,
} }

View File

@ -678,8 +678,8 @@ impl<'tcx> fmt::Debug for ty::ClosureUpvar<'tcx> {
impl fmt::Debug for ty::UpvarId { impl fmt::Debug for ty::UpvarId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "UpvarId({:?};`{}`;{:?})", write!(f, "UpvarId({:?};`{}`;{:?})",
self.var_id, self.var_path.hir_id,
ty::tls::with(|tcx| tcx.hir.name(tcx.hir.hir_to_node_id(self.var_id))), ty::tls::with(|tcx| tcx.hir.name(tcx.hir.hir_to_node_id(self.var_path.hir_id))),
self.closure_expr_id) self.closure_expr_id)
} }
} }

View File

@ -453,8 +453,8 @@ impl<'a, 'tcx> GatherLoanCtxt<'a, 'tcx> {
} }
None None
} }
LpUpvar(ty::UpvarId{ var_id, closure_expr_id: _ }) => { LpUpvar(ty::UpvarId{ var_path: ty::UpvarPath { hir_id }, closure_expr_id: _ }) => {
self.bccx.used_mut_nodes.borrow_mut().insert(var_id); self.bccx.used_mut_nodes.borrow_mut().insert(hir_id);
None None
} }
LpExtend(ref base, mc::McInherited, LpDeref(pointer_kind)) | LpExtend(ref base, mc::McInherited, LpDeref(pointer_kind)) |

View File

@ -97,7 +97,7 @@ fn report_move_errors<'a, 'tcx>(bccx: &BorrowckCtxt<'a, 'tcx>, errors: &[MoveErr
} }
} }
if let NoteClosureEnv(upvar_id) = error.move_from.note { 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), err.span_label(bccx.tcx.hir.span(var_node_id),
"captured outer variable"); "captured outer variable");
} }

View File

@ -846,7 +846,7 @@ impl<'a, 'tcx> BorrowckCtxt<'a, 'tcx> {
MutabilityViolation => { MutabilityViolation => {
let mut db = self.cannot_assign(error_span, &descr, Origin::Ast); let mut db = self.cannot_assign(error_span, &descr, Origin::Ast);
if let mc::NoteClosureEnv(upvar_id) = err.cmt.note { 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 sp = self.tcx.hir.span(node_id);
let fn_closure_msg = "`Fn` closures cannot capture their enclosing \ let fn_closure_msg = "`Fn` closures cannot capture their enclosing \
environment for modifications"; environment for modifications";
@ -1415,7 +1415,7 @@ impl<'a, 'tcx> BorrowckCtxt<'a, 'tcx> {
loan_path: &LoanPath<'tcx>, loan_path: &LoanPath<'tcx>,
out: &mut String) { out: &mut String) {
match loan_path.kind { 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()); out.push_str(&self.tcx.hir.name(self.tcx.hir.hir_to_node_id(id)).as_str());
} }
LpVar(id) => { LpVar(id) => {
@ -1533,7 +1533,7 @@ impl<'tcx> fmt::Debug for LoanPath<'tcx> {
write!(f, "$({})", ty::tls::with(|tcx| tcx.hir.node_to_string(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 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(var_id);
tcx.hir.node_to_string(var_node_id) tcx.hir.node_to_string(var_node_id)
@ -1568,9 +1568,9 @@ impl<'tcx> fmt::Display for LoanPath<'tcx> {
write!(f, "$({})", ty::tls::with(|tcx| tcx.hir.node_to_user_string(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 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) tcx.hir.node_to_string(var_node_id)
}); });
write!(f, "$({} captured by closure)", s) write!(f, "$({} captured by closure)", s)

View File

@ -664,7 +664,7 @@ fn construct_fn<'a, 'gcx, 'tcx, A>(hir: Cx<'a, 'gcx, 'tcx>,
let var_hir_id = tcx.hir.node_to_hir_id(var_id); let var_hir_id = tcx.hir.node_to_hir_id(var_id);
let closure_expr_id = tcx.hir.local_def_id(fn_id); let closure_expr_id = tcx.hir.local_def_id(fn_id);
let capture = hir.tables().upvar_capture(ty::UpvarId { 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), closure_expr_id: LocalDefId::from_def_id(closure_expr_id),
}); });
let by_ref = match capture { let by_ref = match capture {

View File

@ -1061,7 +1061,7 @@ fn convert_var<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>,
// ...but the upvar might be an `&T` or `&mut T` capture, at which // ...but the upvar might be an `&T` or `&mut T` capture, at which
// point we need an implicit deref // point we need an implicit deref
let upvar_id = ty::UpvarId { 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), closure_expr_id: LocalDefId::from_def_id(closure_def_id),
}; };
match cx.tables().upvar_capture(upvar_id) { match cx.tables().upvar_capture(upvar_id) {
@ -1178,7 +1178,7 @@ fn capture_freevar<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>,
-> ExprRef<'tcx> { -> ExprRef<'tcx> {
let var_hir_id = cx.tcx.hir.node_to_hir_id(freevar.var_id()); let var_hir_id = cx.tcx.hir.node_to_hir_id(freevar.var_id());
let upvar_id = ty::UpvarId { 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(), closure_expr_id: cx.tcx.hir.local_def_id(closure_expr.id).to_local(),
}; };
let upvar_capture = cx.tables().upvar_capture(upvar_id); let upvar_capture = cx.tables().upvar_capture(upvar_id);

View File

@ -45,14 +45,14 @@ use super::FnCtxt;
use middle::expr_use_visitor as euv; use middle::expr_use_visitor as euv;
use middle::mem_categorization as mc; use middle::mem_categorization as mc;
use middle::mem_categorization::Categorization; use middle::mem_categorization::Categorization;
use rustc::hir::def_id::DefId;
use rustc::ty::{self, Ty, TyCtxt, UpvarSubsts};
use rustc::infer::UpvarRegion;
use syntax::ast;
use syntax_pos::Span;
use rustc::hir; use rustc::hir;
use rustc::hir::def_id::DefId;
use rustc::hir::def_id::LocalDefId; use rustc::hir::def_id::LocalDefId;
use rustc::hir::intravisit::{self, NestedVisitorMap, Visitor}; use rustc::hir::intravisit::{self, NestedVisitorMap, Visitor};
use rustc::infer::UpvarRegion;
use rustc::ty::{self, Ty, TyCtxt, UpvarSubsts};
use syntax::ast;
use syntax_pos::Span;
impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
pub fn closure_analyze(&self, body: &'gcx hir::Body) { pub fn closure_analyze(&self, body: &'gcx hir::Body) {
@ -134,7 +134,9 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
self.tcx.with_freevars(closure_node_id, |freevars| { self.tcx.with_freevars(closure_node_id, |freevars| {
for freevar in freevars { for freevar in freevars {
let upvar_id = ty::UpvarId { 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), closure_expr_id: LocalDefId::from_def_id(closure_def_id),
}; };
debug!("seed upvar_id {:?}", upvar_id); debug!("seed upvar_id {:?}", upvar_id);
@ -213,11 +215,10 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
let final_upvar_tys = self.final_upvar_tys(closure_node_id); let final_upvar_tys = self.final_upvar_tys(closure_node_id);
debug!( debug!(
"analyze_closure: id={:?} substs={:?} final_upvar_tys={:?}", "analyze_closure: id={:?} substs={:?} final_upvar_tys={:?}",
closure_node_id, closure_node_id, substs, final_upvar_tys
substs,
final_upvar_tys
); );
for (upvar_ty, final_upvar_ty) in substs.upvar_tys(closure_def_id, self.tcx) for (upvar_ty, final_upvar_ty) in substs
.upvar_tys(closure_def_id, self.tcx)
.zip(final_upvar_tys) .zip(final_upvar_tys)
{ {
self.demand_suptype(span, upvar_ty, final_upvar_ty); self.demand_suptype(span, upvar_ty, final_upvar_ty);
@ -249,16 +250,16 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
let var_hir_id = tcx.hir.node_to_hir_id(var_node_id); let var_hir_id = tcx.hir.node_to_hir_id(var_node_id);
let freevar_ty = self.node_ty(var_hir_id); let freevar_ty = self.node_ty(var_hir_id);
let upvar_id = ty::UpvarId { 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), closure_expr_id: LocalDefId::from_def_id(closure_def_index),
}; };
let capture = self.tables.borrow().upvar_capture(upvar_id); let capture = self.tables.borrow().upvar_capture(upvar_id);
debug!( debug!(
"var_id={:?} freevar_ty={:?} capture={:?}", "var_id={:?} freevar_ty={:?} capture={:?}",
var_node_id, var_node_id, freevar_ty, capture
freevar_ty,
capture
); );
match capture { match capture {
@ -271,8 +272,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
}, },
), ),
} }
}) }).collect()
.collect()
}) })
} }
} }
@ -301,12 +301,14 @@ struct InferBorrowKind<'a, 'gcx: 'a + 'tcx, 'tcx: 'a> {
} }
impl<'a, 'gcx, 'tcx> InferBorrowKind<'a, 'gcx, 'tcx> { impl<'a, 'gcx, 'tcx> InferBorrowKind<'a, 'gcx, 'tcx> {
fn adjust_upvar_borrow_kind_for_consume(&mut self, cmt: &mc::cmt_<'tcx>, fn adjust_upvar_borrow_kind_for_consume(
mode: euv::ConsumeMode) { &mut self,
cmt: &mc::cmt_<'tcx>,
mode: euv::ConsumeMode,
) {
debug!( debug!(
"adjust_upvar_borrow_kind_for_consume(cmt={:?}, mode={:?})", "adjust_upvar_borrow_kind_for_consume(cmt={:?}, mode={:?})",
cmt, cmt, mode
mode
); );
// we only care about moves // we only care about moves
@ -349,7 +351,7 @@ impl<'a, 'gcx, 'tcx> InferBorrowKind<'a, 'gcx, 'tcx> {
upvar_id.closure_expr_id, upvar_id.closure_expr_id,
ty::ClosureKind::FnOnce, ty::ClosureKind::FnOnce,
guarantor.span, guarantor.span,
var_name(tcx, upvar_id.var_id), var_name(tcx, upvar_id.var_path.hir_id),
); );
self.adjust_upvar_captures self.adjust_upvar_captures
@ -366,7 +368,7 @@ impl<'a, 'gcx, 'tcx> InferBorrowKind<'a, 'gcx, 'tcx> {
upvar_id.closure_expr_id, upvar_id.closure_expr_id,
ty::ClosureKind::FnOnce, ty::ClosureKind::FnOnce,
guarantor.span, guarantor.span,
var_name(tcx, upvar_id.var_id), var_name(tcx, upvar_id.var_path.hir_id),
); );
} }
mc::NoteIndex | mc::NoteNone => {} mc::NoteIndex | mc::NoteNone => {}
@ -381,9 +383,9 @@ impl<'a, 'gcx, 'tcx> InferBorrowKind<'a, 'gcx, 'tcx> {
debug!("adjust_upvar_borrow_kind_for_mut(cmt={:?})", cmt); debug!("adjust_upvar_borrow_kind_for_mut(cmt={:?})", cmt);
match cmt.cat.clone() { match cmt.cat.clone() {
Categorization::Deref(base, mc::Unique) | Categorization::Deref(base, mc::Unique)
Categorization::Interior(base, _) | | Categorization::Interior(base, _)
Categorization::Downcast(base, _) => { | Categorization::Downcast(base, _) => {
// Interior or owned data is mutable if base is // Interior or owned data is mutable if base is
// mutable, so iterate to the base. // mutable, so iterate to the base.
self.adjust_upvar_borrow_kind_for_mut(&base); self.adjust_upvar_borrow_kind_for_mut(&base);
@ -399,12 +401,12 @@ impl<'a, 'gcx, 'tcx> InferBorrowKind<'a, 'gcx, 'tcx> {
} }
} }
Categorization::Deref(_, mc::UnsafePtr(..)) | Categorization::Deref(_, mc::UnsafePtr(..))
Categorization::StaticItem | | Categorization::StaticItem
Categorization::ThreadLocal(..) | | Categorization::ThreadLocal(..)
Categorization::Rvalue(..) | | Categorization::Rvalue(..)
Categorization::Local(_) | | Categorization::Local(_)
Categorization::Upvar(..) => { | Categorization::Upvar(..) => {
return; return;
} }
} }
@ -414,9 +416,9 @@ impl<'a, 'gcx, 'tcx> InferBorrowKind<'a, 'gcx, 'tcx> {
debug!("adjust_upvar_borrow_kind_for_unique(cmt={:?})", cmt); debug!("adjust_upvar_borrow_kind_for_unique(cmt={:?})", cmt);
match cmt.cat.clone() { match cmt.cat.clone() {
Categorization::Deref(base, mc::Unique) | Categorization::Deref(base, mc::Unique)
Categorization::Interior(base, _) | | Categorization::Interior(base, _)
Categorization::Downcast(base, _) => { | Categorization::Downcast(base, _) => {
// Interior or owned data is unique if base is // Interior or owned data is unique if base is
// unique. // unique.
self.adjust_upvar_borrow_kind_for_unique(&base); self.adjust_upvar_borrow_kind_for_unique(&base);
@ -430,18 +432,20 @@ impl<'a, 'gcx, 'tcx> InferBorrowKind<'a, 'gcx, 'tcx> {
} }
} }
Categorization::Deref(_, mc::UnsafePtr(..)) | Categorization::Deref(_, mc::UnsafePtr(..))
Categorization::StaticItem | | Categorization::StaticItem
Categorization::ThreadLocal(..) | | Categorization::ThreadLocal(..)
Categorization::Rvalue(..) | | Categorization::Rvalue(..)
Categorization::Local(_) | | Categorization::Local(_)
Categorization::Upvar(..) => {} | Categorization::Upvar(..) => {}
} }
} }
fn try_adjust_upvar_deref(&mut self, cmt: &mc::cmt_<'tcx>, borrow_kind: ty::BorrowKind) fn try_adjust_upvar_deref(
-> bool &mut self,
{ cmt: &mc::cmt_<'tcx>,
borrow_kind: ty::BorrowKind,
) -> bool {
assert!(match borrow_kind { assert!(match borrow_kind {
ty::MutBorrow => true, ty::MutBorrow => true,
ty::UniqueImmBorrow => true, ty::UniqueImmBorrow => true,
@ -465,7 +469,7 @@ impl<'a, 'gcx, 'tcx> InferBorrowKind<'a, 'gcx, 'tcx> {
upvar_id.closure_expr_id, upvar_id.closure_expr_id,
ty::ClosureKind::FnMut, ty::ClosureKind::FnMut,
cmt.span, cmt.span,
var_name(tcx, upvar_id.var_id), var_name(tcx, upvar_id.var_path.hir_id),
); );
true true
@ -478,7 +482,7 @@ impl<'a, 'gcx, 'tcx> InferBorrowKind<'a, 'gcx, 'tcx> {
upvar_id.closure_expr_id, upvar_id.closure_expr_id,
ty::ClosureKind::FnMut, ty::ClosureKind::FnMut,
cmt.span, cmt.span,
var_name(tcx, upvar_id.var_id), var_name(tcx, upvar_id.var_path.hir_id),
); );
true true
@ -493,15 +497,14 @@ impl<'a, 'gcx, 'tcx> InferBorrowKind<'a, 'gcx, 'tcx> {
/// Here the argument `mutbl` is the borrow_kind that is required by /// Here the argument `mutbl` is the borrow_kind that is required by
/// some particular use. /// some particular use.
fn adjust_upvar_borrow_kind(&mut self, upvar_id: ty::UpvarId, kind: ty::BorrowKind) { fn adjust_upvar_borrow_kind(&mut self, upvar_id: ty::UpvarId, kind: ty::BorrowKind) {
let upvar_capture = self.adjust_upvar_captures let upvar_capture = self
.adjust_upvar_captures
.get(&upvar_id) .get(&upvar_id)
.cloned() .cloned()
.unwrap_or_else(|| self.fcx.tables.borrow().upvar_capture(upvar_id)); .unwrap_or_else(|| self.fcx.tables.borrow().upvar_capture(upvar_id));
debug!( debug!(
"adjust_upvar_borrow_kind(upvar_id={:?}, upvar_capture={:?}, kind={:?})", "adjust_upvar_borrow_kind(upvar_id={:?}, upvar_capture={:?}, kind={:?})",
upvar_id, upvar_id, upvar_capture, kind
upvar_capture,
kind
); );
match upvar_capture { match upvar_capture {
@ -511,18 +514,18 @@ impl<'a, 'gcx, 'tcx> InferBorrowKind<'a, 'gcx, 'tcx> {
ty::UpvarCapture::ByRef(mut upvar_borrow) => { ty::UpvarCapture::ByRef(mut upvar_borrow) => {
match (upvar_borrow.kind, kind) { match (upvar_borrow.kind, kind) {
// Take RHS: // Take RHS:
(ty::ImmBorrow, ty::UniqueImmBorrow) | (ty::ImmBorrow, ty::UniqueImmBorrow)
(ty::ImmBorrow, ty::MutBorrow) | | (ty::ImmBorrow, ty::MutBorrow)
(ty::UniqueImmBorrow, ty::MutBorrow) => { | (ty::UniqueImmBorrow, ty::MutBorrow) => {
upvar_borrow.kind = kind; upvar_borrow.kind = kind;
self.adjust_upvar_captures self.adjust_upvar_captures
.insert(upvar_id, ty::UpvarCapture::ByRef(upvar_borrow)); .insert(upvar_id, ty::UpvarCapture::ByRef(upvar_borrow));
} }
// Take LHS: // Take LHS:
(ty::ImmBorrow, ty::ImmBorrow) | (ty::ImmBorrow, ty::ImmBorrow)
(ty::UniqueImmBorrow, ty::ImmBorrow) | | (ty::UniqueImmBorrow, ty::ImmBorrow)
(ty::UniqueImmBorrow, ty::UniqueImmBorrow) | | (ty::UniqueImmBorrow, ty::UniqueImmBorrow)
(ty::MutBorrow, _) => {} | (ty::MutBorrow, _) => {}
} }
} }
} }
@ -537,10 +540,7 @@ impl<'a, 'gcx, 'tcx> InferBorrowKind<'a, 'gcx, 'tcx> {
) { ) {
debug!( debug!(
"adjust_closure_kind(closure_id={:?}, new_kind={:?}, upvar_span={:?}, var_name={})", "adjust_closure_kind(closure_id={:?}, new_kind={:?}, upvar_span={:?}, var_name={})",
closure_id, closure_id, new_kind, upvar_span, var_name
new_kind,
upvar_span,
var_name
); );
// Is this the closure whose kind is currently being inferred? // Is this the closure whose kind is currently being inferred?
@ -554,22 +554,20 @@ impl<'a, 'gcx, 'tcx> InferBorrowKind<'a, 'gcx, 'tcx> {
debug!( debug!(
"adjust_closure_kind: closure_id={:?}, existing_kind={:?}, new_kind={:?}", "adjust_closure_kind: closure_id={:?}, existing_kind={:?}, new_kind={:?}",
closure_id, closure_id, existing_kind, new_kind
existing_kind,
new_kind
); );
match (existing_kind, new_kind) { match (existing_kind, new_kind) {
(ty::ClosureKind::Fn, ty::ClosureKind::Fn) | (ty::ClosureKind::Fn, ty::ClosureKind::Fn)
(ty::ClosureKind::FnMut, ty::ClosureKind::Fn) | | (ty::ClosureKind::FnMut, ty::ClosureKind::Fn)
(ty::ClosureKind::FnMut, ty::ClosureKind::FnMut) | | (ty::ClosureKind::FnMut, ty::ClosureKind::FnMut)
(ty::ClosureKind::FnOnce, _) => { | (ty::ClosureKind::FnOnce, _) => {
// no change needed // no change needed
} }
(ty::ClosureKind::Fn, ty::ClosureKind::FnMut) | (ty::ClosureKind::Fn, ty::ClosureKind::FnMut)
(ty::ClosureKind::Fn, ty::ClosureKind::FnOnce) | | (ty::ClosureKind::Fn, ty::ClosureKind::FnOnce)
(ty::ClosureKind::FnMut, ty::ClosureKind::FnOnce) => { | (ty::ClosureKind::FnMut, ty::ClosureKind::FnOnce) => {
// new kind is stronger than the old kind // new kind is stronger than the old kind
self.current_closure_kind = new_kind; self.current_closure_kind = new_kind;
self.current_origin = Some((upvar_span, var_name)); self.current_origin = Some((upvar_span, var_name));
@ -590,12 +588,20 @@ impl<'a, 'gcx, 'tcx> euv::Delegate<'tcx> for InferBorrowKind<'a, 'gcx, 'tcx> {
self.adjust_upvar_borrow_kind_for_consume(cmt, mode); self.adjust_upvar_borrow_kind_for_consume(cmt, mode);
} }
fn matched_pat(&mut self, _matched_pat: &hir::Pat, _cmt: &mc::cmt_<'tcx>, fn matched_pat(
_mode: euv::MatchMode) { &mut self,
_matched_pat: &hir::Pat,
_cmt: &mc::cmt_<'tcx>,
_mode: euv::MatchMode,
) {
} }
fn consume_pat(&mut self, _consume_pat: &hir::Pat, cmt: &mc::cmt_<'tcx>, fn consume_pat(
mode: euv::ConsumeMode) { &mut self,
_consume_pat: &hir::Pat,
cmt: &mc::cmt_<'tcx>,
mode: euv::ConsumeMode,
) {
debug!("consume_pat(cmt={:?},mode={:?})", cmt, mode); debug!("consume_pat(cmt={:?},mode={:?})", cmt, mode);
self.adjust_upvar_borrow_kind_for_consume(cmt, mode); self.adjust_upvar_borrow_kind_for_consume(cmt, mode);
} }
@ -611,9 +617,7 @@ impl<'a, 'gcx, 'tcx> euv::Delegate<'tcx> for InferBorrowKind<'a, 'gcx, 'tcx> {
) { ) {
debug!( debug!(
"borrow(borrow_id={}, cmt={:?}, bk={:?})", "borrow(borrow_id={}, cmt={:?}, bk={:?})",
borrow_id, borrow_id, cmt, bk
cmt,
bk
); );
match bk { match bk {

View File

@ -306,7 +306,7 @@ impl<'cx, 'gcx, 'tcx> WritebackCx<'cx, 'gcx, 'tcx> {
ty::UpvarCapture::ByValue => ty::UpvarCapture::ByValue, ty::UpvarCapture::ByValue => ty::UpvarCapture::ByValue,
ty::UpvarCapture::ByRef(ref upvar_borrow) => { ty::UpvarCapture::ByRef(ref upvar_borrow) => {
let r = upvar_borrow.region; 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 { ty::UpvarCapture::ByRef(ty::UpvarBorrow {
kind: upvar_borrow.kind, kind: upvar_borrow.kind,
region: r, region: r,