about summary refs log tree commit diff
diff options
context:
space:
mode:
authorb-naber <bn263@gmx.de>2021-10-18 17:36:45 +0200
committerb-naber <bn263@gmx.de>2021-11-05 18:40:26 +0100
commit7530c43b79b8054924430e4cb643003aa273d79f (patch)
tree8bbfb302f0f64f5b11c74575c0430c91820d20a9
parent87ec5680c982e665e028cbec9219d7849a9535da (diff)
downloadrust-7530c43b79b8054924430e4cb643003aa273d79f.tar.gz
rust-7530c43b79b8054924430e4cb643003aa273d79f.zip
postpone evaluation of constants whose substs depend on inference vars or regions
-rw-r--r--compiler/rustc_infer/src/infer/mod.rs20
1 files changed, 17 insertions, 3 deletions
diff --git a/compiler/rustc_infer/src/infer/mod.rs b/compiler/rustc_infer/src/infer/mod.rs
index 6b905f67e68..4873d3a6421 100644
--- a/compiler/rustc_infer/src/infer/mod.rs
+++ b/compiler/rustc_infer/src/infer/mod.rs
@@ -21,6 +21,7 @@ use rustc_hir::def_id::{DefId, LocalDefId};
 use rustc_middle::infer::canonical::{Canonical, CanonicalVarValues};
 use rustc_middle::infer::unify_key::{ConstVarValue, ConstVariableValue};
 use rustc_middle::infer::unify_key::{ConstVariableOrigin, ConstVariableOriginKind, ToType};
+use rustc_middle::mir::interpret::ErrorHandled;
 use rustc_middle::mir::interpret::EvalToConstValueResult;
 use rustc_middle::traits::select;
 use rustc_middle::ty::error::{ExpectedFound, TypeError};
@@ -1584,10 +1585,23 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
         unevaluated: ty::Unevaluated<'tcx>,
         span: Option<Span>,
     ) -> EvalToConstValueResult<'tcx> {
-        let mut original_values = OriginalQueryValues::default();
-        let canonical = self.canonicalize_query((param_env, unevaluated), &mut original_values);
+        let param_env = self.tcx.erase_regions(param_env);
+        let mut substs = unevaluated.substs(self.tcx);
+        substs = self.tcx.erase_regions(substs);
+        substs = self.resolve_vars_if_possible(substs);
+
+        // Postpone the evaluation of constants whose substs depend on inference
+        // variables
+        if substs.has_infer_types_or_consts() {
+            return Err(ErrorHandled::TooGeneric);
+        }
+
+        let unevaluated = ty::Unevaluated {
+            def: unevaluated.def,
+            substs_: Some(substs),
+            promoted: unevaluated.promoted,
+        };
 
-        let (param_env, unevaluated) = canonical.value;
         // The return value is the evaluated value which doesn't contain any reference to inference
         // variables, thus we don't need to substitute back the original values.
         self.tcx.const_eval_resolve(param_env, unevaluated, span)