]>
Commit | Line | Data |
---|---|---|
74b04a01 | 1 | use rustc_infer::infer::TyCtxtInferExt; |
ba9703b0 XL |
2 | use rustc_middle::ty::query::Providers; |
3 | use rustc_middle::ty::{ParamEnvAnd, TyCtxt}; | |
4 | use rustc_span::source_map::DUMMY_SP; | |
5 | use rustc_trait_selection::traits::query::CanonicalPredicateGoal; | |
6 | use rustc_trait_selection::traits::{ | |
74b04a01 XL |
7 | EvaluationResult, Obligation, ObligationCause, OverflowError, SelectionContext, TraitQueryMode, |
8 | }; | |
83c7162d | 9 | |
9fa01778 | 10 | crate fn provide(p: &mut Providers<'_>) { |
dfeec247 | 11 | *p = Providers { evaluate_obligation, ..*p }; |
8faf50e0 XL |
12 | } |
13 | ||
14 | fn evaluate_obligation<'tcx>( | |
dc9dc135 | 15 | tcx: TyCtxt<'tcx>, |
0bf4aa26 | 16 | canonical_goal: CanonicalPredicateGoal<'tcx>, |
83c7162d | 17 | ) -> Result<EvaluationResult, OverflowError> { |
e74abb32 | 18 | debug!("evaluate_obligation(canonical_goal={:#?})", canonical_goal); |
0bf4aa26 XL |
19 | tcx.infer_ctxt().enter_with_canonical( |
20 | DUMMY_SP, | |
21 | &canonical_goal, | |
22 | |ref infcx, goal, _canonical_inference_vars| { | |
e74abb32 | 23 | debug!("evaluate_obligation: goal={:#?}", goal); |
dfeec247 | 24 | let ParamEnvAnd { param_env, value: predicate } = goal; |
83c7162d | 25 | |
0bf4aa26 XL |
26 | let mut selcx = SelectionContext::with_query_mode(&infcx, TraitQueryMode::Canonical); |
27 | let obligation = Obligation::new(ObligationCause::dummy(), param_env, predicate); | |
83c7162d | 28 | |
48663c56 | 29 | selcx.evaluate_root_obligation(&obligation) |
0bf4aa26 XL |
30 | }, |
31 | ) | |
83c7162d | 32 | } |