rustc_traits/
implied_outlives_bounds.rs

1//! Provider for the `implied_outlives_bounds` query.
2//! Do not call this query directory. See
3//! [`rustc_trait_selection::traits::query::type_op::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::TyCtxt;
11use rustc_span::DUMMY_SP;
12use rustc_trait_selection::infer::InferCtxtBuilderExt;
13use rustc_trait_selection::traits::query::type_op::implied_outlives_bounds::{
14    compute_implied_outlives_bounds_compat_inner, compute_implied_outlives_bounds_inner,
15};
16use rustc_trait_selection::traits::query::{CanonicalImpliedOutlivesBoundsGoal, NoSolution};
17
18pub(crate) fn provide(p: &mut Providers) {
19    *p = Providers { implied_outlives_bounds_compat, ..*p };
20    *p = Providers { implied_outlives_bounds, ..*p };
21}
22
23fn implied_outlives_bounds_compat<'tcx>(
24    tcx: TyCtxt<'tcx>,
25    goal: CanonicalImpliedOutlivesBoundsGoal<'tcx>,
26) -> Result<
27    &'tcx Canonical<'tcx, canonical::QueryResponse<'tcx, Vec<OutlivesBound<'tcx>>>>,
28    NoSolution,
29> {
30    tcx.infer_ctxt().enter_canonical_trait_query(&goal, |ocx, key| {
31        let (param_env, ImpliedOutlivesBounds { ty }) = key.into_parts();
32        compute_implied_outlives_bounds_compat_inner(ocx, param_env, ty, DUMMY_SP)
33    })
34}
35
36fn implied_outlives_bounds<'tcx>(
37    tcx: TyCtxt<'tcx>,
38    goal: CanonicalImpliedOutlivesBoundsGoal<'tcx>,
39) -> Result<
40    &'tcx Canonical<'tcx, canonical::QueryResponse<'tcx, Vec<OutlivesBound<'tcx>>>>,
41    NoSolution,
42> {
43    tcx.infer_ctxt().enter_canonical_trait_query(&goal, |ocx, key| {
44        let (param_env, ImpliedOutlivesBounds { ty }) = key.into_parts();
45        compute_implied_outlives_bounds_inner(ocx, param_env, ty, DUMMY_SP)
46    })
47}