Skip to content

Commit 42a534c

Browse files
committed
miri: monomorphize types iff they came from MIR.
1 parent fe58398 commit 42a534c

File tree

8 files changed

+134
-242
lines changed

8 files changed

+134
-242
lines changed

src/librustc/mir/interpret/const_eval.rs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
use ty::{self, TyCtxt, Ty, Instance, layout};
1+
use ty::{self, TyCtxt, Ty, Instance};
2+
use ty::layout::{self, LayoutOf};
23
use mir;
34

45
use syntax::ast::Mutability;
@@ -29,9 +30,12 @@ pub fn eval_body<'a, 'tcx>(
2930
if ecx.tcx.has_attr(instance.def_id(), "linkage") {
3031
return Err(ConstEvalError::NotConst("extern global".to_string()).into());
3132
}
32-
let mir = ecx.load_mir(instance.def)?;
33+
// FIXME(eddyb) use `Instance::ty` when it becomes available.
34+
let instance_ty =
35+
ecx.monomorphize(instance.def.def_ty(tcx), instance.substs);
3336
if tcx.interpret_interner.borrow().get_cached(cid).is_none() {
34-
let layout = ecx.type_layout_with_substs(mir.return_ty(), instance.substs)?;
37+
let mir = ecx.load_mir(instance.def)?;
38+
let layout = ecx.layout_of(instance_ty)?;
3539
assert!(!layout.is_unsized());
3640
let ptr = ecx.memory.allocate(
3741
layout.size.bytes(),
@@ -68,8 +72,7 @@ pub fn eval_body<'a, 'tcx>(
6872
)?;
6973
}
7074
let value = tcx.interpret_interner.borrow().get_cached(cid).expect("global not cached");
71-
let ret_ty = ecx.monomorphize(mir.return_ty(), instance.substs);
72-
Ok((value, ret_ty))
75+
Ok((value, instance_ty))
7376
})();
7477
(try, ecx)
7578
}
@@ -226,16 +229,14 @@ impl<'tcx> super::Machine<'tcx> for CompileTimeFunctionEvaluator {
226229
match intrinsic_name {
227230
"min_align_of" => {
228231
let elem_ty = substs.type_at(0);
229-
let elem_align = ecx.type_align(elem_ty)?;
232+
let elem_align = ecx.layout_of(elem_ty)?.align.abi();
230233
let align_val = PrimVal::from_u128(elem_align as u128);
231234
ecx.write_primval(dest, align_val, dest_layout.ty)?;
232235
}
233236

234237
"size_of" => {
235238
let ty = substs.type_at(0);
236-
let size = ecx.type_size(ty)?.expect(
237-
"size_of intrinsic called on unsized value",
238-
) as u128;
239+
let size = ecx.layout_of(ty)?.size.bytes() as u128;
239240
ecx.write_primval(dest, PrimVal::from_u128(size), dest_layout.ty)?;
240241
}
241242

0 commit comments

Comments
 (0)