1
Fork 0

has_deref: simpler comparison, ty fix

This commit is contained in:
ouz-a 2022-05-16 16:36:33 +03:00
parent c3e1e7a947
commit 447aaceed7
2 changed files with 7 additions and 19 deletions

View file

@ -1464,11 +1464,7 @@ impl<'tcx> Place<'tcx> {
/// If MirPhase >= Derefered and if projection contains Deref,
/// It's guaranteed to be in the first place
pub fn has_deref(&self) -> bool {
if !self.projection.is_empty() && self.projection[0] == PlaceElem::Deref {
true
} else {
false
}
self.projection.first() == Some(&PlaceElem::Deref)
}
/// Finds the innermost `Local` from this `Place`, *if* it is either a local itself or
@ -1546,11 +1542,7 @@ impl<'tcx> PlaceRef<'tcx> {
/// If MirPhase >= Derefered and if projection contains Deref,
/// It's guaranteed to be in the first place
pub fn has_deref(&self) -> bool {
if !self.projection.is_empty() && self.projection[0] == PlaceElem::Deref {
true
} else {
false
}
self.projection.first() == Some(&PlaceElem::Deref)
}
/// If this place represents a local variable like `_X` with no

View file

@ -15,13 +15,9 @@ pub struct AddRetag;
/// (Concurrent accesses by other threads are no problem as these are anyway non-atomic
/// copies. Data races are UB.)
fn is_stable(place: PlaceRef<'_>) -> bool {
if place.has_deref() {
// Which place this evaluates to can change with any memory write,
// so cannot assume deref to be stable.
return false;
} else {
return true;
}
// Which place this evaluates to can change with any memory write,
// so cannot assume deref to be stable.
!place.has_deref()
}
/// Determine whether this type may contain a reference (or box), and thus needs retagging.
@ -82,8 +78,8 @@ impl<'tcx> MirPass<'tcx> for AddRetag {
};
let place_base_raw = |place: &Place<'tcx>| {
// If this is a `Deref`, get the type of what we are deref'ing.
if place.ret_deref().is_some() {
let ty = place.ty(local_decls, tcx).ty;
if place.has_deref() {
let ty = &local_decls[place.local].ty;
ty.is_unsafe_ptr()
} else {
// Not a deref, and thus not raw.