@@ -16,7 +16,8 @@ use triomphe::Arc;
1616use crate :: {
1717 db:: HirDatabase , infer:: InferenceContext , lower:: ParamLoweringMode ,
1818 mir:: monomorphize_mir_body_bad, to_placeholder_idx, utils:: Generics , Const , ConstData ,
19- ConstScalar , ConstValue , GenericArg , Interner , MemoryMap , Substitution , Ty , TyBuilder ,
19+ ConstScalar , ConstValue , GenericArg , Interner , MemoryMap , Substitution , TraitEnvironment , Ty ,
20+ TyBuilder ,
2021} ;
2122
2223use super :: mir:: { interpret_mir, lower_to_mir, pad16, MirEvalError , MirLowerError } ;
@@ -135,7 +136,7 @@ pub fn intern_const_ref(
135136 ty : Ty ,
136137 krate : CrateId ,
137138) -> Const {
138- let layout = db. layout_of_ty ( ty. clone ( ) , krate) ;
139+ let layout = db. layout_of_ty ( ty. clone ( ) , Arc :: new ( TraitEnvironment :: empty ( krate) ) ) ;
139140 let bytes = match value {
140141 LiteralConstRef :: Int ( i) => {
141142 // FIXME: We should handle failure of layout better.
@@ -173,7 +174,7 @@ pub fn try_const_usize(db: &dyn HirDatabase, c: &Const) -> Option<u128> {
173174 chalk_ir:: ConstValue :: Concrete ( c) => match & c. interned {
174175 ConstScalar :: Bytes ( it, _) => Some ( u128:: from_le_bytes ( pad16 ( & it, false ) ) ) ,
175176 ConstScalar :: UnevaluatedConst ( c, subst) => {
176- let ec = db. const_eval ( * c, subst. clone ( ) ) . ok ( ) ?;
177+ let ec = db. const_eval ( * c, subst. clone ( ) , None ) . ok ( ) ?;
177178 try_const_usize ( db, & ec)
178179 }
179180 _ => None ,
@@ -186,6 +187,7 @@ pub(crate) fn const_eval_recover(
186187 _: & [ String ] ,
187188 _: & GeneralConstId ,
188189 _: & Substitution ,
190+ _: & Option < Arc < TraitEnvironment > > ,
189191) -> Result < Const , ConstEvalError > {
190192 Err ( ConstEvalError :: MirLowerError ( MirLowerError :: Loop ) )
191193}
@@ -210,6 +212,7 @@ pub(crate) fn const_eval_query(
210212 db : & dyn HirDatabase ,
211213 def : GeneralConstId ,
212214 subst : Substitution ,
215+ trait_env : Option < Arc < TraitEnvironment > > ,
213216) -> Result < Const , ConstEvalError > {
214217 let body = match def {
215218 GeneralConstId :: ConstId ( c) => {
@@ -228,7 +231,7 @@ pub(crate) fn const_eval_query(
228231 }
229232 GeneralConstId :: InTypeConstId ( c) => db. mir_body ( c. into ( ) ) ?,
230233 } ;
231- let c = interpret_mir ( db, body, false ) . 0 ?;
234+ let c = interpret_mir ( db, body, false , trait_env ) . 0 ?;
232235 Ok ( c)
233236}
234237
@@ -241,7 +244,7 @@ pub(crate) fn const_eval_static_query(
241244 Substitution :: empty ( Interner ) ,
242245 db. trait_environment_for_body ( def. into ( ) ) ,
243246 ) ?;
244- let c = interpret_mir ( db, body, false ) . 0 ?;
247+ let c = interpret_mir ( db, body, false , None ) . 0 ?;
245248 Ok ( c)
246249}
247250
@@ -268,7 +271,7 @@ pub(crate) fn const_eval_discriminant_variant(
268271 Substitution :: empty ( Interner ) ,
269272 db. trait_environment_for_body ( def) ,
270273 ) ?;
271- let c = interpret_mir ( db, mir_body, false ) . 0 ?;
274+ let c = interpret_mir ( db, mir_body, false , None ) . 0 ?;
272275 let c = try_const_usize ( db, & c) . unwrap ( ) as i128 ;
273276 Ok ( c)
274277}
@@ -293,7 +296,7 @@ pub(crate) fn eval_to_const(
293296 }
294297 let infer = ctx. clone ( ) . resolve_all ( ) ;
295298 if let Ok ( mir_body) = lower_to_mir ( ctx. db , ctx. owner , & ctx. body , & infer, expr) {
296- if let Ok ( result) = interpret_mir ( db, Arc :: new ( mir_body) , true ) . 0 {
299+ if let Ok ( result) = interpret_mir ( db, Arc :: new ( mir_body) , true , None ) . 0 {
297300 return result;
298301 }
299302 }
0 commit comments