Skip to content

Commit 3a423b7

Browse files
committed
fix eval_outlives for higher-ranked regions
When checking `'sup: 'sub`, take placeholder elements into account. This wasn't a problem previously (I hope!) because `eval_outlives` was only used for type_tests, which don't have higher-ranked outlive relations.
1 parent 0329621 commit 3a423b7

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed

compiler/rustc_borrowck/src/region_infer/mod.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1360,6 +1360,14 @@ impl<'tcx> RegionInferenceContext<'tcx> {
13601360
return self.eval_outlives(sup_region, self.universal_regions.fr_static);
13611361
}
13621362

1363+
// Check `sup_region` contains all the placeholder regions in `sub_region`.
1364+
if !self.scc_values.contains_placeholders(sup_region_scc, sub_region_scc) {
1365+
debug!(
1366+
"eval_outlives: returning false because sub region contains a placeholder region not present in super"
1367+
);
1368+
return false;
1369+
}
1370+
13631371
// Both the `sub_region` and `sup_region` consist of the union
13641372
// of some number of universal regions (along with the union
13651373
// of various points in the CFG; ignore those points for

compiler/rustc_borrowck/src/region_infer/values.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,22 @@ impl<N: Idx> RegionValues<N> {
303303
}
304304
}
305305

306+
/// Returns `true` if `sup_region` contains all the placeholder elements that
307+
/// `sub_region` contains.
308+
pub(crate) fn contains_placeholders(&self, sup_region: N, sub_region: N) -> bool {
309+
if let Some(sub_row) = self.placeholders.row(sub_region) {
310+
if let Some(sup_row) = self.placeholders.row(sup_region) {
311+
sup_row.superset(sub_row)
312+
} else {
313+
// sup row is empty, so sub row must be empty
314+
sub_row.is_empty()
315+
}
316+
} else {
317+
// sub row is empty, always true
318+
true
319+
}
320+
}
321+
306322
/// Returns the locations contained within a given region `r`.
307323
pub(crate) fn locations_outlived_by<'a>(&'a self, r: N) -> impl Iterator<Item = Location> + 'a {
308324
self.points.row(r).into_iter().flat_map(move |set| {

0 commit comments

Comments
 (0)