consider a loan escapes the function via applied member constraints
This commit is contained in:
parent
c69bd9480a
commit
fa45efaafb
2 changed files with 14 additions and 12 deletions
|
@ -272,21 +272,28 @@ impl<'tcx> PoloniusOutOfScopePrecomputer<'_, 'tcx> {
|
||||||
loan_issued_at: Location,
|
loan_issued_at: Location,
|
||||||
) {
|
) {
|
||||||
let sccs = self.regioncx.constraint_sccs();
|
let sccs = self.regioncx.constraint_sccs();
|
||||||
|
let universal_regions = self.regioncx.universal_regions();
|
||||||
let issuing_region_scc = sccs.scc(issuing_region);
|
let issuing_region_scc = sccs.scc(issuing_region);
|
||||||
|
|
||||||
// We first handle the cases where the loan doesn't go out of scope, depending on the issuing
|
// We first handle the cases where the loan doesn't go out of scope, depending on the issuing
|
||||||
// region's successors.
|
// region's successors.
|
||||||
for scc in sccs.depth_first_search(issuing_region_scc) {
|
for scc in sccs.depth_first_search(issuing_region_scc) {
|
||||||
// 1. Via member constraints
|
// 1. Via applied member constraints
|
||||||
//
|
//
|
||||||
// The issuing region can flow into the choice regions, and they are either:
|
// The issuing region can flow into the choice regions, and they are either:
|
||||||
// - placeholders or free regions themselves,
|
// - placeholders or free regions themselves,
|
||||||
// - or also transitively outlive a free region.
|
// - or also transitively outlive a free region.
|
||||||
//
|
//
|
||||||
// That is to say, if there are member constraints here, the loan escapes the function
|
// That is to say, if there are applied member constraints here, the loan escapes the
|
||||||
// and cannot go out of scope. We can early return.
|
// function and cannot go out of scope. We could early return here.
|
||||||
if self.regioncx.scc_has_member_constraints(scc) {
|
//
|
||||||
return;
|
// For additional insurance via fuzzing and crater, we verify that the constraint's min
|
||||||
|
// choice indeed escapes the function. In the future, we could e.g. turn this check into
|
||||||
|
// a debug assert and early return as an optimization.
|
||||||
|
for constraint in self.regioncx.applied_member_constraints(scc) {
|
||||||
|
if universal_regions.is_universal_region(constraint.min_choice) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. Via regions that are live at all points: placeholders and free regions.
|
// 2. Via regions that are live at all points: placeholders and free regions.
|
||||||
|
@ -413,12 +420,12 @@ impl<'a, 'tcx> Borrows<'a, 'tcx> {
|
||||||
let mut polonius_prec = PoloniusOutOfScopePrecomputer::new(body, regioncx);
|
let mut polonius_prec = PoloniusOutOfScopePrecomputer::new(body, regioncx);
|
||||||
for (loan_idx, loan_data) in borrow_set.iter_enumerated() {
|
for (loan_idx, loan_data) in borrow_set.iter_enumerated() {
|
||||||
let issuing_region = loan_data.region;
|
let issuing_region = loan_data.region;
|
||||||
let issued_location = loan_data.reserve_location;
|
let loan_issued_at = loan_data.reserve_location;
|
||||||
|
|
||||||
polonius_prec.precompute_loans_out_of_scope(
|
polonius_prec.precompute_loans_out_of_scope(
|
||||||
loan_idx,
|
loan_idx,
|
||||||
issuing_region,
|
issuing_region,
|
||||||
issued_location,
|
loan_issued_at,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2293,11 +2293,6 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
||||||
self.constraint_sccs.as_ref()
|
self.constraint_sccs.as_ref()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns whether the given SCC has any member constraints.
|
|
||||||
pub(crate) fn scc_has_member_constraints(&self, scc: ConstraintSccIndex) -> bool {
|
|
||||||
self.member_constraints.indices(scc).next().is_some()
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns whether the given SCC is live at all points: whether the representative is a
|
/// Returns whether the given SCC is live at all points: whether the representative is a
|
||||||
/// placeholder or a free region.
|
/// placeholder or a free region.
|
||||||
pub(crate) fn scc_is_live_at_all_points(&self, scc: ConstraintSccIndex) -> bool {
|
pub(crate) fn scc_is_live_at_all_points(&self, scc: ConstraintSccIndex) -> bool {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue