diff --git a/src/terminator/mod.rs b/src/terminator/mod.rs index 0c0239f592..a3ff8c1b54 100644 --- a/src/terminator/mod.rs +++ b/src/terminator/mod.rs @@ -493,6 +493,14 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { self.write_primval(dest, PrimVal::Ptr(ptr), dest_ty)?; } + "__rust_allocate_zeroed" => { + let size = self.value_to_primval(args[0], usize)?.to_u64()?; + let align = self.value_to_primval(args[1], usize)?.to_u64()?; + let ptr = self.memory.allocate(size, align)?; + self.memory.write_repeat(ptr, 0, size)?; + self.write_primval(dest, PrimVal::Ptr(ptr), dest_ty)?; + } + "__rust_deallocate" => { let ptr = args[0].read_ptr(&self.memory)?; // FIXME: insert sanity check for size and align? diff --git a/tests/run-pass/vecs.rs b/tests/run-pass/vecs.rs index b3a88014e6..fd3a00031d 100644 --- a/tests/run-pass/vecs.rs +++ b/tests/run-pass/vecs.rs @@ -13,6 +13,10 @@ fn make_vec_macro_repeat() -> Vec { vec![42; 5] } +fn make_vec_macro_repeat_zeroed() -> Vec { + vec![0; 7] +} + fn vec_into_iter() -> u8 { vec![1, 2, 3, 4] .into_iter() @@ -34,4 +38,5 @@ fn main() { assert_eq!(make_vec().capacity(), 4); assert_eq!(make_vec_macro(), [1, 2]); assert_eq!(make_vec_macro_repeat(), [42; 5]); + assert_eq!(make_vec_macro_repeat_zeroed(), [0; 7]); }