about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/librustc_mir/build/expr/as_rvalue.rs4
-rw-r--r--src/librustc_mir/repr.rs2
-rw-r--r--src/librustc_mir/visit.rs2
-rw-r--r--src/librustc_trans/trans/mir/rvalue.rs4
-rw-r--r--src/test/run-pass/mir_trans_array_2.rs20
5 files changed, 26 insertions, 6 deletions
diff --git a/src/librustc_mir/build/expr/as_rvalue.rs b/src/librustc_mir/build/expr/as_rvalue.rs
index 23ca22129fd..e351215276a 100644
--- a/src/librustc_mir/build/expr/as_rvalue.rs
+++ b/src/librustc_mir/build/expr/as_rvalue.rs
@@ -44,8 +44,8 @@ impl<'a,'tcx> Builder<'a,'tcx> {
             }
             ExprKind::Repeat { value, count } => {
                 let value_operand = unpack!(block = this.as_operand(block, value));
-                let count_operand = unpack!(block = this.as_operand(block, count));
-                block.and(Rvalue::Repeat(value_operand, count_operand))
+                let count = this.as_constant(count);
+                block.and(Rvalue::Repeat(value_operand, count))
             }
             ExprKind::Borrow { region, borrow_kind, arg } => {
                 let arg_lvalue = unpack!(block = this.as_lvalue(block, arg));
diff --git a/src/librustc_mir/repr.rs b/src/librustc_mir/repr.rs
index 89b1afa8723..4ab08f976d3 100644
--- a/src/librustc_mir/repr.rs
+++ b/src/librustc_mir/repr.rs
@@ -546,7 +546,7 @@ pub enum Rvalue<'tcx> {
     Use(Operand<'tcx>),
 
     // [x; 32]
-    Repeat(Operand<'tcx>, Operand<'tcx>),
+    Repeat(Operand<'tcx>, Constant<'tcx>),
 
     // &x or &mut x
     Ref(Region, BorrowKind, Lvalue<'tcx>),
diff --git a/src/librustc_mir/visit.rs b/src/librustc_mir/visit.rs
index b4d6075d0ad..9f214af6b24 100644
--- a/src/librustc_mir/visit.rs
+++ b/src/librustc_mir/visit.rs
@@ -134,7 +134,7 @@ pub trait Visitor<'tcx> {
 
             Rvalue::Repeat(ref value, ref len) => {
                 self.visit_operand(value);
-                self.visit_operand(len);
+                self.visit_constant(len);
             }
 
             Rvalue::Ref(r, bk, ref path) => {
diff --git a/src/librustc_trans/trans/mir/rvalue.rs b/src/librustc_trans/trans/mir/rvalue.rs
index f3515c04f3e..218edc200d4 100644
--- a/src/librustc_trans/trans/mir/rvalue.rs
+++ b/src/librustc_trans/trans/mir/rvalue.rs
@@ -51,9 +51,9 @@ impl<'bcx, 'tcx> MirContext<'bcx, 'tcx> {
 
             mir::Rvalue::Repeat(ref elem, ref count) => {
                 let elem = self.trans_operand(bcx, elem);
-                let size = self.trans_operand(bcx, count);
+                let size = self.trans_constant(bcx, count);
                 let base = expr::get_dataptr(bcx, lldest);
-                tvec::iter_vec_raw(bcx, base, elem.ty, size.llval, |b, vref, _| {
+                tvec::iter_vec_raw(bcx, base, elem.ty, size, |b, vref, _| {
                     build::Store(b, elem.llval, vref);
                     b
                 })
diff --git a/src/test/run-pass/mir_trans_array_2.rs b/src/test/run-pass/mir_trans_array_2.rs
new file mode 100644
index 00000000000..4aa686298e9
--- /dev/null
+++ b/src/test/run-pass/mir_trans_array_2.rs
@@ -0,0 +1,20 @@
+// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+#![feature(rustc_attrs)]
+
+#[rustc_mir]
+fn into_inner(x: u64) -> [u64; 1024] {
+    [x; 2*4*8*16]
+}
+
+fn main(){
+    let x: &[u64] = &[42; 1024];
+    assert_eq!(&into_inner(42)[..], x);
+}