about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-03-28 01:33:48 -0700
committerbors <bors@rust-lang.org>2013-03-28 01:33:48 -0700
commitd31053277aa8ced6778334d49de150b1393073eb (patch)
tree31668595eea6ddcaac498b6a3f16994d8c4fd4fa
parent3ff8e01cee398e3800d329e1017241a107b45e5b (diff)
parente5dda811a9818a3289a3a1354f98731e46730bd9 (diff)
downloadrust-d31053277aa8ced6778334d49de150b1393073eb.tar.gz
rust-d31053277aa8ced6778334d49de150b1393073eb.zip
auto merge of #5586 : pcwalton/rust/expr-repeat-vstore, r=graydon
r? @graydon
-rw-r--r--src/libcore/rt/context.rs2
-rw-r--r--src/librustc/middle/typeck/check/mod.rs14
-rw-r--r--src/libsyntax/parse/parser.rs16
-rw-r--r--src/test/run-pass/expr-repeat-vstore.rs23
4 files changed, 41 insertions, 14 deletions
diff --git a/src/libcore/rt/context.rs b/src/libcore/rt/context.rs
index 7237fe118d8..1a5d99c3404 100644
--- a/src/libcore/rt/context.rs
+++ b/src/libcore/rt/context.rs
@@ -126,7 +126,7 @@ fn initialize_call_frame(regs: &mut Registers, fptr: *c_void, arg: *c_void, sp:
 type Registers = [uint, ..22];
 
 #[cfg(target_arch = "x86_64")]
-fn new_regs() -> ~Registers { ~[0, .. 22] }
+fn new_regs() -> ~Registers { ~([0, .. 22]) }
 
 #[cfg(target_arch = "x86_64")]
 fn initialize_call_frame(regs: &mut Registers, fptr: *c_void, arg: *c_void, sp: *mut uint) {
diff --git a/src/librustc/middle/typeck/check/mod.rs b/src/librustc/middle/typeck/check/mod.rs
index 8762cdf516b..dcf75955509 100644
--- a/src/librustc/middle/typeck/check/mod.rs
+++ b/src/librustc/middle/typeck/check/mod.rs
@@ -2150,17 +2150,21 @@ pub fn check_expr_with_unifier(fcx: @mut FnCtxt,
             let count = ty::eval_repeat_count(tcx, count_expr);
             check_expr_with_hint(fcx, count_expr, ty::mk_uint(tcx));
             let tt = ast_expr_vstore_to_vstore(fcx, ev, count, vst);
+            let mutability = match vst {
+                ast::expr_vstore_mut_box | ast::expr_vstore_mut_slice => {
+                    ast::m_mutbl
+                }
+                _ => mutbl
+            };
             let t: ty::t = fcx.infcx().next_ty_var();
             check_expr_has_type(fcx, element, t);
             let arg_t = fcx.expr_ty(element);
             if ty::type_is_error(arg_t) {
                 ty::mk_err(tcx)
-            }
-            else if ty::type_is_bot(arg_t) {
+            } else if ty::type_is_bot(arg_t) {
                 ty::mk_bot(tcx)
-            }
-            else {
-                ty::mk_evec(tcx, ty::mt {ty: t, mutbl: mutbl}, tt)
+            } else {
+                ty::mk_evec(tcx, ty::mt {ty: t, mutbl: mutability}, tt)
             }
           }
           _ =>
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 6ca91791ffd..8d65f02119b 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -232,7 +232,7 @@ pub fn Parser(sess: @mut ParseSess,
         token: @mut copy tok0.tok,
         span: @mut copy tok0.sp,
         last_span: @mut copy tok0.sp,
-        buffer: @mut [copy tok0, .. 4],
+        buffer: @mut ([copy tok0, .. 4]),
         buffer_start: @mut 0,
         buffer_end: @mut 0,
         tokens_consumed: @mut 0,
@@ -1653,12 +1653,11 @@ pub impl Parser {
             hi = e.span.hi;
             // HACK: turn @[...] into a @-evec
             ex = match e.node {
-              expr_vec(*) if m == m_mutbl =>
+              expr_vec(*) | expr_repeat(*) if m == m_mutbl =>
                 expr_vstore(e, expr_vstore_mut_box),
-              expr_vec(*) if m == m_imm => expr_vstore(e, expr_vstore_box),
-              expr_lit(@codemap::spanned {
-                  node: lit_str(_), span: _}) if m == m_imm =>
-                expr_vstore(e, expr_vstore_box),
+              expr_vec(*) |
+              expr_lit(@codemap::spanned { node: lit_str(_), span: _}) |
+              expr_repeat(*) if m == m_imm => expr_vstore(e, expr_vstore_box),
               _ => expr_unary(box(m), e)
             };
           }
@@ -1673,8 +1672,9 @@ pub impl Parser {
             hi = e.span.hi;
             // HACK: turn ~[...] into a ~-evec
             ex = match e.node {
-              expr_vec(*) | expr_lit(@codemap::spanned {
-                node: lit_str(_), span: _})
+              expr_vec(*) |
+              expr_lit(@codemap::spanned { node: lit_str(_), span: _}) |
+              expr_repeat(*)
               if m == m_imm => expr_vstore(e, expr_vstore_uniq),
               _ => expr_unary(uniq(m), e)
             };
diff --git a/src/test/run-pass/expr-repeat-vstore.rs b/src/test/run-pass/expr-repeat-vstore.rs
new file mode 100644
index 00000000000..972b2763b1b
--- /dev/null
+++ b/src/test/run-pass/expr-repeat-vstore.rs
@@ -0,0 +1,23 @@
+use core::io::println;
+
+fn main() {
+    let v: ~[int] = ~[ 1, ..5 ];
+    println(v[0].to_str());
+    println(v[1].to_str());
+    println(v[2].to_str());
+    println(v[3].to_str());
+    println(v[4].to_str());
+    let v: @[int] = @[ 2, ..5 ];
+    println(v[0].to_str());
+    println(v[1].to_str());
+    println(v[2].to_str());
+    println(v[3].to_str());
+    println(v[4].to_str());
+    let v: @mut [int] = @mut [ 3, ..5 ];
+    println((copy v[0]).to_str());
+    println((copy v[1]).to_str());
+    println((copy v[2]).to_str());
+    println((copy v[3]).to_str());
+    println((copy v[4]).to_str());
+}
+