Cache supertrait outlives of impl header for soundness check
This commit is contained in:
parent
60d146580c
commit
79228526bf
4 changed files with 42 additions and 26 deletions
|
@ -67,6 +67,7 @@ pub fn provide(providers: &mut Providers) {
|
|||
item_super_predicates: item_bounds::item_super_predicates,
|
||||
explicit_item_super_predicates: item_bounds::explicit_item_super_predicates,
|
||||
item_non_self_assumptions: item_bounds::item_non_self_assumptions,
|
||||
impl_super_outlives: item_bounds::impl_super_outlives,
|
||||
generics_of: generics_of::generics_of,
|
||||
predicates_of: predicates_of::predicates_of,
|
||||
predicates_defined_on,
|
||||
|
|
|
@ -212,6 +212,8 @@ pub(super) fn item_super_predicates(
|
|||
})
|
||||
}
|
||||
|
||||
/// This exists as an optimization to compute only the item bounds of the item
|
||||
/// that are not `Self` bounds.
|
||||
pub(super) fn item_non_self_assumptions(
|
||||
tcx: TyCtxt<'_>,
|
||||
def_id: DefId,
|
||||
|
@ -226,6 +228,25 @@ pub(super) fn item_non_self_assumptions(
|
|||
}
|
||||
}
|
||||
|
||||
/// This exists as an optimization to compute only the supertraits of this impl's
|
||||
/// trait that are outlives bounds.
|
||||
pub(super) fn impl_super_outlives(
|
||||
tcx: TyCtxt<'_>,
|
||||
def_id: DefId,
|
||||
) -> ty::EarlyBinder<'_, ty::Clauses<'_>> {
|
||||
tcx.impl_trait_header(def_id).expect("expected an impl of trait").trait_ref.map_bound(
|
||||
|trait_ref| {
|
||||
let clause: ty::Clause<'_> = trait_ref.upcast(tcx);
|
||||
tcx.mk_clauses_from_iter(util::elaborate(tcx, [clause]).filter(|clause| {
|
||||
matches!(
|
||||
clause.kind().skip_binder(),
|
||||
ty::ClauseKind::TypeOutlives(_) | ty::ClauseKind::RegionOutlives(_)
|
||||
)
|
||||
}))
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
struct AssocTyToOpaque<'tcx> {
|
||||
tcx: TyCtxt<'tcx>,
|
||||
fn_def_id: DefId,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue