Skip to content

Commit

Permalink
nll: improve common patterns
Browse files Browse the repository at this point in the history
  • Loading branch information
ljedrz committed Oct 17, 2018
1 parent 2bda0c1 commit ffecbc5
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 35 deletions.
59 changes: 28 additions & 31 deletions src/librustc_mir/borrow_check/nll/explain_borrow/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
},
Expand All @@ -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());
}
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/librustc_mir/borrow_check/nll/invalidation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 => {
Expand All @@ -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
}
}
}
Expand Down

0 comments on commit ffecbc5

Please sign in to comment.