Parse and report obsolete fixed-length vector syntax

This commit is contained in:
Brian Anderson 2012-10-20 16:33:59 -07:00
parent 41c37d9d0f
commit f3df50f67f
3 changed files with 88 additions and 3 deletions

View file

@ -23,7 +23,8 @@ pub enum ObsoleteSyntax {
ObsoleteClassTraits,
ObsoletePrivSection,
ObsoleteModeInFnType,
ObsoleteByMutRefMode
ObsoleteByMutRefMode,
ObsoleteFixedLengthVec,
}
impl ObsoleteSyntax : cmp::Eq {
@ -99,6 +100,11 @@ impl Parser : ObsoleteReporter {
"by-mutable-reference mode",
"Declare an argument of type &mut T instead"
),
ObsoleteFixedLengthVec => (
"fixed-length vector",
"Fixed-length types are now written `[T * N]`, and instances \
are type-inferred"
)
};
self.report(sp, kind, kind_str, desc);
@ -183,5 +189,66 @@ impl Parser : ObsoleteReporter {
false
}
}
fn try_parse_obsolete_fixed_vstore() -> Option<Option<uint>> {
if self.token == token::BINOP(token::SLASH) {
self.bump();
match copy self.token {
token::UNDERSCORE => {
self.obsolete(copy self.last_span,
ObsoleteFixedLengthVec);
self.bump(); Some(None)
}
token::LIT_INT_UNSUFFIXED(i) if i >= 0i64 => {
self.obsolete(copy self.last_span,
ObsoleteFixedLengthVec);
self.bump(); Some(Some(i as uint))
}
_ => None
}
} else {
None
}
}
fn try_convert_ty_to_obsolete_fixed_length_vstore(sp: span, t: ast::ty_)
-> ast::ty_ {
match self.try_parse_obsolete_fixed_vstore() {
// Consider a fixed length vstore suffix (/N or /_)
None => t,
Some(v) => {
ast::ty_fixed_length(
@{id: self.get_id(), node: t, span: sp}, v)
}
}
}
fn try_convert_expr_to_obsolete_fixed_length_vstore(
lo: uint, hi: uint, ex: ast::expr_
) -> (uint, ast::expr_) {
let mut hi = hi;
let mut ex = ex;
// Vstore is legal following expr_lit(lit_str(...)) and expr_vec(...)
// only.
match ex {
ast::expr_lit(@{node: ast::lit_str(_), span: _}) |
ast::expr_vec(_, _) => {
match self.try_parse_obsolete_fixed_vstore() {
None => (),
Some(v) => {
hi = self.span.hi;
ex = ast::expr_vstore(self.mk_expr(lo, hi, ex),
ast::expr_vstore_fixed(v));
}
}
}
_ => ()
}
return (hi, ex);
}
}

View file

@ -553,9 +553,13 @@ impl Parser {
} else { self.fatal(~"expected type"); };
let sp = mk_sp(lo, self.last_span.hi);
return @{id: self.get_id(),
node: t,
return {
let node =
self.try_convert_ty_to_obsolete_fixed_length_vstore(sp, t);
@{id: self.get_id(),
node: node,
span: sp}
};
}
fn parse_arg_mode() -> mode {
@ -1061,6 +1065,9 @@ impl Parser {
ex = expr_lit(@lit);
}
let (hi, ex) =
self.try_convert_expr_to_obsolete_fixed_length_vstore(lo, hi, ex);
return self.mk_pexpr(lo, hi, ex);
}

View file

@ -56,4 +56,15 @@ fn obsolete_with() {
//~^ ERROR obsolete syntax: with
}
fn obsolete_fixed_length_vec() {
let foo: [int]/1;
//~^ ERROR obsolete syntax: fixed-length vector
foo = [1]/_;
//~^ ERROR obsolete syntax: fixed-length vector
let foo: [int]/1;
//~^ ERROR obsolete syntax: fixed-length vector
foo = [1]/1;
//~^ ERROR obsolete syntax: fixed-length vector
}
fn main() { }