11use super :: { ConstEvalResult , ErrorHandled , GlobalId } ;
22
3+ use crate :: infer:: canonical:: { Canonical , OriginalQueryValues } ;
4+ use crate :: infer:: InferCtxt ;
35use crate :: mir;
46use crate :: ty:: subst:: { InternalSubsts , SubstsRef } ;
57use crate :: ty:: { self , TyCtxt } ;
@@ -19,7 +21,7 @@ impl<'tcx> TyCtxt<'tcx> {
1921 let instance = ty:: Instance :: new ( def_id, substs) ;
2022 let cid = GlobalId { instance, promoted : None } ;
2123 let param_env = self . param_env ( def_id) . with_reveal_all ( ) ;
22- self . const_eval_validated ( param_env. and ( cid) )
24+ self . const_eval_validated ( Canonical :: empty ( param_env. and ( cid) ) )
2325 }
2426
2527 /// Resolves and evaluates a constant.
@@ -38,12 +40,8 @@ impl<'tcx> TyCtxt<'tcx> {
3840 substs : SubstsRef < ' tcx > ,
3941 span : Option < Span > ,
4042 ) -> ConstEvalResult < ' tcx > {
41- let instance = ty:: Instance :: resolve ( self , param_env, def_id, substs) ;
42- if let Some ( instance) = instance {
43- self . const_eval_instance ( param_env, instance, span)
44- } else {
45- Err ( ErrorHandled :: TooGeneric )
46- }
43+ self . infer_ctxt ( )
44+ . enter ( |ref infcx| infcx. const_eval_resolve ( param_env, def_id, substs, span) )
4745 }
4846
4947 pub fn const_eval_instance (
@@ -53,10 +51,11 @@ impl<'tcx> TyCtxt<'tcx> {
5351 span : Option < Span > ,
5452 ) -> ConstEvalResult < ' tcx > {
5553 let cid = GlobalId { instance, promoted : None } ;
54+ let canonical = Canonical :: empty ( param_env. and ( cid) ) ;
5655 if let Some ( span) = span {
57- self . at ( span) . const_eval_validated ( param_env . and ( cid ) )
56+ self . at ( span) . const_eval_validated ( canonical )
5857 } else {
59- self . const_eval_validated ( param_env . and ( cid ) )
58+ self . const_eval_validated ( canonical )
6059 }
6160 }
6261
@@ -68,6 +67,39 @@ impl<'tcx> TyCtxt<'tcx> {
6867 ) -> ConstEvalResult < ' tcx > {
6968 let cid = GlobalId { instance, promoted : Some ( promoted) } ;
7069 let param_env = ty:: ParamEnv :: reveal_all ( ) ;
71- self . const_eval_validated ( param_env. and ( cid) )
70+ self . const_eval_validated ( Canonical :: empty ( param_env. and ( cid) ) )
71+ }
72+ }
73+
74+ impl < ' a , ' tcx > InferCtxt < ' a , ' tcx > {
75+ pub fn const_eval_instance (
76+ & self ,
77+ param_env : ty:: ParamEnv < ' tcx > ,
78+ instance : ty:: Instance < ' tcx > ,
79+ span : Option < Span > ,
80+ ) -> ConstEvalResult < ' tcx > {
81+ let cid = GlobalId { instance, promoted : None } ;
82+ let mut orig_values = OriginalQueryValues :: default ( ) ;
83+ let canonical = self . canonicalize_query ( & param_env. and ( cid) , & mut orig_values) ;
84+ if let Some ( span) = span {
85+ self . tcx . at ( span) . const_eval_validated ( canonical)
86+ } else {
87+ self . tcx . const_eval_validated ( canonical)
88+ }
89+ }
90+
91+ pub fn const_eval_resolve (
92+ & self ,
93+ param_env : ty:: ParamEnv < ' tcx > ,
94+ def_id : DefId ,
95+ substs : SubstsRef < ' tcx > ,
96+ span : Option < Span > ,
97+ ) -> ConstEvalResult < ' tcx > {
98+ let instance = ty:: Instance :: resolve ( self , param_env, def_id, substs) ;
99+ if let Some ( instance) = instance {
100+ self . const_eval_instance ( param_env, instance, span)
101+ } else {
102+ Err ( ErrorHandled :: TooGeneric )
103+ }
72104 }
73105}
0 commit comments