Skip to content

Commit 7530c43

Browse files
committed
postpone evaluation of constants whose substs depend on inference vars or regions
1 parent 87ec568 commit 7530c43

File tree

1 file changed

+17
-3
lines changed
  • compiler/rustc_infer/src/infer

1 file changed

+17
-3
lines changed

compiler/rustc_infer/src/infer/mod.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ use rustc_hir::def_id::{DefId, LocalDefId};
2121
use rustc_middle::infer::canonical::{Canonical, CanonicalVarValues};
2222
use rustc_middle::infer::unify_key::{ConstVarValue, ConstVariableValue};
2323
use rustc_middle::infer::unify_key::{ConstVariableOrigin, ConstVariableOriginKind, ToType};
24+
use rustc_middle::mir::interpret::ErrorHandled;
2425
use rustc_middle::mir::interpret::EvalToConstValueResult;
2526
use rustc_middle::traits::select;
2627
use rustc_middle::ty::error::{ExpectedFound, TypeError};
@@ -1584,10 +1585,23 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
15841585
unevaluated: ty::Unevaluated<'tcx>,
15851586
span: Option<Span>,
15861587
) -> EvalToConstValueResult<'tcx> {
1587-
let mut original_values = OriginalQueryValues::default();
1588-
let canonical = self.canonicalize_query((param_env, unevaluated), &mut original_values);
1588+
let param_env = self.tcx.erase_regions(param_env);
1589+
let mut substs = unevaluated.substs(self.tcx);
1590+
substs = self.tcx.erase_regions(substs);
1591+
substs = self.resolve_vars_if_possible(substs);
1592+
1593+
// Postpone the evaluation of constants whose substs depend on inference
1594+
// variables
1595+
if substs.has_infer_types_or_consts() {
1596+
return Err(ErrorHandled::TooGeneric);
1597+
}
1598+
1599+
let unevaluated = ty::Unevaluated {
1600+
def: unevaluated.def,
1601+
substs_: Some(substs),
1602+
promoted: unevaluated.promoted,
1603+
};
15891604

1590-
let (param_env, unevaluated) = canonical.value;
15911605
// The return value is the evaluated value which doesn't contain any reference to inference
15921606
// variables, thus we don't need to substitute back the original values.
15931607
self.tcx.const_eval_resolve(param_env, unevaluated, span)

0 commit comments

Comments
 (0)