diff --git a/src/interpreter.rs b/src/interpreter.rs index 9b3312c224df..affd83bb0774 100644 --- a/src/interpreter.rs +++ b/src/interpreter.rs @@ -413,6 +413,21 @@ impl<'a, 'tcx: 'a, 'arena> Interpreter<'a, 'tcx, 'arena> { } } + // 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; diff --git a/test/vecs.rs b/test/vecs.rs index 53ca55aac1dc..763a1153ce92 100755 --- a/test/vecs.rs +++ b/test/vecs.rs @@ -14,6 +14,11 @@ fn make_vec_macro() -> Vec { vec![1, 2] } +#[miri_run] +fn make_vec_macro_repeat() -> Vec { + vec![42; 8] +} + #[miri_run] fn vec_int_iter() -> i32 { vec![1, 2, 3, 4].into_iter().fold(0, |x, y| x + y)