]> git.lizzy.rs Git - rust.git/blob - src/librustc_traits/normalize_projection_ty.rs
Rollup merge of #68473 - nopsledder:rust_sanitizer_fuchsia, r=alexcrichton
[rust.git] / src / librustc_traits / normalize_projection_ty.rs
1 use rustc::infer::canonical::{Canonical, QueryResponse};
2 use rustc::traits::query::{normalize::NormalizationResult, CanonicalProjectionGoal, NoSolution};
3 use rustc::traits::{self, ObligationCause, SelectionContext, TraitEngineExt};
4 use rustc::ty::query::Providers;
5 use rustc::ty::{ParamEnvAnd, TyCtxt};
6 use rustc_hir as hir;
7 use rustc_span::DUMMY_SP;
8 use std::sync::atomic::Ordering;
9
10 crate fn provide(p: &mut Providers<'_>) {
11     *p = Providers { normalize_projection_ty, ..*p };
12 }
13
14 fn normalize_projection_ty<'tcx>(
15     tcx: TyCtxt<'tcx>,
16     goal: CanonicalProjectionGoal<'tcx>,
17 ) -> Result<&'tcx Canonical<'tcx, QueryResponse<'tcx, NormalizationResult<'tcx>>>, NoSolution> {
18     debug!("normalize_provider(goal={:#?})", goal);
19
20     tcx.sess.perf_stats.normalize_projection_ty.fetch_add(1, Ordering::Relaxed);
21     tcx.infer_ctxt().enter_canonical_trait_query(
22         &goal,
23         |infcx, fulfill_cx, ParamEnvAnd { param_env, value: goal }| {
24             let selcx = &mut SelectionContext::new(infcx);
25             let cause = ObligationCause::misc(DUMMY_SP, hir::DUMMY_HIR_ID);
26             let mut obligations = vec![];
27             let answer = traits::normalize_projection_type(
28                 selcx,
29                 param_env,
30                 goal,
31                 cause,
32                 0,
33                 &mut obligations,
34             );
35             fulfill_cx.register_predicate_obligations(infcx, obligations);
36             Ok(NormalizationResult { normalized_ty: answer })
37         },
38     )
39 }