Skip to content

Commit e5dda81

Browse files
committed
librustc: Allow expr_repeat to be used with any vstore
1 parent b93393e commit e5dda81

File tree

4 files changed

+41
-14
lines changed

4 files changed

+41
-14
lines changed

src/libcore/rt/context.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ fn initialize_call_frame(regs: &mut Registers, fptr: *c_void, arg: *c_void, sp:
126126
type Registers = [uint, ..22];
127127

128128
#[cfg(target_arch = "x86_64")]
129-
fn new_regs() -> ~Registers { ~[0, .. 22] }
129+
fn new_regs() -> ~Registers { ~([0, .. 22]) }
130130

131131
#[cfg(target_arch = "x86_64")]
132132
fn initialize_call_frame(regs: &mut Registers, fptr: *c_void, arg: *c_void, sp: *mut uint) {

src/librustc/middle/typeck/check/mod.rs

+9-5
Original file line numberDiff line numberDiff line change
@@ -2186,17 +2186,21 @@ pub fn check_expr_with_unifier(fcx: @mut FnCtxt,
21862186
let count = ty::eval_repeat_count(tcx, count_expr);
21872187
check_expr_with_hint(fcx, count_expr, ty::mk_uint(tcx));
21882188
let tt = ast_expr_vstore_to_vstore(fcx, ev, count, vst);
2189+
let mutability = match vst {
2190+
ast::expr_vstore_mut_box | ast::expr_vstore_mut_slice => {
2191+
ast::m_mutbl
2192+
}
2193+
_ => mutbl
2194+
};
21892195
let t: ty::t = fcx.infcx().next_ty_var();
21902196
check_expr_has_type(fcx, element, t);
21912197
let arg_t = fcx.expr_ty(element);
21922198
if ty::type_is_error(arg_t) {
21932199
ty::mk_err(tcx)
2194-
}
2195-
else if ty::type_is_bot(arg_t) {
2200+
} else if ty::type_is_bot(arg_t) {
21962201
ty::mk_bot(tcx)
2197-
}
2198-
else {
2199-
ty::mk_evec(tcx, ty::mt {ty: t, mutbl: mutbl}, tt)
2202+
} else {
2203+
ty::mk_evec(tcx, ty::mt {ty: t, mutbl: mutability}, tt)
22002204
}
22012205
}
22022206
_ =>

src/libsyntax/parse/parser.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ pub fn Parser(sess: @mut ParseSess,
232232
token: @mut copy tok0.tok,
233233
span: @mut copy tok0.sp,
234234
last_span: @mut copy tok0.sp,
235-
buffer: @mut [copy tok0, .. 4],
235+
buffer: @mut ([copy tok0, .. 4]),
236236
buffer_start: @mut 0,
237237
buffer_end: @mut 0,
238238
tokens_consumed: @mut 0,
@@ -1660,12 +1660,11 @@ pub impl Parser {
16601660
hi = e.span.hi;
16611661
// HACK: turn @[...] into a @-evec
16621662
ex = match e.node {
1663-
expr_vec(*) if m == m_mutbl =>
1663+
expr_vec(*) | expr_repeat(*) if m == m_mutbl =>
16641664
expr_vstore(e, expr_vstore_mut_box),
1665-
expr_vec(*) if m == m_imm => expr_vstore(e, expr_vstore_box),
1666-
expr_lit(@codemap::spanned {
1667-
node: lit_str(_), span: _}) if m == m_imm =>
1668-
expr_vstore(e, expr_vstore_box),
1665+
expr_vec(*) |
1666+
expr_lit(@codemap::spanned { node: lit_str(_), span: _}) |
1667+
expr_repeat(*) if m == m_imm => expr_vstore(e, expr_vstore_box),
16691668
_ => expr_unary(box(m), e)
16701669
};
16711670
}
@@ -1680,8 +1679,9 @@ pub impl Parser {
16801679
hi = e.span.hi;
16811680
// HACK: turn ~[...] into a ~-evec
16821681
ex = match e.node {
1683-
expr_vec(*) | expr_lit(@codemap::spanned {
1684-
node: lit_str(_), span: _})
1682+
expr_vec(*) |
1683+
expr_lit(@codemap::spanned { node: lit_str(_), span: _}) |
1684+
expr_repeat(*)
16851685
if m == m_imm => expr_vstore(e, expr_vstore_uniq),
16861686
_ => expr_unary(uniq(m), e)
16871687
};
+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
use core::io::println;
2+
3+
fn main() {
4+
let v: ~[int] = ~[ 1, ..5 ];
5+
println(v[0].to_str());
6+
println(v[1].to_str());
7+
println(v[2].to_str());
8+
println(v[3].to_str());
9+
println(v[4].to_str());
10+
let v: @[int] = @[ 2, ..5 ];
11+
println(v[0].to_str());
12+
println(v[1].to_str());
13+
println(v[2].to_str());
14+
println(v[3].to_str());
15+
println(v[4].to_str());
16+
let v: @mut [int] = @mut [ 3, ..5 ];
17+
println((copy v[0]).to_str());
18+
println((copy v[1]).to_str());
19+
println((copy v[2]).to_str());
20+
println((copy v[3]).to_str());
21+
println((copy v[4]).to_str());
22+
}
23+

0 commit comments

Comments
 (0)