Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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!());
}