Fix categorizations

This commit is contained in:
Manish Goregaokar 2019-11-28 07:33:12 -08:00
parent c1c5c3522d
commit 45842e5131
4 changed files with 12 additions and 25 deletions

View File

@ -104,14 +104,14 @@ fn is_argument(map: &hir::map::Map<'_>, id: HirId) -> bool {
impl<'a, 'tcx> Delegate<'tcx> for EscapeDelegate<'a, 'tcx> { impl<'a, 'tcx> Delegate<'tcx> for EscapeDelegate<'a, 'tcx> {
fn consume(&mut self, cmt: &Place<'tcx>, mode: ConsumeMode) { fn consume(&mut self, cmt: &Place<'tcx>, mode: ConsumeMode) {
if let Categorization::Local(lid) = cmt.cat { if let PlaceBase::Local(lid) = cmt.base {
if let ConsumeMode::Move = mode { if let ConsumeMode::Move = mode {
// moved out or in. clearly can't be localized // moved out or in. clearly can't be localized
self.set.remove(&lid); self.set.remove(&lid);
} }
} }
let map = &self.cx.tcx.hir(); let map = &self.cx.tcx.hir();
if let Categorization::Local(lid) = cmt.cat { if let PlaceBase::Local(lid) = cmt.base {
if let Some(Node::Binding(_)) = map.find(cmt.hir_id) { if let Some(Node::Binding(_)) = map.find(cmt.hir_id) {
if self.set.contains(&lid) { if self.set.contains(&lid) {
// let y = x where x is known // let y = x where x is known
@ -124,7 +124,7 @@ impl<'a, 'tcx> Delegate<'tcx> for EscapeDelegate<'a, 'tcx> {
} }
fn borrow(&mut self, cmt: &Place<'tcx>, _: ty::BorrowKind) { fn borrow(&mut self, cmt: &Place<'tcx>, _: ty::BorrowKind) {
if let Categorization::Local(lid) = cmt.cat { if let PlaceBase::Local(lid) = cmt.base {
self.set.remove(&lid); self.set.remove(&lid);
} }
} }

View File

@ -1588,7 +1588,7 @@ impl<'tcx> Delegate<'tcx> for MutatePairDelegate {
fn borrow(&mut self, cmt: &Place<'tcx>, bk: ty::BorrowKind) { fn borrow(&mut self, cmt: &Place<'tcx>, bk: ty::BorrowKind) {
if let ty::BorrowKind::MutBorrow = bk { if let ty::BorrowKind::MutBorrow = bk {
if let Categorization::Local(id) = cmt.cat { if let PlaceBase::Local(id) = cmt.base {
if Some(id) == self.hir_id_low { if Some(id) == self.hir_id_low {
self.span_low = Some(cmt.span) self.span_low = Some(cmt.span)
} }
@ -1600,7 +1600,7 @@ impl<'tcx> Delegate<'tcx> for MutatePairDelegate {
} }
fn mutate(&mut self, cmt: &Place<'tcx>) { fn mutate(&mut self, cmt: &Place<'tcx>) {
if let Categorization::Local(id) = cmt.cat { if let PlaceBase::Local(id) = cmt.base {
if Some(id) == self.hir_id_low { if Some(id) == self.hir_id_low {
self.span_low = Some(cmt.span) self.span_low = Some(cmt.span)
} }

View File

@ -325,9 +325,7 @@ struct MovedVariablesCtxt {
impl MovedVariablesCtxt { impl MovedVariablesCtxt {
fn move_common(&mut self, cmt: &euv::Place<'_>) { fn move_common(&mut self, cmt: &euv::Place<'_>) {
let cmt = unwrap_downcast_or_interior(cmt); if let euv::PlaceBase::Local(vid) = cmt.base {
if let mc::Categorization::Local(vid) = cmt.cat {
self.moved_vars.insert(vid); self.moved_vars.insert(vid);
} }
} }
@ -345,13 +343,3 @@ impl<'tcx> euv::Delegate<'tcx> for MovedVariablesCtxt {
fn mutate(&mut self, _: &euv::Place<'tcx>) {} fn mutate(&mut self, _: &euv::Place<'tcx>) {}
} }
fn unwrap_downcast_or_interior<'a, 'tcx>(mut cmt: &'a euv::Place<'tcx>) -> euv::Place<'tcx> {
loop {
match cmt.cat {
mc::Categorization::Downcast(ref c, _) | mc::Categorization::Interior(ref c, _) => {
cmt = c;
},
_ => return (*cmt).clone(),
}
}
}

View File

@ -42,18 +42,17 @@ struct MutVarsDelegate {
impl<'tcx> MutVarsDelegate { impl<'tcx> MutVarsDelegate {
#[allow(clippy::similar_names)] #[allow(clippy::similar_names)]
fn update(&mut self, cat: &'tcx Categorization<'_>) { fn update(&mut self, cat: &Place<'tcx>) {
match *cat { match cat.base {
Categorization::Local(id) => { PlaceBase::Local(id) => {
self.used_mutably.insert(id); self.used_mutably.insert(id);
}, },
Categorization::Upvar(_) => { PlaceBase::Upvar(_) => {
//FIXME: This causes false negatives. We can't get the `NodeId` from //FIXME: This causes false negatives. We can't get the `NodeId` from
//`Categorization::Upvar(_)`. So we search for any `Upvar`s in the //`Categorization::Upvar(_)`. So we search for any `Upvar`s in the
//`while`-body, not just the ones in the condition. //`while`-body, not just the ones in the condition.
self.skip = true self.skip = true
}, },
Categorization::Deref(ref cmt, _) | Categorization::Interior(ref cmt, _) => self.update(&cmt.cat),
_ => {}, _ => {},
} }
} }
@ -64,11 +63,11 @@ impl<'tcx> Delegate<'tcx> for MutVarsDelegate {
fn borrow(&mut self, cmt: &Place<'tcx>, bk: ty::BorrowKind) { fn borrow(&mut self, cmt: &Place<'tcx>, bk: ty::BorrowKind) {
if let ty::BorrowKind::MutBorrow = bk { if let ty::BorrowKind::MutBorrow = bk {
self.update(&cmt.cat) self.update(&cmt)
} }
} }
fn mutate(&mut self, cmt: &Place<'tcx>) { fn mutate(&mut self, cmt: &Place<'tcx>) {
self.update(&cmt.cat) self.update(&cmt)
} }
} }