From 70227c87bfecc96beebb62be1fff19ed4aa8e167 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 4 Jun 2017 18:18:37 -0700 Subject: [PATCH] fix arith_offset not taking the size of the type into account; test for offset --- src/terminator/intrinsic.rs | 7 ++++--- tests/run-pass/ptr_arith_offset.rs | 6 ++++++ tests/run-pass/ptr_offset.rs | 6 ++++++ 3 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 tests/run-pass/ptr_arith_offset.rs create mode 100644 tests/run-pass/ptr_offset.rs diff --git a/src/terminator/intrinsic.rs b/src/terminator/intrinsic.rs index 15bab4aacbfa..770cde777096 100644 --- a/src/terminator/intrinsic.rs +++ b/src/terminator/intrinsic.rs @@ -43,10 +43,11 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { "arith_offset" => { + // FIXME: Switch to non-checked, wrapped version of pointer_offset + let offset = self.value_to_primval(arg_vals[1], isize)?.to_i128()? as i64; let ptr = arg_vals[0].read_ptr(&self.memory)?; - let offset = self.value_to_primval(arg_vals[1], isize)?.to_i128()?; - let new_ptr = ptr.signed_offset(offset as i64); - self.write_primval(dest, PrimVal::Ptr(new_ptr), dest_ty)?; + let result_ptr = self.pointer_offset(ptr, substs.type_at(0), offset)?; + self.write_primval(dest, PrimVal::Ptr(result_ptr), dest_ty)?; } "assume" => { diff --git a/tests/run-pass/ptr_arith_offset.rs b/tests/run-pass/ptr_arith_offset.rs new file mode 100644 index 000000000000..7912da9fd437 --- /dev/null +++ b/tests/run-pass/ptr_arith_offset.rs @@ -0,0 +1,6 @@ +fn main() { + let v = [1i16, 2]; + let x = &v as *const i16; + let x = x.wrapping_offset(1); + assert_eq!(unsafe { *x }, 2); +} diff --git a/tests/run-pass/ptr_offset.rs b/tests/run-pass/ptr_offset.rs new file mode 100644 index 000000000000..6add5212db9f --- /dev/null +++ b/tests/run-pass/ptr_offset.rs @@ -0,0 +1,6 @@ +fn main() { + let v = [1i16, 2]; + let x = &v as *const i16; + let x = unsafe { x.offset(1) }; + assert_eq!(unsafe { *x }, 2); +}