Skip to content

Commit

Permalink
Fix #104639, find the right lower bound region in the scenario of par…
Browse files Browse the repository at this point in the history
…tial order relations
  • Loading branch information
chenyukang committed Nov 23, 2022
1 parent 11432fe commit b0d39c6
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 20 deletions.
27 changes: 7 additions & 20 deletions compiler/rustc_borrowck/src/region_infer/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -758,27 +758,14 @@ impl<'tcx> RegionInferenceContext<'tcx> {
// Otherwise, we need to find the minimum remaining choice, if
// any, and take that.
debug!("choice_regions remaining are {:#?}", choice_regions);
let min = |r1: ty::RegionVid, r2: ty::RegionVid| -> Option<ty::RegionVid> {
let r1_outlives_r2 = self.universal_region_relations.outlives(r1, r2);
let r2_outlives_r1 = self.universal_region_relations.outlives(r2, r1);
match (r1_outlives_r2, r2_outlives_r1) {
(true, true) => Some(r1.min(r2)),
(true, false) => Some(r2),
(false, true) => Some(r1),
(false, false) => None,
}
let Some(&min_choice) = choice_regions.iter().find(|&r1| {
choice_regions.iter().all(|&r2| {
self.universal_region_relations.outlives(r2, *r1)
})
}) else {
debug!("no choice region outlived by all others");
return false;
};
let mut min_choice = choice_regions[0];
for &other_option in &choice_regions[1..] {
debug!(?min_choice, ?other_option,);
match min(min_choice, other_option) {
Some(m) => min_choice = m,
None => {
debug!(?min_choice, ?other_option, "incomparable; no min choice",);
return false;
}
}
}

let min_choice_scc = self.constraint_sccs.scc(min_choice);
debug!(?min_choice, ?min_choice_scc);
Expand Down
10 changes: 10 additions & 0 deletions src/test/ui/borrowck/issue-104639-lifetime-order.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// edition:2018
// check-pass

#![allow(dead_code)]
async fn fail<'a, 'b, 'c>(_: &'static str) where 'a: 'c, 'b: 'c, {}
async fn pass<'a, 'c, 'b>(_: &'static str) where 'a: 'c, 'b: 'c, {}
async fn pass2<'a, 'b, 'c>(_: &'static str) where 'a: 'c, 'b: 'c, 'c: 'a, {}
async fn pass3<'a, 'b, 'c>(_: &'static str) where 'a: 'b, 'b: 'c, 'c: 'a, {}

fn main() { }

0 comments on commit b0d39c6

Please sign in to comment.