Skip to content

Commit

Permalink
Anonymize late bound regions on transitive bounds that define assoc type
Browse files Browse the repository at this point in the history
  • Loading branch information
spastorino committed Feb 8, 2021
1 parent fd09255 commit 8d17c6a
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 15 deletions.
37 changes: 22 additions & 15 deletions compiler/rustc_infer/src/traits/util.rs
Expand Up @@ -292,26 +292,33 @@ pub fn transitive_bounds_that_define_assoc_type<'tcx>(
tcx: TyCtxt<'tcx>,
bounds: impl Iterator<Item = ty::PolyTraitRef<'tcx>>,
assoc_name: Ident,
) -> FxIndexSet<ty::PolyTraitRef<'tcx>> {
) -> impl Iterator<Item = ty::PolyTraitRef<'tcx>> {
let mut stack: Vec<_> = bounds.collect();
let mut trait_refs = FxIndexSet::default();

while let Some(trait_ref) = stack.pop() {
if trait_refs.insert(trait_ref) {
let super_predicates =
tcx.super_predicates_that_define_assoc_type((trait_ref.def_id(), Some(assoc_name)));
for (super_predicate, _) in super_predicates.predicates {
let bound_predicate = super_predicate.kind();
let subst_predicate = super_predicate
.subst_supertrait(tcx, &bound_predicate.rebind(trait_ref.skip_binder()));
if let Some(binder) = subst_predicate.to_opt_poly_trait_ref() {
stack.push(binder.value);
let mut visited = FxIndexSet::default();

std::iter::from_fn(move || {
while let Some(trait_ref) = stack.pop() {
let anon_trait_ref = tcx.anonymize_late_bound_regions(trait_ref);
if visited.insert(anon_trait_ref) {
let super_predicates = tcx.super_predicates_that_define_assoc_type((
trait_ref.def_id(),
Some(assoc_name),
));
for (super_predicate, _) in super_predicates.predicates {
let bound_predicate = super_predicate.kind();
let subst_predicate = super_predicate
.subst_supertrait(tcx, &bound_predicate.rebind(trait_ref.skip_binder()));
if let Some(binder) = subst_predicate.to_opt_poly_trait_ref() {
stack.push(binder.value);
}
}

return Some(trait_ref);
}
}
}

trait_refs
return None;
})
}

///////////////////////////////////////////////////////////////////////////
Expand Down
33 changes: 33 additions & 0 deletions src/test/ui/associated-type-bounds/traits-assoc-anonymized.rs
@@ -0,0 +1,33 @@
// check-pass

pub struct LookupInternedStorage;

impl<Q> QueryStorageOps<Q> for LookupInternedStorage
where
Q: Query,
for<'d> Q: QueryDb<'d>,
{
fn fmt_index(&self, db: &<Q as QueryDb<'_>>::DynDb) {
<<Q as QueryDb<'_>>::DynDb as HasQueryGroup<Q::Group>>::group_storage(db);
}
}

pub trait HasQueryGroup<G> {
fn group_storage(&self);
}

pub trait QueryStorageOps<Q>
where
Q: Query,
{
fn fmt_index(&self, db: &<Q as QueryDb<'_>>::DynDb);
}

pub trait QueryDb<'d> {
type DynDb: HasQueryGroup<Self::Group> + 'd;
type Group;
}

pub trait Query: for<'d> QueryDb<'d> {}

fn main() {}

0 comments on commit 8d17c6a

Please sign in to comment.