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:
commit
fa23350a46
10 changed files with 31 additions and 85 deletions
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 )
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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,
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -39,4 +39,6 @@ mod borrowck;
|
||||||
|
|
||||||
pub mod graphviz;
|
pub mod graphviz;
|
||||||
|
|
||||||
|
mod dataflow;
|
||||||
|
|
||||||
pub use borrowck::provide;
|
pub use borrowck::provide;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue