Parse ~[...] as [...]/~. Same for @ and &. Closes #2747.
This commit is contained in:
parent
b6f103e7f9
commit
810677efb5
3 changed files with 40 additions and 9 deletions
|
@ -373,10 +373,22 @@ class parser {
|
||||||
}
|
}
|
||||||
} else if self.token == token::AT {
|
} else if self.token == token::AT {
|
||||||
self.bump();
|
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 {
|
} else if self.token == token::TILDE {
|
||||||
self.bump();
|
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) {
|
} else if self.token == token::BINOP(token::STAR) {
|
||||||
self.bump();
|
self.bump();
|
||||||
ty_ptr(self.parse_mt())
|
ty_ptr(self.parse_mt())
|
||||||
|
@ -406,8 +418,13 @@ class parser {
|
||||||
} else if self.token == token::BINOP(token::AND) {
|
} else if self.token == token::BINOP(token::AND) {
|
||||||
self.bump();
|
self.bump();
|
||||||
let region = self.parse_region_dot();
|
let region = self.parse_region_dot();
|
||||||
let mt = self.parse_mt();
|
// HACK: turn &a.[...] into a []/&a
|
||||||
ty_rptr(region, mt)
|
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") {
|
} else if self.eat_keyword("pure") {
|
||||||
self.parse_ty_fn(ast::pure_fn)
|
self.parse_ty_fn(ast::pure_fn)
|
||||||
} else if self.eat_keyword("unsafe") {
|
} else if self.eat_keyword("unsafe") {
|
||||||
|
@ -1188,7 +1205,13 @@ class parser {
|
||||||
let m = self.parse_mutability();
|
let m = self.parse_mutability();
|
||||||
let e = self.to_expr(self.parse_prefix_expr());
|
let e = self.to_expr(self.parse_prefix_expr());
|
||||||
hi = e.span.hi;
|
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(); }
|
_ { ret self.parse_dot_or_call_expr(); }
|
||||||
}
|
}
|
||||||
|
@ -1198,14 +1221,22 @@ class parser {
|
||||||
let m = self.parse_mutability();
|
let m = self.parse_mutability();
|
||||||
let e = self.to_expr(self.parse_prefix_expr());
|
let e = self.to_expr(self.parse_prefix_expr());
|
||||||
hi = e.span.hi;
|
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 {
|
token::TILDE {
|
||||||
self.bump();
|
self.bump();
|
||||||
let m = self.parse_mutability();
|
let m = self.parse_mutability();
|
||||||
let e = self.to_expr(self.parse_prefix_expr());
|
let e = self.to_expr(self.parse_prefix_expr());
|
||||||
hi = e.span.hi;
|
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(); }
|
_ { ret self.parse_dot_or_call_expr(); }
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
fn test(-foo: ~[int]) { assert (foo[0] == 10); }
|
fn test(-foo: ~[int]/~) { assert (foo[0] == 10); }
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let x = ~[10]/~;
|
let x = ~[10]/~;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
fn test(-foo: @[int]) { assert (foo[0] == 10); }
|
fn test(-foo: @[int]/~) { assert (foo[0] == 10); }
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let x = @[10]/~;
|
let x = @[10]/~;
|
||||||
|
|
Loading…
Reference in a new issue