nll: improve common patterns
This commit is contained in:
parent
2bda0c196f
commit
ffecbc5e10
3 changed files with 32 additions and 35 deletions
|
@ -439,17 +439,17 @@ impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
|
|||
Operand::Move(Place::Local(from)) if *from == target => {
|
||||
debug!("was_captured_by_trait_object: ty={:?}", ty);
|
||||
// Check the type for a trait object.
|
||||
match ty.sty {
|
||||
return match ty.sty {
|
||||
// `&dyn Trait`
|
||||
ty::TyKind::Ref(_, ty, _) if ty.is_trait() => return true,
|
||||
ty::TyKind::Ref(_, ty, _) if ty.is_trait() => true,
|
||||
// `Box<dyn Trait>`
|
||||
_ if ty.is_box() && ty.boxed_ty().is_trait() =>
|
||||
return true,
|
||||
true,
|
||||
// `dyn Trait`
|
||||
_ if ty.is_trait() => return true,
|
||||
_ if ty.is_trait() => true,
|
||||
// Anything else.
|
||||
_ => return false,
|
||||
}
|
||||
_ => false,
|
||||
};
|
||||
},
|
||||
_ => return false,
|
||||
},
|
||||
|
@ -464,32 +464,29 @@ impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
|
|||
let terminator = block.terminator();
|
||||
debug!("was_captured_by_trait_object: terminator={:?}", terminator);
|
||||
|
||||
match &terminator.kind {
|
||||
TerminatorKind::Call {
|
||||
destination: Some((Place::Local(dest), block)),
|
||||
args,
|
||||
..
|
||||
} => {
|
||||
debug!(
|
||||
"was_captured_by_trait_object: target={:?} dest={:?} args={:?}",
|
||||
target, dest, args
|
||||
);
|
||||
// Check if one of the arguments to this function is the target place.
|
||||
let found_target = args.iter().any(|arg| {
|
||||
if let Operand::Move(Place::Local(potential)) = arg {
|
||||
*potential == target
|
||||
} else {
|
||||
false
|
||||
}
|
||||
});
|
||||
|
||||
// If it is, follow this to the next block and update the target.
|
||||
if found_target {
|
||||
target = *dest;
|
||||
queue.push(block.start_location());
|
||||
if let TerminatorKind::Call {
|
||||
destination: Some((Place::Local(dest), block)),
|
||||
args,
|
||||
..
|
||||
} = &terminator.kind {
|
||||
debug!(
|
||||
"was_captured_by_trait_object: target={:?} dest={:?} args={:?}",
|
||||
target, dest, args
|
||||
);
|
||||
// Check if one of the arguments to this function is the target place.
|
||||
let found_target = args.iter().any(|arg| {
|
||||
if let Operand::Move(Place::Local(potential)) = arg {
|
||||
*potential == target
|
||||
} else {
|
||||
false
|
||||
}
|
||||
},
|
||||
_ => {},
|
||||
});
|
||||
|
||||
// If it is, follow this to the next block and update the target.
|
||||
if found_target {
|
||||
target = *dest;
|
||||
queue.push(block.start_location());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ pub(super) fn generate_invalidates<'cx, 'gcx, 'tcx>(
|
|||
mir: &Mir<'tcx>,
|
||||
borrow_set: &BorrowSet<'tcx>,
|
||||
) {
|
||||
if !all_facts.is_some() {
|
||||
if all_facts.is_none() {
|
||||
// Nothing to do if we don't have any facts
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -566,10 +566,10 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
|||
| hir::LifetimeName::Underscore => {
|
||||
let region_name = self.synthesize_region_name(counter);
|
||||
let ampersand_span = lifetime.span;
|
||||
return Some(RegionName {
|
||||
Some(RegionName {
|
||||
name: region_name,
|
||||
source: RegionNameSource::MatchedAdtAndSegment(ampersand_span),
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
hir::LifetimeName::Implicit => {
|
||||
|
@ -584,7 +584,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
|||
// T>`. We don't consider this a match; instead we let
|
||||
// the "fully elaborated" type fallback above handle
|
||||
// it.
|
||||
return None;
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue