]> git.proxmox.com Git - rustc.git/blobdiff - compiler/rustc_trait_selection/src/traits/query/evaluate_obligation.rs
New upstream version 1.59.0+dfsg1
[rustc.git] / compiler / rustc_trait_selection / src / traits / query / evaluate_obligation.rs
index 2fa6c0c02597b77ebef3d29585b04f825ab7c46f..4874ba6f58cac5138dce636f32f856180b9a5f6b 100644 (file)
@@ -1,3 +1,5 @@
+use rustc_middle::ty;
+
 use crate::infer::canonical::OriginalQueryValues;
 use crate::infer::InferCtxt;
 use crate::traits::{
@@ -64,10 +66,21 @@ 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 = match obligation.predicate.kind().skip_binder() {
+            ty::PredicateKind::Trait(pred) => {
+                // we ignore the value set to it.
+                let mut _constness = pred.constness;
+                obligation
+                    .param_env
+                    .with_constness(_constness.and(obligation.param_env.constness()))
+            }
+            // constness has no effect on the given predicate.
+            _ => obligation.param_env.without_const(),
+        };
+
+        let c_pred = self
+            .canonicalize_query_keep_static(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`.