rustc_traits/
implied_outlives_bounds.rs
1use rustc_infer::infer::TyCtxtInferExt;
6use rustc_infer::infer::canonical::{self, Canonical};
7use rustc_infer::traits::query::OutlivesBound;
8use rustc_infer::traits::query::type_op::ImpliedOutlivesBounds;
9use rustc_middle::query::Providers;
10use rustc_middle::ty::TyCtxt;
11use rustc_span::DUMMY_SP;
12use rustc_trait_selection::infer::InferCtxtBuilderExt;
13use rustc_trait_selection::traits::query::type_op::implied_outlives_bounds::compute_implied_outlives_bounds_inner;
14use rustc_trait_selection::traits::query::{CanonicalImpliedOutlivesBoundsGoal, NoSolution};
15
16pub(crate) fn provide(p: &mut Providers) {
17 *p = Providers { implied_outlives_bounds, ..*p };
18}
19
20fn implied_outlives_bounds<'tcx>(
21 tcx: TyCtxt<'tcx>,
22 (goal, disable_implied_bounds_hack): (CanonicalImpliedOutlivesBoundsGoal<'tcx>, bool),
23) -> Result<
24 &'tcx Canonical<'tcx, canonical::QueryResponse<'tcx, Vec<OutlivesBound<'tcx>>>>,
25 NoSolution,
26> {
27 tcx.infer_ctxt().enter_canonical_trait_query(&goal, |ocx, key| {
28 let (param_env, ImpliedOutlivesBounds { ty }) = key.into_parts();
29 compute_implied_outlives_bounds_inner(
30 ocx,
31 param_env,
32 ty,
33 DUMMY_SP,
34 disable_implied_bounds_hack,
35 )
36 })
37}