1
Fork 0

Auto merge of #52928 - Mark-Simulacrum:borrowck-cleanup, r=cramertj

(old) borrowck cleanup

Primarily moves dataflow code based on CFG to borrowck; this is mostly so we don't forget to delete it once it becomes unused after we fully move to MIR borrowck.
This commit is contained in:
bors 2018-08-15 00:37:52 +00:00
commit fa23350a46
10 changed files with 31 additions and 85 deletions

View file

@ -135,7 +135,6 @@ pub mod middle {
pub mod borrowck; pub mod borrowck;
pub mod expr_use_visitor; pub mod expr_use_visitor;
pub mod cstore; pub mod cstore;
pub mod dataflow;
pub mod dead; pub mod dead;
pub mod dependency_format; pub mod dependency_format;
pub mod entry; pub mod entry;

View file

@ -91,7 +91,6 @@ struct CheckLoanCtxt<'a, 'tcx: 'a> {
dfcx_loans: &'a LoanDataFlow<'a, 'tcx>, dfcx_loans: &'a LoanDataFlow<'a, 'tcx>,
move_data: &'a move_data::FlowedMoveData<'a, 'tcx>, move_data: &'a move_data::FlowedMoveData<'a, 'tcx>,
all_loans: &'a [Loan<'tcx>], all_loans: &'a [Loan<'tcx>],
param_env: ty::ParamEnv<'tcx>,
movable_generator: bool, movable_generator: bool,
} }
@ -215,7 +214,6 @@ pub fn check_loans<'a, 'b, 'c, 'tcx>(bccx: &BorrowckCtxt<'a, 'tcx>,
dfcx_loans, dfcx_loans,
move_data, move_data,
all_loans, all_loans,
param_env,
movable_generator, movable_generator,
}; };
let rvalue_promotable_map = bccx.tcx.rvalue_promotable_map(def_id); let rvalue_promotable_map = bccx.tcx.rvalue_promotable_map(def_id);
@ -801,8 +799,7 @@ impl<'a, 'tcx> CheckLoanCtxt<'a, 'tcx> {
use_kind, use_kind,
&lp, &lp,
the_move, the_move,
moved_lp, moved_lp);
self.param_env);
false false
}); });
} }

View file

@ -163,15 +163,11 @@ pub fn gather_assignment<'a, 'tcx>(bccx: &BorrowckCtxt<'a, 'tcx>,
move_data: &MoveData<'tcx>, move_data: &MoveData<'tcx>,
assignment_id: hir::ItemLocalId, assignment_id: hir::ItemLocalId,
assignment_span: Span, assignment_span: Span,
assignee_loan_path: Rc<LoanPath<'tcx>>, assignee_loan_path: Rc<LoanPath<'tcx>>) {
assignee_id: hir::ItemLocalId,
mode: euv::MutateMode) {
move_data.add_assignment(bccx.tcx, move_data.add_assignment(bccx.tcx,
assignee_loan_path, assignee_loan_path,
assignment_id, assignment_id,
assignment_span, assignment_span);
assignee_id,
mode);
} }
// (keep in sync with move_error::report_cannot_move_out_of ) // (keep in sync with move_error::report_cannot_move_out_of )

View file

@ -28,8 +28,7 @@ pub fn guarantee_lifetime<'a, 'tcx>(bccx: &BorrowckCtxt<'a, 'tcx>,
span: Span, span: Span,
cause: euv::LoanCause, cause: euv::LoanCause,
cmt: &'a mc::cmt_<'tcx>, cmt: &'a mc::cmt_<'tcx>,
loan_region: ty::Region<'tcx>, loan_region: ty::Region<'tcx>)
_: ty::BorrowKind)
-> Result<(),()> { -> Result<(),()> {
//! Reports error if `loan_region` is larger than S //! Reports error if `loan_region` is larger than S
//! where S is `item_scope` if `cmt` is an upvar, //! where S is `item_scope` if `cmt` is an upvar,

View file

@ -145,12 +145,11 @@ impl<'a, 'tcx> euv::Delegate<'tcx> for GatherLoanCtxt<'a, 'tcx> {
assignment_id: ast::NodeId, assignment_id: ast::NodeId,
assignment_span: Span, assignment_span: Span,
assignee_cmt: &mc::cmt_<'tcx>, assignee_cmt: &mc::cmt_<'tcx>,
mode: euv::MutateMode) _: euv::MutateMode)
{ {
self.guarantee_assignment_valid(assignment_id, self.guarantee_assignment_valid(assignment_id,
assignment_span, assignment_span,
assignee_cmt, assignee_cmt);
mode);
} }
fn decl_without_init(&mut self, id: ast::NodeId, _span: Span) { fn decl_without_init(&mut self, id: ast::NodeId, _span: Span) {
@ -246,8 +245,7 @@ impl<'a, 'tcx> GatherLoanCtxt<'a, 'tcx> {
fn guarantee_assignment_valid(&mut self, fn guarantee_assignment_valid(&mut self,
assignment_id: ast::NodeId, assignment_id: ast::NodeId,
assignment_span: Span, assignment_span: Span,
cmt: &mc::cmt_<'tcx>, cmt: &mc::cmt_<'tcx>) {
mode: euv::MutateMode) {
let opt_lp = opt_loan_path(cmt); let opt_lp = opt_loan_path(cmt);
debug!("guarantee_assignment_valid(assignment_id={}, cmt={:?}) opt_lp={:?}", debug!("guarantee_assignment_valid(assignment_id={}, cmt={:?}) opt_lp={:?}",
@ -282,9 +280,7 @@ impl<'a, 'tcx> GatherLoanCtxt<'a, 'tcx> {
self.bccx.tcx.hir.node_to_hir_id(assignment_id) self.bccx.tcx.hir.node_to_hir_id(assignment_id)
.local_id, .local_id,
assignment_span, assignment_span,
lp, lp);
cmt.hir_id.local_id,
mode);
} }
None => { None => {
// This can occur with e.g. `*foo() = 5`. In such // This can occur with e.g. `*foo() = 5`. In such
@ -320,7 +316,7 @@ impl<'a, 'tcx> GatherLoanCtxt<'a, 'tcx> {
// Check that the lifetime of the borrow does not exceed // Check that the lifetime of the borrow does not exceed
// the lifetime of the data being borrowed. // the lifetime of the data being borrowed.
if lifetime::guarantee_lifetime(self.bccx, self.item_ub, if lifetime::guarantee_lifetime(self.bccx, self.item_ub,
borrow_span, cause, cmt, loan_region, req_kind).is_err() { borrow_span, cause, cmt, loan_region).is_err() {
return; // reported an error, no sense in reporting more. return; // reported an error, no sense in reporting more.
} }

View file

@ -24,10 +24,6 @@ use rustc::hir::HirId;
use rustc::hir::map as hir_map; use rustc::hir::map as hir_map;
use rustc::hir::map::blocks::FnLikeNode; use rustc::hir::map::blocks::FnLikeNode;
use rustc::cfg; use rustc::cfg;
use rustc::middle::dataflow::DataFlowContext;
use rustc::middle::dataflow::BitwiseOperator;
use rustc::middle::dataflow::DataFlowOperator;
use rustc::middle::dataflow::KillFrom;
use rustc::middle::borrowck::{BorrowCheckResult, SignalledError}; use rustc::middle::borrowck::{BorrowCheckResult, SignalledError};
use rustc::hir::def_id::{DefId, LocalDefId}; use rustc::hir::def_id::{DefId, LocalDefId};
use rustc::middle::expr_use_visitor as euv; use rustc::middle::expr_use_visitor as euv;
@ -54,6 +50,8 @@ use errors::{DiagnosticBuilder, DiagnosticId};
use rustc::hir; use rustc::hir;
use rustc::hir::intravisit::{self, Visitor}; use rustc::hir::intravisit::{self, Visitor};
use dataflow::{DataFlowContext, BitwiseOperator, DataFlowOperator, KillFrom};
pub mod check_loans; pub mod check_loans;
pub mod gather_loans; pub mod gather_loans;
@ -640,8 +638,7 @@ impl<'a, 'tcx> BorrowckCtxt<'a, 'tcx> {
use_kind: MovedValueUseKind, use_kind: MovedValueUseKind,
lp: &LoanPath<'tcx>, lp: &LoanPath<'tcx>,
the_move: &move_data::Move, the_move: &move_data::Move,
moved_lp: &LoanPath<'tcx>, moved_lp: &LoanPath<'tcx>) {
_param_env: ty::ParamEnv<'tcx>) {
let (verb, verb_participle) = match use_kind { let (verb, verb_participle) = match use_kind {
MovedInUse => ("use", "used"), MovedInUse => ("use", "used"),
MovedInCapture => ("capture", "captured"), MovedInCapture => ("capture", "captured"),
@ -806,23 +803,6 @@ impl<'a, 'tcx> BorrowckCtxt<'a, 'tcx> {
self.signal_error(); self.signal_error();
} }
pub fn struct_span_err_with_code<S: Into<MultiSpan>>(&self,
s: S,
msg: &str,
code: DiagnosticId)
-> DiagnosticBuilder<'a> {
self.tcx.sess.struct_span_err_with_code(s, msg, code)
}
pub fn span_err_with_code<S: Into<MultiSpan>>(
&self,
s: S,
msg: &str,
code: DiagnosticId,
) {
self.tcx.sess.span_err_with_code(s, msg, code);
}
fn report_bckerr(&self, err: &BckError<'a, 'tcx>) { fn report_bckerr(&self, err: &BckError<'a, 'tcx>) {
let error_span = err.span.clone(); let error_span = err.span.clone();

View file

@ -13,16 +13,12 @@
pub use self::MoveKind::*; pub use self::MoveKind::*;
use dataflow::{DataFlowContext, BitwiseOperator, DataFlowOperator, KillFrom};
use borrowck::*; use borrowck::*;
use rustc::cfg; use rustc::cfg;
use rustc::middle::dataflow::DataFlowContext;
use rustc::middle::dataflow::BitwiseOperator;
use rustc::middle::dataflow::DataFlowOperator;
use rustc::middle::dataflow::KillFrom;
use rustc::middle::expr_use_visitor as euv;
use rustc::middle::expr_use_visitor::MutateMode;
use rustc::ty::{self, TyCtxt}; use rustc::ty::{self, TyCtxt};
use rustc::util::nodemap::{FxHashMap, FxHashSet}; use rustc::util::nodemap::FxHashMap;
use std::cell::RefCell; use std::cell::RefCell;
use std::rc::Rc; use std::rc::Rc;
@ -51,9 +47,6 @@ pub struct MoveData<'tcx> {
/// assigned dataflow bits, but we track them because they still /// assigned dataflow bits, but we track them because they still
/// kill move bits. /// kill move bits.
pub path_assignments: RefCell<Vec<Assignment>>, pub path_assignments: RefCell<Vec<Assignment>>,
/// Assignments to a variable or path, like `x = foo`, but not `x += foo`.
pub assignee_ids: RefCell<FxHashSet<hir::ItemLocalId>>,
} }
pub struct FlowedMoveData<'a, 'tcx: 'a> { pub struct FlowedMoveData<'a, 'tcx: 'a> {
@ -151,9 +144,6 @@ pub struct Assignment {
/// span of node where assignment occurs /// span of node where assignment occurs
pub span: Span, pub span: Span,
/// id for place expression on lhs of assignment
pub assignee_id: hir::ItemLocalId,
} }
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
@ -388,9 +378,7 @@ impl<'a, 'tcx> MoveData<'tcx> {
pub fn add_assignment(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>, pub fn add_assignment(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>,
lp: Rc<LoanPath<'tcx>>, lp: Rc<LoanPath<'tcx>>,
assign_id: hir::ItemLocalId, assign_id: hir::ItemLocalId,
span: Span, span: Span) {
assignee_id: hir::ItemLocalId,
mode: euv::MutateMode) {
// Assigning to one union field automatically assigns to all its fields. // Assigning to one union field automatically assigns to all its fields.
if let LpExtend(ref base_lp, mutbl, LpInterior(opt_variant_id, interior)) = lp.kind { if let LpExtend(ref base_lp, mutbl, LpInterior(opt_variant_id, interior)) = lp.kind {
if let ty::TyAdt(adt_def, _) = base_lp.ty.sty { if let ty::TyAdt(adt_def, _) = base_lp.ty.sty {
@ -407,39 +395,28 @@ impl<'a, 'tcx> MoveData<'tcx> {
LpInterior(opt_variant_id, field)); LpInterior(opt_variant_id, field));
let sibling_lp = Rc::new(LoanPath::new(sibling_lp_kind, field_ty)); let sibling_lp = Rc::new(LoanPath::new(sibling_lp_kind, field_ty));
self.add_assignment_helper(tcx, sibling_lp, assign_id, self.add_assignment_helper(tcx, sibling_lp, assign_id,
span, assignee_id, mode); span);
} }
return; return;
} }
} }
} }
self.add_assignment_helper(tcx, lp.clone(), assign_id, span, assignee_id, mode); self.add_assignment_helper(tcx, lp.clone(), assign_id, span);
} }
fn add_assignment_helper(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>, fn add_assignment_helper(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>,
lp: Rc<LoanPath<'tcx>>, lp: Rc<LoanPath<'tcx>>,
assign_id: hir::ItemLocalId, assign_id: hir::ItemLocalId,
span: Span, span: Span) {
assignee_id: hir::ItemLocalId, debug!("add_assignment(lp={:?}, assign_id={:?}", lp, assign_id);
mode: euv::MutateMode) {
debug!("add_assignment(lp={:?}, assign_id={:?}, assignee_id={:?}",
lp, assign_id, assignee_id);
let path_index = self.move_path(tcx, lp.clone()); let path_index = self.move_path(tcx, lp.clone());
match mode {
MutateMode::Init | MutateMode::JustWrite => {
self.assignee_ids.borrow_mut().insert(assignee_id);
}
MutateMode::WriteAndRead => { }
}
let assignment = Assignment { let assignment = Assignment {
path: path_index, path: path_index,
id: assign_id, id: assign_id,
span, span,
assignee_id,
}; };
if self.is_var_path(path_index) { if self.is_var_path(path_index) {

View file

@ -14,9 +14,9 @@
//! and thus uses bitvectors. Your job is simply to specify the so-called //! and thus uses bitvectors. Your job is simply to specify the so-called
//! GEN and KILL bits for each expression. //! GEN and KILL bits for each expression.
use cfg; use rustc::cfg;
use cfg::CFGIndex; use rustc::cfg::CFGIndex;
use ty::TyCtxt; use rustc::ty::TyCtxt;
use std::io; use std::io;
use std::mem; use std::mem;
use std::usize; use std::usize;
@ -24,10 +24,10 @@ use syntax::print::pprust::PrintState;
use rustc_data_structures::graph::implementation::OUTGOING; use rustc_data_structures::graph::implementation::OUTGOING;
use util::nodemap::FxHashMap; use rustc::util::nodemap::FxHashMap;
use hir; use rustc::hir;
use hir::intravisit::{self, IdRange}; use rustc::hir::intravisit::{self, IdRange};
use hir::print as pprust; use rustc::hir::print as pprust;
#[derive(Copy, Clone, Debug)] #[derive(Copy, Clone, Debug)]
@ -193,7 +193,7 @@ fn build_local_id_to_index(body: Option<&hir::Body>,
fn add_entries_from_fn_body(index: &mut FxHashMap<hir::ItemLocalId, Vec<CFGIndex>>, fn add_entries_from_fn_body(index: &mut FxHashMap<hir::ItemLocalId, Vec<CFGIndex>>,
body: &hir::Body, body: &hir::Body,
entry: CFGIndex) { entry: CFGIndex) {
use hir::intravisit::Visitor; use rustc::hir::intravisit::Visitor;
struct Formals<'a> { struct Formals<'a> {
entry: CFGIndex, entry: CFGIndex,

View file

@ -21,7 +21,7 @@ use borrowck;
use borrowck::{BorrowckCtxt, LoanPath}; use borrowck::{BorrowckCtxt, LoanPath};
use dot; use dot;
use rustc::cfg::CFGIndex; use rustc::cfg::CFGIndex;
use rustc::middle::dataflow::{DataFlowOperator, DataFlowContext, EntryOrExit}; use dataflow::{DataFlowOperator, DataFlowContext, EntryOrExit};
use std::rc::Rc; use std::rc::Rc;
use dot::IntoCow; use dot::IntoCow;

View file

@ -39,4 +39,6 @@ mod borrowck;
pub mod graphviz; pub mod graphviz;
mod dataflow;
pub use borrowck::provide; pub use borrowck::provide;