|
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