@@ -21,6 +21,7 @@ use rustc_hir::def_id::{DefId, LocalDefId};
2121use rustc_middle:: infer:: canonical:: { Canonical , CanonicalVarValues } ;
2222use rustc_middle:: infer:: unify_key:: { ConstVarValue , ConstVariableValue } ;
2323use rustc_middle:: infer:: unify_key:: { ConstVariableOrigin , ConstVariableOriginKind , ToType } ;
24+ use rustc_middle:: mir:: interpret:: ErrorHandled ;
2425use rustc_middle:: mir:: interpret:: EvalToConstValueResult ;
2526use rustc_middle:: traits:: select;
2627use 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