@@ -21,6 +21,7 @@ use rustc_hir::def_id::{DefId, LocalDefId};
21
21
use rustc_middle:: infer:: canonical:: { Canonical , CanonicalVarValues } ;
22
22
use rustc_middle:: infer:: unify_key:: { ConstVarValue , ConstVariableValue } ;
23
23
use rustc_middle:: infer:: unify_key:: { ConstVariableOrigin , ConstVariableOriginKind , ToType } ;
24
+ use rustc_middle:: mir:: interpret:: ErrorHandled ;
24
25
use rustc_middle:: mir:: interpret:: EvalToConstValueResult ;
25
26
use rustc_middle:: traits:: select;
26
27
use rustc_middle:: ty:: error:: { ExpectedFound , TypeError } ;
@@ -1584,10 +1585,23 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
1584
1585
unevaluated : ty:: Unevaluated < ' tcx > ,
1585
1586
span : Option < Span > ,
1586
1587
) -> 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
+ } ;
1589
1604
1590
- let ( param_env, unevaluated) = canonical. value ;
1591
1605
// The return value is the evaluated value which doesn't contain any reference to inference
1592
1606
// variables, thus we don't need to substitute back the original values.
1593
1607
self . tcx . const_eval_resolve ( param_env, unevaluated, span)
0 commit comments