Auto merge of #128746 - compiler-errors:cache-super-outlives, r=lcnr
Cache supertrait outlives of impl header for soundness check This caches the results of computing the transitive supertraits of an impl and filtering it to its outlives obligations. This is purely an optimization to improve https://github.com/rust-lang/rust/pull/124336.
This commit is contained in:
commit
48090b11b5
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