Skip to content

Commit 810677e

Browse files
committed
Parse ~[...] as [...]/~. Same for @ and &. Closes #2747.
1 parent b6f103e commit 810677e

File tree

3 files changed

+40
-9
lines changed

3 files changed

+40
-9
lines changed

src/libsyntax/parse/parser.rs

+38-7
Original file line numberDiff line numberDiff line change
@@ -373,10 +373,22 @@ class parser {
373373
}
374374
} else if self.token == token::AT {
375375
self.bump();
376-
ty_box(self.parse_mt())
376+
// HACK: turn @[...] into a []/@
377+
alt self.parse_mt() {
378+
{ty: t @ @{node: ty_vec(_), _}, mutbl: m_imm} {
379+
ty_vstore(t, vstore_box)
380+
}
381+
mt { ty_box(mt) }
382+
}
377383
} else if self.token == token::TILDE {
378384
self.bump();
379-
ty_uniq(self.parse_mt())
385+
// HACK: turn ~[...] into a []/~
386+
alt self.parse_mt() {
387+
{ty: t @ @{node: ty_vec(_), _}, mutbl: m_imm} {
388+
ty_vstore(t, vstore_uniq)
389+
}
390+
mt { ty_uniq(mt) }
391+
}
380392
} else if self.token == token::BINOP(token::STAR) {
381393
self.bump();
382394
ty_ptr(self.parse_mt())
@@ -406,8 +418,13 @@ class parser {
406418
} else if self.token == token::BINOP(token::AND) {
407419
self.bump();
408420
let region = self.parse_region_dot();
409-
let mt = self.parse_mt();
410-
ty_rptr(region, mt)
421+
// HACK: turn &a.[...] into a []/&a
422+
alt self.parse_mt() {
423+
{ty: t @ @{node: ty_vec(_), _}, mutbl: m_imm} {
424+
ty_vstore(t, vstore_slice(region))
425+
}
426+
mt { ty_rptr(region, mt) }
427+
}
411428
} else if self.eat_keyword("pure") {
412429
self.parse_ty_fn(ast::pure_fn)
413430
} else if self.eat_keyword("unsafe") {
@@ -1188,7 +1205,13 @@ class parser {
11881205
let m = self.parse_mutability();
11891206
let e = self.to_expr(self.parse_prefix_expr());
11901207
hi = e.span.hi;
1191-
ex = expr_addr_of(m, e);
1208+
// HACK: turn &[...] into [...]/&
1209+
ex = alt e.node {
1210+
expr_vec(*) if m == m_imm {
1211+
expr_vstore(e, vstore_slice(self.region_from_name(none)))
1212+
}
1213+
_ { expr_addr_of(m, e) }
1214+
};
11921215
}
11931216
_ { ret self.parse_dot_or_call_expr(); }
11941217
}
@@ -1198,14 +1221,22 @@ class parser {
11981221
let m = self.parse_mutability();
11991222
let e = self.to_expr(self.parse_prefix_expr());
12001223
hi = e.span.hi;
1201-
ex = expr_unary(box(m), e);
1224+
// HACK: turn @[...] into [...]/@
1225+
ex = alt e.node {
1226+
expr_vec(*) if m == m_imm { expr_vstore(e, vstore_box) }
1227+
_ { expr_unary(box(m), e) }
1228+
};
12021229
}
12031230
token::TILDE {
12041231
self.bump();
12051232
let m = self.parse_mutability();
12061233
let e = self.to_expr(self.parse_prefix_expr());
12071234
hi = e.span.hi;
1208-
ex = expr_unary(uniq(m), e);
1235+
// HACK: turn ~[...] into [...]/~
1236+
ex = alt e.node {
1237+
expr_vec(*) if m == m_imm { expr_vstore(e, vstore_uniq) }
1238+
_ { expr_unary(uniq(m), e) }
1239+
};
12091240
}
12101241
_ { ret self.parse_dot_or_call_expr(); }
12111242
}

src/test/run-pass/move-arg-2-unique.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
fn test(-foo: ~[int]) { assert (foo[0] == 10); }
1+
fn test(-foo: ~[int]/~) { assert (foo[0] == 10); }
22

33
fn main() {
44
let x = ~[10]/~;

src/test/run-pass/move-arg-2.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
fn test(-foo: @[int]) { assert (foo[0] == 10); }
1+
fn test(-foo: @[int]/~) { assert (foo[0] == 10); }
22

33
fn main() {
44
let x = @[10]/~;

0 commit comments

Comments
 (0)