Skip to content

Commit

Permalink
Auto merge of #88811 - jackh726:issue-88446, r=nikomatsakis
Browse files Browse the repository at this point in the history
Use a HashMap for UniverseInfo in mir borrowck

Fixes #88446

r? `@nikomatsakis`
  • Loading branch information
bors committed Sep 12, 2021
2 parents c7dbe7a + 47035e4 commit d2dfb0e
Show file tree
Hide file tree
Showing 6 changed files with 59 additions and 15 deletions.
6 changes: 3 additions & 3 deletions compiler/rustc_borrowck/src/region_infer/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ pub struct RegionInferenceContext<'tcx> {
FxHashMap<Location, FxHashMap<(RegionVid, RegionVid), (ConstraintCategory, Span)>>,

/// Map universe indexes to information on why we created it.
universe_causes: IndexVec<ty::UniverseIndex, UniverseInfo<'tcx>>,
universe_causes: FxHashMap<ty::UniverseIndex, UniverseInfo<'tcx>>,

/// Contains the minimum universe of any variable within the same
/// SCC. We will ensure that no SCC contains values that are not
Expand Down Expand Up @@ -256,7 +256,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
Location,
FxHashMap<(RegionVid, RegionVid), (ConstraintCategory, Span)>,
>,
universe_causes: IndexVec<ty::UniverseIndex, UniverseInfo<'tcx>>,
universe_causes: FxHashMap<ty::UniverseIndex, UniverseInfo<'tcx>>,
type_tests: Vec<TypeTest<'tcx>>,
liveness_constraints: LivenessValues<RegionVid>,
elements: &Rc<RegionValueElements>,
Expand Down Expand Up @@ -2149,7 +2149,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
}

crate fn universe_info(&self, universe: ty::UniverseIndex) -> UniverseInfo<'tcx> {
self.universe_causes[universe].clone()
self.universe_causes[&universe].clone()
}
}

Expand Down
14 changes: 9 additions & 5 deletions compiler/rustc_borrowck/src/type_check/canonical.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,10 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
None => UniverseInfo::other(),
};
for u in old_universe..universe {
let info_universe =
self.borrowck_context.constraints.universe_causes.push(universe_info.clone());
assert_eq!(u.as_u32() + 1, info_universe.as_u32());
self.borrowck_context
.constraints
.universe_causes
.insert(u + 1, universe_info.clone());
}
}

Expand All @@ -70,9 +71,12 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
let (instantiated, _) =
self.infcx.instantiate_canonical_with_fresh_inference_vars(span, canonical);

for _ in 0..canonical.max_universe.as_u32() {
for u in 0..canonical.max_universe.as_u32() {
let info = UniverseInfo::other();
self.borrowck_context.constraints.universe_causes.push(info);
self.borrowck_context
.constraints
.universe_causes
.insert(ty::UniverseIndex::from_u32(u), info);
}

instantiated
Expand Down
2 changes: 2 additions & 0 deletions compiler/rustc_borrowck/src/type_check/input_output.rs
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,8 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
b
}
};
// Note: if we have to introduce new placeholders during normalization above, then we won't have
// added those universes to the universe info, which we would want in `relate_tys`.
if let Err(terr) =
self.eq_types(a, b, Locations::All(span), ConstraintCategory::BoringNoLocation)
{
Expand Down
10 changes: 6 additions & 4 deletions compiler/rustc_borrowck/src/type_check/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,8 @@ pub(crate) fn type_check<'mir, 'tcx>(
upvars: &[Upvar<'tcx>],
) -> MirTypeckResults<'tcx> {
let implicit_region_bound = infcx.tcx.mk_region(ty::ReVar(universal_regions.fr_fn_body));
let mut universe_causes = FxHashMap::default();
universe_causes.insert(ty::UniverseIndex::from_u32(0), UniverseInfo::other());
let mut constraints = MirTypeckRegionConstraints {
placeholder_indices: PlaceholderIndices::default(),
placeholder_index_to_region: IndexVec::default(),
Expand All @@ -144,7 +146,7 @@ pub(crate) fn type_check<'mir, 'tcx>(
member_constraints: MemberConstraintSet::default(),
closure_bounds_mapping: Default::default(),
type_tests: Vec::default(),
universe_causes: IndexVec::from_elem_n(UniverseInfo::other(), 1),
universe_causes,
};

let CreateResult {
Expand All @@ -159,9 +161,9 @@ pub(crate) fn type_check<'mir, 'tcx>(
&mut constraints,
);

for _ in ty::UniverseIndex::ROOT..infcx.universe() {
for u in ty::UniverseIndex::ROOT..infcx.universe() {
let info = UniverseInfo::other();
constraints.universe_causes.push(info);
constraints.universe_causes.insert(u, info);
}

let mut borrowck_context = BorrowCheckContext {
Expand Down Expand Up @@ -924,7 +926,7 @@ crate struct MirTypeckRegionConstraints<'tcx> {
crate closure_bounds_mapping:
FxHashMap<Location, FxHashMap<(RegionVid, RegionVid), (ConstraintCategory, Span)>>,

crate universe_causes: IndexVec<ty::UniverseIndex, UniverseInfo<'tcx>>,
crate universe_causes: FxHashMap<ty::UniverseIndex, UniverseInfo<'tcx>>,

crate type_tests: Vec<TypeTest<'tcx>>,
}
Expand Down
7 changes: 4 additions & 3 deletions compiler/rustc_borrowck/src/type_check/relate_tys.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,10 +80,11 @@ impl TypeRelatingDelegate<'tcx> for NllTypeRelatingDelegate<'_, '_, 'tcx> {
}

fn create_next_universe(&mut self) -> ty::UniverseIndex {
let info_universe =
self.borrowck_context.constraints.universe_causes.push(self.universe_info.clone());
let universe = self.infcx.create_next_universe();
assert_eq!(info_universe, universe);
self.borrowck_context
.constraints
.universe_causes
.insert(universe, self.universe_info.clone());
universe
}

Expand Down
35 changes: 35 additions & 0 deletions src/test/ui/hrtb/issue-88446.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// check-pass

trait Yokeable<'a> {
type Output: 'a;
}
impl<'a> Yokeable<'a> for () {
type Output = ();
}

trait DataMarker<'data> {
type Yokeable: for<'a> Yokeable<'a>;
}
impl<'data> DataMarker<'data> for () {
type Yokeable = ();
}

struct DataPayload<'data, M>(&'data M);

impl DataPayload<'static, ()> {
pub fn map_project_with_capture<M2, T>(
_: for<'a> fn(
capture: T,
std::marker::PhantomData<&'a ()>,
) -> <M2::Yokeable as Yokeable<'a>>::Output,
) -> DataPayload<'static, M2>
where
M2: DataMarker<'static>,
{
todo!()
}
}

fn main() {
let _: DataPayload<()> = DataPayload::<()>::map_project_with_capture::<_, &()>(|_, _| todo!());
}

0 comments on commit d2dfb0e

Please sign in to comment.