]> git.lizzy.rs Git - rust.git/commitdiff
Support [x; N] array repeat rvalues.
authorScott Olson <scott@solson.me>
Mon, 21 Mar 2016 09:34:24 +0000 (03:34 -0600)
committerScott Olson <scott@solson.me>
Mon, 21 Mar 2016 09:34:24 +0000 (03:34 -0600)
src/interpreter.rs
test/arrays.rs
test/loops.rs

index 8584b1af3cfbbaa2f8e409a4729a35007a1fbadd..9b3312c224dfe63e6dc9abb809b3825f2d673567 100644 (file)
@@ -530,8 +530,7 @@ fn eval_assignment(&mut self, lvalue: &mir::Lvalue<'tcx>, rvalue: &mir::Rvalue<'
                         assert_eq!(length, operands.len());
                         for (i, operand) in operands.iter().enumerate() {
                             let src = try!(self.eval_operand(operand));
-                            let offset = i * elem_size;
-                            let elem_dest = dest.offset(offset as isize);
+                            let elem_dest = dest.offset((i * elem_size) as isize);
                             try!(self.memory.copy(src, elem_dest, elem_size));
                         }
                     } else {
@@ -540,7 +539,17 @@ fn eval_assignment(&mut self, lvalue: &mir::Lvalue<'tcx>, rvalue: &mir::Rvalue<'
                 }
             }
 
-            Repeat(_, _) => unimplemented!(),
+            Repeat(ref operand, _) => {
+                if let Repr::Array { elem_size, length } = *dest_repr {
+                    let src = try!(self.eval_operand(operand));
+                    for i in 0..length {
+                        let elem_dest = dest.offset((i * elem_size) as isize);
+                        try!(self.memory.copy(src, elem_dest, elem_size));
+                    }
+                } else {
+                    panic!("expected Repr::Array target");
+                }
+            }
 
             Len(ref lvalue) => {
                 let src = try!(self.eval_lvalue(lvalue));
index 572fabe112f24f6c2b87b05b2266d39125495071..835e09780fc489d3c21dc5a880624d7909073ccf 100755 (executable)
@@ -29,21 +29,6 @@ fn index() -> i32 {
 }
 
 #[miri_run]
-fn index_for_loop() -> usize {
-    let mut sum = 0;
-    let a = [0, 10, 20, 30];
-    for i in 0..a.len() {
-        sum += a[i];
-    }
-    sum
-}
-
-#[miri_run]
-fn for_loop() -> usize {
-    let mut sum = 0;
-    let a = [0, 10, 20, 30];
-    for &n in &a {
-        sum += n;
-    }
-    sum
+fn array_repeat() -> [u8; 8] {
+    [42; 8]
 }
index 1cb8d464f79c1680ce16ed80f3aa66d722344364..b59c813a423e0fe674c02d1d6a5a597a02e72243 100644 (file)
@@ -13,3 +13,23 @@ fn factorial_loop() -> i64 {
 
     product
 }
+
+#[miri_run]
+fn index_for_loop() -> usize {
+    let mut sum = 0;
+    let a = [0, 10, 20, 30];
+    for i in 0..a.len() {
+        sum += a[i];
+    }
+    sum
+}
+
+#[miri_run]
+fn for_loop() -> usize {
+    let mut sum = 0;
+    let a = [0, 10, 20, 30];
+    for &n in &a {
+        sum += n;
+    }
+    sum
+}