]> git.lizzy.rs Git - rust.git/commitdiff
Support intrinsics::overflowing_sub for vec![x; n].
authorScott Olson <scott@solson.me>
Mon, 21 Mar 2016 09:42:34 +0000 (03:42 -0600)
committerScott Olson <scott@solson.me>
Mon, 21 Mar 2016 09:42:34 +0000 (03:42 -0600)
src/interpreter.rs
test/vecs.rs

index 9b3312c224dfe63e6dc9abb809b3825f2d673567..affd83bb07742f7aa8fd40b680a610bec32357ac 100644 (file)
@@ -413,6 +413,21 @@ fn call_intrinsic(&mut self, name: &str, substs: &'tcx Substs<'tcx>,
                 }
             }
 
+            // FIXME(tsion): Handle different integer types correctly. Use primvals?
+            "overflowing_sub" => {
+                let ty = *substs.types.get(subst::FnSpace, 0);
+                let size = self.ty_size(ty);
+
+                let left_arg  = try!(self.eval_operand(&args[0]));
+                let right_arg = try!(self.eval_operand(&args[1]));
+
+                let left = try!(self.memory.read_int(left_arg, size));
+                let right = try!(self.memory.read_int(right_arg, size));
+
+                let n = left.wrapping_sub(right);
+                try!(self.memory.write_int(dest, n, size));
+            }
+
             "size_of" => {
                 let ty = *substs.types.get(subst::FnSpace, 0);
                 let size = self.ty_size(ty) as u64;
index 53ca55aac1dc1e08d3f6204bad1659d2e8ab3214..763a1153ce922d7b20b469d8e28852028b6d6960 100755 (executable)
@@ -14,6 +14,11 @@ fn make_vec_macro() -> Vec<i32> {
     vec![1, 2]
 }
 
+#[miri_run]
+fn make_vec_macro_repeat() -> Vec<u8> {
+    vec![42; 8]
+}
+
 #[miri_run]
 fn vec_int_iter() -> i32 {
     vec![1, 2, 3, 4].into_iter().fold(0, |x, y| x + y)