|
1 | | -use ty::{self, TyCtxt, Ty, Instance, layout}; |
| 1 | +use ty::{self, TyCtxt, Ty, Instance}; |
| 2 | +use ty::layout::{self, LayoutOf}; |
2 | 3 | use mir; |
3 | 4 |
|
4 | 5 | use syntax::ast::Mutability; |
@@ -29,9 +30,12 @@ pub fn eval_body<'a, 'tcx>( |
29 | 30 | if ecx.tcx.has_attr(instance.def_id(), "linkage") { |
30 | 31 | return Err(ConstEvalError::NotConst("extern global".to_string()).into()); |
31 | 32 | } |
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); |
33 | 36 | 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)?; |
35 | 39 | assert!(!layout.is_unsized()); |
36 | 40 | let ptr = ecx.memory.allocate( |
37 | 41 | layout.size.bytes(), |
@@ -68,8 +72,7 @@ pub fn eval_body<'a, 'tcx>( |
68 | 72 | )?; |
69 | 73 | } |
70 | 74 | 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)) |
73 | 76 | })(); |
74 | 77 | (try, ecx) |
75 | 78 | } |
@@ -226,16 +229,14 @@ impl<'tcx> super::Machine<'tcx> for CompileTimeFunctionEvaluator { |
226 | 229 | match intrinsic_name { |
227 | 230 | "min_align_of" => { |
228 | 231 | 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(); |
230 | 233 | let align_val = PrimVal::from_u128(elem_align as u128); |
231 | 234 | ecx.write_primval(dest, align_val, dest_layout.ty)?; |
232 | 235 | } |
233 | 236 |
|
234 | 237 | "size_of" => { |
235 | 238 | 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; |
239 | 240 | ecx.write_primval(dest, PrimVal::from_u128(size), dest_layout.ty)?; |
240 | 241 | } |
241 | 242 |
|
|
0 commit comments