diff options
| -rw-r--r-- | compiler/rustc_trait_selection/src/traits/query/evaluate_obligation.rs | 28 |
1 files changed, 24 insertions, 4 deletions
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 2fa6c0c0259..2c1f604b033 100644 --- a/compiler/rustc_trait_selection/src/traits/query/evaluate_obligation.rs +++ b/compiler/rustc_trait_selection/src/traits/query/evaluate_obligation.rs @@ -1,3 +1,5 @@ +use rustc_middle::ty; + use crate::infer::canonical::OriginalQueryValues; use crate::infer::InferCtxt; use crate::traits::{ @@ -64,10 +66,28 @@ impl<'cx, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'cx, 'tcx> { obligation: &PredicateObligation<'tcx>, ) -> Result<EvaluationResult, OverflowError> { let mut _orig_values = OriginalQueryValues::default(); - let c_pred = self.canonicalize_query_keep_static( - obligation.param_env.and(obligation.predicate), - &mut _orig_values, - ); + + let (param_env, predicate) = match obligation.predicate.kind().skip_binder() { + ty::PredicateKind::Trait(mut pred) => { + let orig_pred_constness = pred.constness; + let env_constness = pred.constness.and(obligation.param_env.constness()); + + let predicate = if orig_pred_constness != pred.constness { + self.tcx.mk_predicate( + obligation.predicate.kind().rebind(ty::PredicateKind::Trait(pred)), + ) + } else { + obligation.predicate + }; + + (obligation.param_env.with_constness(env_constness), predicate) + } + // constness has no effect on the given predicate. + _ => (obligation.param_env.without_const(), obligation.predicate), + }; + + let c_pred = + self.canonicalize_query_keep_static(param_env.and(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`. |
