|
1 | 1 | use itertools::{Either, Itertools}; |
2 | 2 | use rustc_data_structures::fx::FxHashSet; |
| 3 | +use rustc_index::interval::IntervalSet; |
3 | 4 | use rustc_middle::mir::visit::{TyContext, Visitor}; |
4 | 5 | use rustc_middle::mir::{Body, Local, Location, SourceInfo}; |
5 | 6 | use rustc_middle::ty::relate::Relate; |
6 | 7 | use rustc_middle::ty::{GenericArgsRef, Region, RegionVid, Ty, TyCtxt, TypeVisitable}; |
7 | 8 | use rustc_mir_dataflow::move_paths::MoveData; |
8 | | -use rustc_mir_dataflow::points::DenseLocationMap; |
| 9 | +use rustc_mir_dataflow::points::{DenseLocationMap, PointIndex}; |
9 | 10 | use rustc_span::span_bug; |
| 11 | +use rustc_trait_selection::traits::outlives_for_liveness::FreeRegionsVisitor; |
10 | 12 | use tracing::debug; |
11 | 13 |
|
12 | 14 | use super::TypeChecker; |
| 15 | +use crate::BorrowckInferCtxt; |
13 | 16 | use crate::constraints::OutlivesConstraintSet; |
14 | 17 | use crate::polonius::{PoloniusContext, record_live_region_variance}; |
15 | 18 | use crate::region_infer::values::LivenessValues; |
@@ -229,3 +232,18 @@ impl<'a, 'tcx> LiveVariablesVisitor<'a, 'tcx> { |
229 | 232 | } |
230 | 233 | } |
231 | 234 | } |
| 235 | + |
| 236 | +pub(crate) fn make_all_regions_live<'tcx>( |
| 237 | + infcx: &BorrowckInferCtxt<'tcx>, |
| 238 | + universal_regions: &UniversalRegions<'tcx>, |
| 239 | + liveness: &mut LivenessValues, |
| 240 | + value: impl TypeVisitable<TyCtxt<'tcx>>, |
| 241 | + live_at: &IntervalSet<PointIndex>, |
| 242 | +) { |
| 243 | + debug!("make_all_regions_live(value={value:?})"); |
| 244 | + value.visit_with(&mut FreeRegionsVisitor { |
| 245 | + tcx: infcx.tcx, |
| 246 | + param_env: infcx.param_env, |
| 247 | + op: |r| liveness.add_points(universal_regions.to_region_vid(r), live_at), |
| 248 | + }); |
| 249 | +} |
0 commit comments