|
1 | 1 | use rustc::ty::{self, Ty, TypeAndMut}; |
2 | 2 | use rustc::ty::layout::{self, TyLayout, Size}; |
3 | 3 | use rustc::ty::adjustment::{PointerCast}; |
4 | | -use syntax::ast::{FloatTy, IntTy, UintTy}; |
| 4 | +use syntax::ast::FloatTy; |
5 | 5 | use syntax::symbol::sym; |
6 | 6 |
|
7 | 7 | use rustc_apfloat::ieee::{Single, Double}; |
@@ -248,18 +248,13 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpretCx<'mir, 'tcx, M> { |
248 | 248 | // Casting to a reference or fn pointer is not permitted by rustc, |
249 | 249 | // no need to support it here. |
250 | 250 | RawPtr(_) => Ok(ptr.into()), |
251 | | - Int(IntTy::Isize) | Uint(UintTy::Usize) => { |
252 | | - if let Ok(bits) = self.force_bits(Scalar::Ptr(ptr), self.memory.pointer_size()) { |
253 | | - self.cast_from_int(bits, src_layout, dest_layout) |
254 | | - } else { |
255 | | - Ok(ptr.into()) |
256 | | - } |
257 | | - } |
258 | 251 | Int(_) | Uint(_) => { |
259 | | - if let Ok(bits) = self.force_bits(Scalar::Ptr(ptr), self.memory.pointer_size()) { |
260 | | - self.cast_from_int(bits, src_layout, dest_layout) |
261 | | - } else { |
262 | | - err!(ReadPointerAsBytes) |
| 252 | + let size = self.memory.pointer_size(); |
| 253 | + |
| 254 | + match self.force_bits(Scalar::Ptr(ptr), size) { |
| 255 | + Ok(bits) => self.cast_from_int(bits, src_layout, dest_layout), |
| 256 | + Err(_) if dest_layout.size == size => Ok(ptr.into()), |
| 257 | + Err(e) => Err(e), |
263 | 258 | } |
264 | 259 | } |
265 | 260 | _ => return err!(Unimplemented(format!("ptr to {:?} cast", dest_layout.ty))), |
|
0 commit comments