From f2d895a655e515887dcda4981f8475c4d43e2505 Mon Sep 17 00:00:00 2001
From: David Renshaw <dwrenshaw@gmail.com>
Date: Sun, 3 Dec 2017 11:16:00 -0500
Subject: [PATCH] Pointer::with_primval_offset()

---
 src/lvalue.rs               | 11 +++--------
 src/memory.rs               |  9 +++++++++
 src/terminator/intrinsic.rs |  8 ++------
 3 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/src/lvalue.rs b/src/lvalue.rs
index 045f4f7..9d6145e 100644
--- a/src/lvalue.rs
+++ b/src/lvalue.rs
@@ -363,17 +363,12 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
                         PrimVal::Bytes(elem_size as u128),
                         PrimValKind::U64);
 
-                    match self.memory.constraints.add_binop_constraint(
+                    let offset = self.memory.constraints.add_binop_constraint(
                         mir::BinOp::Add,
                         p.offset.as_primval(),
                         byte_index,
-                        PrimValKind::U64) {
-                        PrimVal::Abstract(sbytes) => {
-                            PrimVal::Ptr(Pointer::new_abstract(p.alloc_id, sbytes))
-                        }
-                        _ => unreachable!(),
-                    }
-
+                        PrimValKind::U64);
+                    PrimVal::Ptr(Pointer::with_primval_offset(p.alloc_id, offset))
                 }
                 (Err(_), 0) => base_ptr,
                 (Err(e), _) => return Err(e),
diff --git a/src/memory.rs b/src/memory.rs
index 83a637a..124275d 100644
--- a/src/memory.rs
+++ b/src/memory.rs
@@ -96,6 +96,15 @@ impl Pointer {
         Pointer { alloc_id, offset: PointerOffset::Abstract(offset), }
     }
 
+    pub fn with_primval_offset(alloc_id: AllocId, offset: PrimVal) -> Self {
+        match offset {
+            PrimVal::Abstract(sbytes) => Pointer::new_abstract(alloc_id, sbytes),
+            PrimVal::Bytes(b) => Pointer::new(alloc_id, b as u64),
+            PrimVal::Undef => panic!("tried to construct pointer with undefined offset"),
+            PrimVal::Ptr(_) => panic!("tried to construct point with pointer offset"),
+        }
+    }
+
     pub fn has_concrete_offset(self) -> bool {
         match self.offset {
             PointerOffset::Concrete(_) => true,
diff --git a/src/terminator/intrinsic.rs b/src/terminator/intrinsic.rs
index 79b6b96..405a331 100644
--- a/src/terminator/intrinsic.rs
+++ b/src/terminator/intrinsic.rs
@@ -331,12 +331,8 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
                         ptr.to_ptr()?.offset.as_primval(),
                         byte_offset,
                         PrimValKind::U64);
-                    if let PrimVal::Abstract(sbytes) = new_offset {
-                        let new_ptr = Pointer::new_abstract(ptr.to_ptr()?.alloc_id, sbytes);
-                        self.write_primval(dest, PrimVal::Ptr(new_ptr), dest_ty)?;
-                    } else {
-                        unreachable!()
-                    }
+                    let new_ptr = Pointer::with_primval_offset(ptr.to_ptr()?.alloc_id, new_offset);
+                    self.write_primval(dest, PrimVal::Ptr(new_ptr), dest_ty)?;
                 }
             }
 
-- 
GitLab