param_env: ty::ParamEnv<'tcx>,
def_id: DefId,
substs: SubstsRef<'tcx>,
-) -> InterpResult<'tcx, &'tcx ty::Const<'tcx>> {
+) -> InterpResult<'tcx, ConstValue<'tcx>> {
let tp_ty = substs.type_at(0);
let name = tcx.item_name(def_id);
Ok(match name {
sym::type_name => {
let alloc = type_name::alloc_type_name(tcx, tp_ty);
- tcx.mk_const(ty::Const {
- val: ty::ConstKind::Value(ConstValue::Slice {
- data: alloc,
- start: 0,
- end: alloc.len(),
- }),
- ty: tcx.mk_static_str(),
- })
+ ConstValue::Slice { data: alloc, start: 0, end: alloc.len() }
}
- sym::needs_drop => ty::Const::from_bool(tcx, tp_ty.needs_drop(tcx, param_env)),
+ sym::needs_drop => ConstValue::from_bool(tp_ty.needs_drop(tcx, param_env)),
sym::size_of | sym::min_align_of | sym::pref_align_of => {
let layout = tcx.layout_of(param_env.and(tp_ty)).map_err(|e| err_inval!(Layout(e)))?;
let n = match name {
sym::size_of => layout.size.bytes(),
_ => bug!(),
};
- ty::Const::from_usize(tcx, n)
- }
- sym::type_id => {
- ty::Const::from_bits(tcx, tcx.type_id_hash(tp_ty).into(), param_env.and(tcx.types.u64))
+ ConstValue::from_machine_usize(n, &tcx)
}
+ sym::type_id => ConstValue::from_u64(tcx.type_id_hash(tp_ty)),
other => bug!("`{}` is not a zero arg intrinsic", other),
})
}
| sym::type_id
| sym::type_name => {
let gid = GlobalId { instance, promoted: None };
- let val = self.const_eval(gid)?;
+ let ty = match intrinsic_name {
+ sym::min_align_of | sym::pref_align_of | sym::size_of => self.tcx.types.usize,
+ sym::needs_drop => self.tcx.types.bool,
+ sym::type_id => self.tcx.types.u64,
+ sym::type_name => self.tcx.mk_static_str(),
+ _ => span_bug!(span, "Already checked for nullary intrinsics"),
+ };
+ let val = self.const_eval(gid, ty)?;
self.copy_op(val, dest)?;
}