|
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