Rollup merge of #30737 - Ms2ger:MutateMode, r=sanxiyn
This commit is contained in:
commit
caf6095fcf
@ -19,9 +19,8 @@ use middle::const_eval::{const_expr_to_pat, lookup_const_by_id};
|
||||
use middle::const_eval::EvalHint::ExprTypeChecked;
|
||||
use middle::def::*;
|
||||
use middle::def_id::{DefId};
|
||||
use middle::expr_use_visitor::{ConsumeMode, Delegate, ExprUseVisitor, Init};
|
||||
use middle::expr_use_visitor::{JustWrite, LoanCause, MutateMode};
|
||||
use middle::expr_use_visitor::WriteAndRead;
|
||||
use middle::expr_use_visitor::{ConsumeMode, Delegate, ExprUseVisitor};
|
||||
use middle::expr_use_visitor::{LoanCause, MutateMode};
|
||||
use middle::expr_use_visitor as euv;
|
||||
use middle::infer;
|
||||
use middle::mem_categorization::{cmt};
|
||||
@ -1161,10 +1160,10 @@ impl<'a, 'tcx> Delegate<'tcx> for MutationChecker<'a, 'tcx> {
|
||||
fn decl_without_init(&mut self, _: NodeId, _: Span) {}
|
||||
fn mutate(&mut self, _: NodeId, span: Span, _: cmt, mode: MutateMode) {
|
||||
match mode {
|
||||
JustWrite | WriteAndRead => {
|
||||
MutateMode::JustWrite | MutateMode::WriteAndRead => {
|
||||
span_err!(self.cx.tcx.sess, span, E0302, "cannot assign in a pattern guard")
|
||||
}
|
||||
Init => {}
|
||||
MutateMode::Init => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -12,7 +12,6 @@
|
||||
//! normal visitor, which just walks the entire body in one shot, the
|
||||
//! `ExprUseVisitor` determines how expressions are being used.
|
||||
|
||||
pub use self::MutateMode::*;
|
||||
pub use self::LoanCause::*;
|
||||
pub use self::ConsumeMode::*;
|
||||
pub use self::MoveReason::*;
|
||||
@ -465,7 +464,11 @@ impl<'d,'t,'a,'tcx> ExprUseVisitor<'d,'t,'a,'tcx> {
|
||||
self.consume_expr(&*output.expr);
|
||||
} else {
|
||||
self.mutate_expr(expr, &*output.expr,
|
||||
if output.is_rw { WriteAndRead } else { JustWrite });
|
||||
if output.is_rw {
|
||||
MutateMode::WriteAndRead
|
||||
} else {
|
||||
MutateMode::JustWrite
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -519,7 +522,7 @@ impl<'d,'t,'a,'tcx> ExprUseVisitor<'d,'t,'a,'tcx> {
|
||||
}
|
||||
|
||||
hir::ExprAssign(ref lhs, ref rhs) => {
|
||||
self.mutate_expr(expr, &**lhs, JustWrite);
|
||||
self.mutate_expr(expr, &**lhs, MutateMode::JustWrite);
|
||||
self.consume_expr(&**rhs);
|
||||
}
|
||||
|
||||
@ -532,7 +535,7 @@ impl<'d,'t,'a,'tcx> ExprUseVisitor<'d,'t,'a,'tcx> {
|
||||
assert!(::rustc_front::util::is_by_value_binop(op.node));
|
||||
|
||||
if !self.walk_overloaded_operator(expr, lhs, vec![rhs], PassArgs::ByValue) {
|
||||
self.mutate_expr(expr, &**lhs, WriteAndRead);
|
||||
self.mutate_expr(expr, &**lhs, MutateMode::WriteAndRead);
|
||||
self.consume_expr(&**rhs);
|
||||
}
|
||||
}
|
||||
@ -991,7 +994,7 @@ impl<'d,'t,'a,'tcx> ExprUseVisitor<'d,'t,'a,'tcx> {
|
||||
let def = def_map.borrow().get(&pat.id).unwrap().full_def();
|
||||
match mc.cat_def(pat.id, pat.span, pat_ty, def) {
|
||||
Ok(binding_cmt) => {
|
||||
delegate.mutate(pat.id, pat.span, binding_cmt, Init);
|
||||
delegate.mutate(pat.id, pat.span, binding_cmt, MutateMode::Init);
|
||||
}
|
||||
Err(_) => { }
|
||||
}
|
||||
|
@ -21,6 +21,7 @@ use self::UseError::*;
|
||||
use borrowck::*;
|
||||
use borrowck::InteriorKind::{InteriorElement, InteriorField};
|
||||
use rustc::middle::expr_use_visitor as euv;
|
||||
use rustc::middle::expr_use_visitor::MutateMode;
|
||||
use rustc::middle::infer;
|
||||
use rustc::middle::mem_categorization as mc;
|
||||
use rustc::middle::mem_categorization::Categorization;
|
||||
@ -161,7 +162,7 @@ impl<'a, 'tcx> euv::Delegate<'tcx> for CheckLoanCtxt<'a, 'tcx> {
|
||||
match opt_loan_path(&assignee_cmt) {
|
||||
Some(lp) => {
|
||||
match mode {
|
||||
euv::Init | euv::JustWrite => {
|
||||
MutateMode::Init | MutateMode::JustWrite => {
|
||||
// In a case like `path = 1`, then path does not
|
||||
// have to be *FULLY* initialized, but we still
|
||||
// must be careful lest it contains derefs of
|
||||
@ -171,7 +172,7 @@ impl<'a, 'tcx> euv::Delegate<'tcx> for CheckLoanCtxt<'a, 'tcx> {
|
||||
MovedInUse,
|
||||
&lp);
|
||||
}
|
||||
euv::WriteAndRead => {
|
||||
MutateMode::WriteAndRead => {
|
||||
// In a case like `path += 1`, then path must be
|
||||
// fully initialized, since we will read it before
|
||||
// we write it.
|
||||
|
@ -20,6 +20,7 @@ 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::middle::ty;
|
||||
use rustc::util::nodemap::{FnvHashMap, NodeSet};
|
||||
|
||||
@ -406,10 +407,10 @@ impl<'tcx> MoveData<'tcx> {
|
||||
self.fragments.borrow_mut().add_assignment(path_index);
|
||||
|
||||
match mode {
|
||||
euv::Init | euv::JustWrite => {
|
||||
MutateMode::Init | MutateMode::JustWrite => {
|
||||
self.assignee_ids.borrow_mut().insert(assignee_id);
|
||||
}
|
||||
euv::WriteAndRead => { }
|
||||
MutateMode::WriteAndRead => { }
|
||||
}
|
||||
|
||||
let assignment = Assignment {
|
||||
|
Loading…
Reference in New Issue
Block a user