Skip to content

Commit 5a8589d

Browse files
authored
Unrolled build for rust-lang#124893
Rollup merge of rust-lang#124893 - xldenis:public-region-apis, r=lcnr Make a minimal amount of region APIs public Tools like Creusot, Prusti or Gillian-Rust need to access information about the loans and regions that exist in MIR programs. While `rustc` provides information about loans, there is currently no public way to reason about the regions present in a MIR program. In particular, we to know which regions are actually equal to each other and which ones outlive each other. Currently, `rustc` provides access to `RegionInferenceContext` but the public api hides that last portion of the information. This PR proposes to make a few apis public, allowing verifiers to reason about the lifetimes present in Rust programs: - [eval_equal](https://doc.rust-lang.org/beta/nightly-rustc/rustc_borrowck/region_infer/struct.RegionInferenceContext.html#method.eval_equal) - [eval_outlives](https://doc.rust-lang.org/beta/nightly-rustc/rustc_borrowck/region_infer/struct.RegionInferenceContext.html#method.eval_outlives) - (Optional) [constraint_sccs](https://doc.rust-lang.org/beta/nightly-rustc/rustc_borrowck/region_infer/struct.RegionInferenceContext.html#method.constraint_sccs) The first two functions would allow us to compare regions and from this we can construct the set of `RegionVid` which are actually equal to each other, and then recover the inclusions between those regions, while the second allows for more direct, but _low level_ access to that information.
2 parents 238c1e7 + d4c6c77 commit 5a8589d

File tree

1 file changed

+14
-5
lines changed
  • compiler/rustc_borrowck/src/region_infer

1 file changed

+14
-5
lines changed

compiler/rustc_borrowck/src/region_infer/mod.rs

+14-5
Original file line numberDiff line numberDiff line change
@@ -1326,14 +1326,20 @@ impl<'tcx> RegionInferenceContext<'tcx> {
13261326
})
13271327
}
13281328

1329-
// Evaluate whether `sup_region == sub_region`.
1330-
fn eval_equal(&self, r1: RegionVid, r2: RegionVid) -> bool {
1329+
/// Evaluate whether `sup_region == sub_region`.
1330+
///
1331+
/// Panics if called before `solve()` executes,
1332+
// This is `pub` because it's used by unstable external borrowck data users, see `consumers.rs`.
1333+
pub fn eval_equal(&self, r1: RegionVid, r2: RegionVid) -> bool {
13311334
self.eval_outlives(r1, r2) && self.eval_outlives(r2, r1)
13321335
}
13331336

1334-
// Evaluate whether `sup_region: sub_region`.
1337+
/// Evaluate whether `sup_region: sub_region`.
1338+
///
1339+
/// Panics if called before `solve()` executes,
1340+
// This is `pub` because it's used by unstable external borrowck data users, see `consumers.rs`.
13351341
#[instrument(skip(self), level = "debug", ret)]
1336-
fn eval_outlives(&self, sup_region: RegionVid, sub_region: RegionVid) -> bool {
1342+
pub fn eval_outlives(&self, sup_region: RegionVid, sub_region: RegionVid) -> bool {
13371343
debug!(
13381344
"sup_region's value = {:?} universal={:?}",
13391345
self.region_value_str(sup_region),
@@ -2246,7 +2252,10 @@ impl<'tcx> RegionInferenceContext<'tcx> {
22462252
}
22472253

22482254
/// Access to the SCC constraint graph.
2249-
pub(crate) fn constraint_sccs(&self) -> &Sccs<RegionVid, ConstraintSccIndex> {
2255+
/// This can be used to quickly under-approximate the regions which are equal to each other
2256+
/// and their relative orderings.
2257+
// This is `pub` because it's used by unstable external borrowck data users, see `consumers.rs`.
2258+
pub fn constraint_sccs(&self) -> &Sccs<RegionVid, ConstraintSccIndex> {
22502259
self.constraint_sccs.as_ref()
22512260
}
22522261

0 commit comments

Comments
 (0)