ExprUseVisitor::Delegate consume only when moving
This commit is contained in:
parent
36f51c96dc
commit
6c3774eec4
@ -1528,19 +1528,11 @@ fn adjust_upvar_borrow_kind_for_consume(
|
||||
&mut self,
|
||||
place_with_id: &PlaceWithHirId<'tcx>,
|
||||
diag_expr_id: hir::HirId,
|
||||
mode: euv::ConsumeMode,
|
||||
) {
|
||||
debug!(
|
||||
"adjust_upvar_borrow_kind_for_consume(place_with_id={:?}, diag_expr_id={:?}, mode={:?})",
|
||||
place_with_id, diag_expr_id, mode
|
||||
"adjust_upvar_borrow_kind_for_consume(place_with_id={:?}, diag_expr_id={:?})",
|
||||
place_with_id, diag_expr_id
|
||||
);
|
||||
|
||||
// Copy types in ByValue scenarios need should be treated as ImmBorrows
|
||||
match mode {
|
||||
euv::ConsumeMode::Copy => unreachable!(),
|
||||
euv::ConsumeMode::Move => {}
|
||||
};
|
||||
|
||||
let tcx = self.fcx.tcx;
|
||||
let upvar_id = if let PlaceBase::Upvar(upvar_id) = place_with_id.place.base {
|
||||
upvar_id
|
||||
@ -1715,22 +1707,14 @@ fn fake_read(&mut self, place: Place<'tcx>, cause: FakeReadCause, diag_expr_id:
|
||||
}
|
||||
}
|
||||
|
||||
fn consume(
|
||||
&mut self,
|
||||
place_with_id: &PlaceWithHirId<'tcx>,
|
||||
diag_expr_id: hir::HirId,
|
||||
mode: euv::ConsumeMode,
|
||||
) {
|
||||
debug!(
|
||||
"consume(place_with_id={:?}, diag_expr_id={:?}, mode={:?})",
|
||||
place_with_id, diag_expr_id, mode
|
||||
);
|
||||
fn consume(&mut self, place_with_id: &PlaceWithHirId<'tcx>, diag_expr_id: hir::HirId) {
|
||||
debug!("consume(place_with_id={:?}, diag_expr_id={:?})", place_with_id, diag_expr_id);
|
||||
|
||||
if !self.capture_information.contains_key(&place_with_id.place) {
|
||||
self.init_capture_info_for_place(&place_with_id, diag_expr_id);
|
||||
}
|
||||
|
||||
self.adjust_upvar_borrow_kind_for_consume(&place_with_id, diag_expr_id, mode);
|
||||
self.adjust_upvar_borrow_kind_for_consume(&place_with_id, diag_expr_id);
|
||||
}
|
||||
|
||||
fn borrow(
|
||||
|
@ -2,8 +2,6 @@
|
||||
//! normal visitor, which just walks the entire body in one shot, the
|
||||
//! `ExprUseVisitor` determines how expressions are being used.
|
||||
|
||||
pub use self::ConsumeMode::*;
|
||||
|
||||
// Export these here so that Clippy can use them.
|
||||
pub use rustc_middle::hir::place::{Place, PlaceBase, PlaceWithHirId, Projection};
|
||||
|
||||
@ -28,19 +26,14 @@
|
||||
/// This trait defines the callbacks you can expect to receive when
|
||||
/// employing the ExprUseVisitor.
|
||||
pub trait Delegate<'tcx> {
|
||||
// The value found at `place` is either copied or moved, depending
|
||||
// The value found at `place` is moved, depending
|
||||
// on `mode`. Where `diag_expr_id` is the id used for diagnostics for `place`.
|
||||
//
|
||||
// The parameter `diag_expr_id` indicates the HIR id that ought to be used for
|
||||
// diagnostics. Around pattern matching such as `let pat = expr`, the diagnostic
|
||||
// id will be the id of the expression `expr` but the place itself will have
|
||||
// the id of the binding in the pattern `pat`.
|
||||
fn consume(
|
||||
&mut self,
|
||||
place_with_id: &PlaceWithHirId<'tcx>,
|
||||
diag_expr_id: hir::HirId,
|
||||
mode: ConsumeMode,
|
||||
);
|
||||
fn consume(&mut self, place_with_id: &PlaceWithHirId<'tcx>, diag_expr_id: hir::HirId);
|
||||
|
||||
// The value found at `place` is being borrowed with kind `bk`.
|
||||
// `diag_expr_id` is the id used for diagnostics (see `consume` for more details).
|
||||
@ -60,7 +53,7 @@ fn borrow(
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, PartialEq, Debug)]
|
||||
pub enum ConsumeMode {
|
||||
enum ConsumeMode {
|
||||
Copy, // reference to x where x has a type that copies
|
||||
Move, // reference to x where x has a type that moves
|
||||
}
|
||||
@ -146,7 +139,7 @@ fn delegate_consume(&mut self, place_with_id: &PlaceWithHirId<'tcx>, diag_expr_i
|
||||
let mode = copy_or_move(&self.mc, place_with_id);
|
||||
|
||||
match mode {
|
||||
ConsumeMode::Move => self.delegate.consume(place_with_id, diag_expr_id, mode),
|
||||
ConsumeMode::Move => self.delegate.consume(place_with_id, diag_expr_id),
|
||||
ConsumeMode::Copy => {
|
||||
self.delegate.borrow(place_with_id, diag_expr_id, ty::BorrowKind::ImmBorrow)
|
||||
}
|
||||
@ -662,9 +655,7 @@ fn walk_pat(&mut self, discr_place: &PlaceWithHirId<'tcx>, pat: &hir::Pat<'_>) {
|
||||
debug!("walk_pat binding consuming pat");
|
||||
let mode = copy_or_move(mc, &place);
|
||||
match mode {
|
||||
ConsumeMode::Move => {
|
||||
delegate.consume(place, discr_place.hir_id, mode)
|
||||
}
|
||||
ConsumeMode::Move => delegate.consume(place, discr_place.hir_id),
|
||||
ConsumeMode::Copy => delegate.borrow(
|
||||
place,
|
||||
discr_place.hir_id,
|
||||
@ -812,8 +803,8 @@ fn copy_or_move<'a, 'tcx>(
|
||||
place_with_id.place.ty(),
|
||||
mc.tcx().hir().span(place_with_id.hir_id),
|
||||
) {
|
||||
Move
|
||||
ConsumeMode::Move
|
||||
} else {
|
||||
Copy
|
||||
ConsumeMode::Copy
|
||||
}
|
||||
}
|
||||
|
@ -11,7 +11,7 @@
|
||||
use rustc_span::symbol::kw;
|
||||
use rustc_target::abi::LayoutOf;
|
||||
use rustc_target::spec::abi::Abi;
|
||||
use rustc_typeck::expr_use_visitor::{ConsumeMode, Delegate, ExprUseVisitor, PlaceBase, PlaceWithHirId};
|
||||
use rustc_typeck::expr_use_visitor::{Delegate, ExprUseVisitor, PlaceBase, PlaceWithHirId};
|
||||
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct BoxedLocal {
|
||||
@ -133,13 +133,10 @@ fn is_argument(map: rustc_middle::hir::map::Map<'_>, id: HirId) -> bool {
|
||||
}
|
||||
|
||||
impl<'a, 'tcx> Delegate<'tcx> for EscapeDelegate<'a, 'tcx> {
|
||||
fn consume(&mut self, cmt: &PlaceWithHirId<'tcx>, _: HirId, mode: ConsumeMode) {
|
||||
fn consume(&mut self, cmt: &PlaceWithHirId<'tcx>, _: HirId) {
|
||||
if cmt.place.projections.is_empty() {
|
||||
if let PlaceBase::Local(lid) = cmt.place.base {
|
||||
if let ConsumeMode::Move = mode {
|
||||
// moved out or in. clearly can't be localized
|
||||
self.set.remove(&lid);
|
||||
}
|
||||
self.set.remove(&lid);
|
||||
let map = &self.cx.tcx.hir();
|
||||
if let Some(Node::Binding(_)) = map.find(cmt.hir_id) {
|
||||
if self.set.contains(&lid) {
|
||||
|
@ -7,7 +7,7 @@
|
||||
use rustc_lint::LateContext;
|
||||
use rustc_middle::{mir::FakeReadCause, ty};
|
||||
use rustc_span::source_map::Span;
|
||||
use rustc_typeck::expr_use_visitor::{ConsumeMode, Delegate, ExprUseVisitor, PlaceBase, PlaceWithHirId};
|
||||
use rustc_typeck::expr_use_visitor::{Delegate, ExprUseVisitor, PlaceBase, PlaceWithHirId};
|
||||
|
||||
pub(super) fn check(cx: &LateContext<'_>, arg: &Expr<'_>, body: &Expr<'_>) {
|
||||
if let Some(higher::Range {
|
||||
@ -82,7 +82,7 @@ struct MutatePairDelegate<'a, 'tcx> {
|
||||
}
|
||||
|
||||
impl<'tcx> Delegate<'tcx> for MutatePairDelegate<'_, 'tcx> {
|
||||
fn consume(&mut self, _: &PlaceWithHirId<'tcx>, _: HirId, _: ConsumeMode) {}
|
||||
fn consume(&mut self, _: &PlaceWithHirId<'tcx>, _: HirId) {}
|
||||
|
||||
fn borrow(&mut self, cmt: &PlaceWithHirId<'tcx>, diag_expr_id: HirId, bk: ty::BorrowKind) {
|
||||
if let ty::BorrowKind::MutBorrow = bk {
|
||||
|
@ -326,10 +326,8 @@ fn move_common(&mut self, cmt: &euv::PlaceWithHirId<'_>) {
|
||||
}
|
||||
|
||||
impl<'tcx> euv::Delegate<'tcx> for MovedVariablesCtxt {
|
||||
fn consume(&mut self, cmt: &euv::PlaceWithHirId<'tcx>, _: HirId, mode: euv::ConsumeMode) {
|
||||
if let euv::ConsumeMode::Move = mode {
|
||||
self.move_common(cmt);
|
||||
}
|
||||
fn consume(&mut self, cmt: &euv::PlaceWithHirId<'tcx>, _: HirId) {
|
||||
self.move_common(cmt);
|
||||
}
|
||||
|
||||
fn borrow(&mut self, _: &euv::PlaceWithHirId<'tcx>, _: HirId, _: ty::BorrowKind) {}
|
||||
|
@ -10,7 +10,7 @@
|
||||
use rustc_middle::hir::map::Map;
|
||||
use rustc_middle::mir::FakeReadCause;
|
||||
use rustc_middle::ty;
|
||||
use rustc_typeck::expr_use_visitor::{ConsumeMode, Delegate, ExprUseVisitor, PlaceBase, PlaceWithHirId};
|
||||
use rustc_typeck::expr_use_visitor::{Delegate, ExprUseVisitor, PlaceBase, PlaceWithHirId};
|
||||
|
||||
/// Returns a set of mutated local variable IDs, or `None` if mutations could not be determined.
|
||||
pub fn mutated_variables<'tcx>(expr: &'tcx Expr<'_>, cx: &LateContext<'tcx>) -> Option<HirIdSet> {
|
||||
@ -67,7 +67,7 @@ fn update(&mut self, cat: &PlaceWithHirId<'tcx>) {
|
||||
}
|
||||
|
||||
impl<'tcx> Delegate<'tcx> for MutVarsDelegate {
|
||||
fn consume(&mut self, _: &PlaceWithHirId<'tcx>, _: HirId, _: ConsumeMode) {}
|
||||
fn consume(&mut self, _: &PlaceWithHirId<'tcx>, _: HirId) {}
|
||||
|
||||
fn borrow(&mut self, cmt: &PlaceWithHirId<'tcx>, _: HirId, bk: ty::BorrowKind) {
|
||||
if let ty::BorrowKind::MutBorrow = bk {
|
||||
|
Loading…
Reference in New Issue
Block a user