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 or the MIT license +// , 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); +}