diff --git a/compiler/rustc_middle/src/query/mod.rs b/compiler/rustc_middle/src/query/mod.rs index 00ee7b8ec7709..b371d9ccb24e6 100644 --- a/compiler/rustc_middle/src/query/mod.rs +++ b/compiler/rustc_middle/src/query/mod.rs @@ -2,9 +2,9 @@ use crate::dep_graph::SerializedDepNodeIndex; use crate::mir::interpret::{GlobalId, LitToConstInput}; use crate::traits; use crate::traits::query::{ - CanonicalPredicateGoal, CanonicalProjectionGoal, CanonicalTyGoal, - CanonicalTypeOpAscribeUserTypeGoal, CanonicalTypeOpEqGoal, CanonicalTypeOpNormalizeGoal, - CanonicalTypeOpProvePredicateGoal, CanonicalTypeOpSubtypeGoal, + CanonicalProjectionGoal, CanonicalTyGoal, CanonicalTypeOpAscribeUserTypeGoal, + CanonicalTypeOpEqGoal, CanonicalTypeOpNormalizeGoal, CanonicalTypeOpProvePredicateGoal, + CanonicalTypeOpSubtypeGoal, }; use crate::ty::query::queries; use crate::ty::subst::{GenericArg, SubstsRef}; @@ -1531,14 +1531,6 @@ rustc_queries! { desc { "computing dropck types for `{:?}`", goal } } - /// Do not call this query directly: invoke `infcx.predicate_may_hold()` or - /// `infcx.predicate_must_hold()` instead. - query evaluate_obligation( - goal: CanonicalPredicateGoal<'tcx> - ) -> Result { - desc { "evaluating trait selection obligation `{}`", goal.value.value } - } - query evaluate_goal( goal: traits::CanonicalChalkEnvironmentAndGoal<'tcx> ) -> Result< diff --git a/compiler/rustc_middle/src/ty/query/mod.rs b/compiler/rustc_middle/src/ty/query/mod.rs index acfa58e511ed1..089b77280b1cf 100644 --- a/compiler/rustc_middle/src/ty/query/mod.rs +++ b/compiler/rustc_middle/src/ty/query/mod.rs @@ -18,9 +18,9 @@ use crate::mir::interpret::{ConstValue, EvalToAllocationRawResult, EvalToConstVa use crate::mir::interpret::{LitToConstError, LitToConstInput}; use crate::mir::mono::CodegenUnit; use crate::traits::query::{ - CanonicalPredicateGoal, CanonicalProjectionGoal, CanonicalTyGoal, - CanonicalTypeOpAscribeUserTypeGoal, CanonicalTypeOpEqGoal, CanonicalTypeOpNormalizeGoal, - CanonicalTypeOpProvePredicateGoal, CanonicalTypeOpSubtypeGoal, NoSolution, + CanonicalProjectionGoal, CanonicalTyGoal, CanonicalTypeOpAscribeUserTypeGoal, + CanonicalTypeOpEqGoal, CanonicalTypeOpNormalizeGoal, CanonicalTypeOpProvePredicateGoal, + CanonicalTypeOpSubtypeGoal, NoSolution, }; use crate::traits::query::{ DropckOutlivesResult, DtorckConstraint, MethodAutoderefStepsResult, NormalizationResult, diff --git a/compiler/rustc_trait_selection/src/traits/query/evaluate_obligation.rs b/compiler/rustc_trait_selection/src/traits/query/evaluate_obligation.rs index b83a4cd1e5775..0c753be158f08 100644 --- a/compiler/rustc_trait_selection/src/traits/query/evaluate_obligation.rs +++ b/compiler/rustc_trait_selection/src/traits/query/evaluate_obligation.rs @@ -1,7 +1,11 @@ -use crate::infer::canonical::OriginalQueryValues; +use rustc_infer::infer::TyCtxtInferExt; +use rustc_span::DUMMY_SP; + use crate::infer::InferCtxt; +use crate::infer::canonical::OriginalQueryValues; +use crate::traits::ty::ParamEnvAnd; use crate::traits::{ - EvaluationResult, OverflowError, PredicateObligation, SelectionContext, TraitQueryMode, + EvaluationResult, Obligation, ObligationCause, OverflowError, PredicateObligation, SelectionContext, TraitQueryMode, }; pub trait InferCtxtExt<'tcx> { @@ -66,10 +70,21 @@ impl<'cx, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'cx, 'tcx> { let mut _orig_values = OriginalQueryValues::default(); let c_pred = self .canonicalize_query(obligation.param_env.and(obligation.predicate), &mut _orig_values); - // Run canonical query. If overflow occurs, rerun from scratch but this time - // in standard trait query mode so that overflow is handled appropriately - // within `SelectionContext`. - self.tcx.evaluate_obligation(c_pred) + + debug!("evaluate_obligation: c_pred={:#?}", c_pred); + self.tcx.infer_ctxt().enter_with_canonical( + DUMMY_SP, + &c_pred, + |ref infcx, goal, _canonical_inference_vars| { + debug!("evaluate_obligation: goal={:#?}", goal); + let ParamEnvAnd { param_env, value: predicate } = goal; + + let mut selcx = SelectionContext::with_query_mode(&infcx, TraitQueryMode::Canonical); + let obligation = Obligation::new(ObligationCause::dummy(), param_env, predicate); + + selcx.evaluate_root_obligation(&obligation) + }, + ) } // Helper function that canonicalizes and runs the query. If an diff --git a/compiler/rustc_traits/src/evaluate_obligation.rs b/compiler/rustc_traits/src/evaluate_obligation.rs deleted file mode 100644 index 2404b7ff4b54a..0000000000000 --- a/compiler/rustc_traits/src/evaluate_obligation.rs +++ /dev/null @@ -1,32 +0,0 @@ -use rustc_infer::infer::TyCtxtInferExt; -use rustc_middle::ty::query::Providers; -use rustc_middle::ty::{ParamEnvAnd, TyCtxt}; -use rustc_span::source_map::DUMMY_SP; -use rustc_trait_selection::traits::query::CanonicalPredicateGoal; -use rustc_trait_selection::traits::{ - EvaluationResult, Obligation, ObligationCause, OverflowError, SelectionContext, TraitQueryMode, -}; - -crate fn provide(p: &mut Providers) { - *p = Providers { evaluate_obligation, ..*p }; -} - -fn evaluate_obligation<'tcx>( - tcx: TyCtxt<'tcx>, - canonical_goal: CanonicalPredicateGoal<'tcx>, -) -> Result { - debug!("evaluate_obligation(canonical_goal={:#?})", canonical_goal); - tcx.infer_ctxt().enter_with_canonical( - DUMMY_SP, - &canonical_goal, - |ref infcx, goal, _canonical_inference_vars| { - debug!("evaluate_obligation: goal={:#?}", goal); - let ParamEnvAnd { param_env, value: predicate } = goal; - - let mut selcx = SelectionContext::with_query_mode(&infcx, TraitQueryMode::Canonical); - let obligation = Obligation::new(ObligationCause::dummy(), param_env, predicate); - - selcx.evaluate_root_obligation(&obligation) - }, - ) -} diff --git a/compiler/rustc_traits/src/lib.rs b/compiler/rustc_traits/src/lib.rs index 7b688cd3e2199..94377389cbda8 100644 --- a/compiler/rustc_traits/src/lib.rs +++ b/compiler/rustc_traits/src/lib.rs @@ -14,7 +14,6 @@ extern crate rustc_middle; mod chalk; mod dropck_outlives; -mod evaluate_obligation; mod implied_outlives_bounds; mod normalize_erasing_regions; mod normalize_projection_ty; @@ -24,7 +23,6 @@ use rustc_middle::ty::query::Providers; pub fn provide(p: &mut Providers) { dropck_outlives::provide(p); - evaluate_obligation::provide(p); implied_outlives_bounds::provide(p); chalk::provide(p); normalize_projection_ty::provide(p);