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::{
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}