Skip to main content

rustc_traits/
implied_outlives_bounds.rs

1//! Provider for the `implied_outlives_bounds` query.
2//! Do not call this query directly. See
3//! [`rustc_trait_selection::traits::implied_outlives_bounds`].
4
5use 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::{ParamEnvAnd, TyCtxt};
11use rustc_trait_selection::infer::InferCtxtBuilderExt;
12use rustc_trait_selection::traits::implied_outlives_bounds::query_compute_implied_outlives_bounds;
13use rustc_trait_selection::traits::query::{CanonicalImpliedOutlivesBoundsGoal, NoSolution};
14
15pub(crate) fn provide(p: &mut Providers) {
16    *p = Providers { implied_outlives_bounds, ..*p };
17}
18
19fn implied_outlives_bounds<'tcx>(
20    tcx: TyCtxt<'tcx>,
21    (goal, disable_implied_bounds_hack): (CanonicalImpliedOutlivesBoundsGoal<'tcx>, bool),
22) -> Result<
23    &'tcx Canonical<'tcx, canonical::QueryResponse<'tcx, Vec<OutlivesBound<'tcx>>>>,
24    NoSolution,
25> {
26    tcx.infer_ctxt().enter_canonical_trait_query(&goal, |ocx, key| {
27        let ParamEnvAnd { param_env, value: ImpliedOutlivesBounds { ty } } = key;
28        query_compute_implied_outlives_bounds(ocx, param_env, ty, disable_implied_bounds_hack)
29    })
30}