@@ -16,7 +16,8 @@ use triomphe::Arc;
16
16
use crate :: {
17
17
db:: HirDatabase , infer:: InferenceContext , lower:: ParamLoweringMode ,
18
18
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 ,
20
21
} ;
21
22
22
23
use super :: mir:: { interpret_mir, lower_to_mir, pad16, MirEvalError , MirLowerError } ;
@@ -135,7 +136,7 @@ pub fn intern_const_ref(
135
136
ty : Ty ,
136
137
krate : CrateId ,
137
138
) -> 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) ) ) ;
139
140
let bytes = match value {
140
141
LiteralConstRef :: Int ( i) => {
141
142
// FIXME: We should handle failure of layout better.
@@ -173,7 +174,7 @@ pub fn try_const_usize(db: &dyn HirDatabase, c: &Const) -> Option<u128> {
173
174
chalk_ir:: ConstValue :: Concrete ( c) => match & c. interned {
174
175
ConstScalar :: Bytes ( it, _) => Some ( u128:: from_le_bytes ( pad16 ( & it, false ) ) ) ,
175
176
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 ( ) ?;
177
178
try_const_usize ( db, & ec)
178
179
}
179
180
_ => None ,
@@ -186,6 +187,7 @@ pub(crate) fn const_eval_recover(
186
187
_: & [ String ] ,
187
188
_: & GeneralConstId ,
188
189
_: & Substitution ,
190
+ _: & Option < Arc < TraitEnvironment > > ,
189
191
) -> Result < Const , ConstEvalError > {
190
192
Err ( ConstEvalError :: MirLowerError ( MirLowerError :: Loop ) )
191
193
}
@@ -210,6 +212,7 @@ pub(crate) fn const_eval_query(
210
212
db : & dyn HirDatabase ,
211
213
def : GeneralConstId ,
212
214
subst : Substitution ,
215
+ trait_env : Option < Arc < TraitEnvironment > > ,
213
216
) -> Result < Const , ConstEvalError > {
214
217
let body = match def {
215
218
GeneralConstId :: ConstId ( c) => {
@@ -228,7 +231,7 @@ pub(crate) fn const_eval_query(
228
231
}
229
232
GeneralConstId :: InTypeConstId ( c) => db. mir_body ( c. into ( ) ) ?,
230
233
} ;
231
- let c = interpret_mir ( db, body, false ) . 0 ?;
234
+ let c = interpret_mir ( db, body, false , trait_env ) . 0 ?;
232
235
Ok ( c)
233
236
}
234
237
@@ -241,7 +244,7 @@ pub(crate) fn const_eval_static_query(
241
244
Substitution :: empty ( Interner ) ,
242
245
db. trait_environment_for_body ( def. into ( ) ) ,
243
246
) ?;
244
- let c = interpret_mir ( db, body, false ) . 0 ?;
247
+ let c = interpret_mir ( db, body, false , None ) . 0 ?;
245
248
Ok ( c)
246
249
}
247
250
@@ -268,7 +271,7 @@ pub(crate) fn const_eval_discriminant_variant(
268
271
Substitution :: empty ( Interner ) ,
269
272
db. trait_environment_for_body ( def) ,
270
273
) ?;
271
- let c = interpret_mir ( db, mir_body, false ) . 0 ?;
274
+ let c = interpret_mir ( db, mir_body, false , None ) . 0 ?;
272
275
let c = try_const_usize ( db, & c) . unwrap ( ) as i128 ;
273
276
Ok ( c)
274
277
}
@@ -293,7 +296,7 @@ pub(crate) fn eval_to_const(
293
296
}
294
297
let infer = ctx. clone ( ) . resolve_all ( ) ;
295
298
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 {
297
300
return result;
298
301
}
299
302
}
0 commit comments