From 810677efb5e5669aa57d5475ac84db6bdc63d7d6 Mon Sep 17 00:00:00 2001 From: Michael Sullivan Date: Mon, 25 Jun 2012 22:38:29 -0700 Subject: [PATCH] Parse ~[...] as [...]/~. Same for @ and &. Closes #2747. --- src/libsyntax/parse/parser.rs | 45 ++++++++++++++++++++++---- src/test/run-pass/move-arg-2-unique.rs | 2 +- src/test/run-pass/move-arg-2.rs | 2 +- 3 files changed, 40 insertions(+), 9 deletions(-) diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index f8d1f0386657..1543e1a1ba18 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -373,10 +373,22 @@ class parser { } } else if self.token == token::AT { self.bump(); - ty_box(self.parse_mt()) + // HACK: turn @[...] into a []/@ + alt self.parse_mt() { + {ty: t @ @{node: ty_vec(_), _}, mutbl: m_imm} { + ty_vstore(t, vstore_box) + } + mt { ty_box(mt) } + } } else if self.token == token::TILDE { self.bump(); - ty_uniq(self.parse_mt()) + // HACK: turn ~[...] into a []/~ + alt self.parse_mt() { + {ty: t @ @{node: ty_vec(_), _}, mutbl: m_imm} { + ty_vstore(t, vstore_uniq) + } + mt { ty_uniq(mt) } + } } else if self.token == token::BINOP(token::STAR) { self.bump(); ty_ptr(self.parse_mt()) @@ -406,8 +418,13 @@ class parser { } else if self.token == token::BINOP(token::AND) { self.bump(); let region = self.parse_region_dot(); - let mt = self.parse_mt(); - ty_rptr(region, mt) + // HACK: turn &a.[...] into a []/&a + alt self.parse_mt() { + {ty: t @ @{node: ty_vec(_), _}, mutbl: m_imm} { + ty_vstore(t, vstore_slice(region)) + } + mt { ty_rptr(region, mt) } + } } else if self.eat_keyword("pure") { self.parse_ty_fn(ast::pure_fn) } else if self.eat_keyword("unsafe") { @@ -1188,7 +1205,13 @@ class parser { let m = self.parse_mutability(); let e = self.to_expr(self.parse_prefix_expr()); hi = e.span.hi; - ex = expr_addr_of(m, e); + // HACK: turn &[...] into [...]/& + ex = alt e.node { + expr_vec(*) if m == m_imm { + expr_vstore(e, vstore_slice(self.region_from_name(none))) + } + _ { expr_addr_of(m, e) } + }; } _ { ret self.parse_dot_or_call_expr(); } } @@ -1198,14 +1221,22 @@ class parser { let m = self.parse_mutability(); let e = self.to_expr(self.parse_prefix_expr()); hi = e.span.hi; - ex = expr_unary(box(m), e); + // HACK: turn @[...] into [...]/@ + ex = alt e.node { + expr_vec(*) if m == m_imm { expr_vstore(e, vstore_box) } + _ { expr_unary(box(m), e) } + }; } token::TILDE { self.bump(); let m = self.parse_mutability(); let e = self.to_expr(self.parse_prefix_expr()); hi = e.span.hi; - ex = expr_unary(uniq(m), e); + // HACK: turn ~[...] into [...]/~ + ex = alt e.node { + expr_vec(*) if m == m_imm { expr_vstore(e, vstore_uniq) } + _ { expr_unary(uniq(m), e) } + }; } _ { ret self.parse_dot_or_call_expr(); } } diff --git a/src/test/run-pass/move-arg-2-unique.rs b/src/test/run-pass/move-arg-2-unique.rs index 39a0ac1fe4ae..10dc7937be9c 100644 --- a/src/test/run-pass/move-arg-2-unique.rs +++ b/src/test/run-pass/move-arg-2-unique.rs @@ -1,4 +1,4 @@ -fn test(-foo: ~[int]) { assert (foo[0] == 10); } +fn test(-foo: ~[int]/~) { assert (foo[0] == 10); } fn main() { let x = ~[10]/~; diff --git a/src/test/run-pass/move-arg-2.rs b/src/test/run-pass/move-arg-2.rs index d70ccc36dbed..c70f3733ab7e 100644 --- a/src/test/run-pass/move-arg-2.rs +++ b/src/test/run-pass/move-arg-2.rs @@ -1,4 +1,4 @@ -fn test(-foo: @[int]) { assert (foo[0] == 10); } +fn test(-foo: @[int]/~) { assert (foo[0] == 10); } fn main() { let x = @[10]/~;