Skip to content

Commit f3df50f

Browse files
committed
Parse and report obsolete fixed-length vector syntax
1 parent 41c37d9 commit f3df50f

File tree

3 files changed

+88
-3
lines changed

3 files changed

+88
-3
lines changed

src/libsyntax/parse/obsolete.rs

+68-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ pub enum ObsoleteSyntax {
2323
ObsoleteClassTraits,
2424
ObsoletePrivSection,
2525
ObsoleteModeInFnType,
26-
ObsoleteByMutRefMode
26+
ObsoleteByMutRefMode,
27+
ObsoleteFixedLengthVec,
2728
}
2829

2930
impl ObsoleteSyntax : cmp::Eq {
@@ -99,6 +100,11 @@ impl Parser : ObsoleteReporter {
99100
"by-mutable-reference mode",
100101
"Declare an argument of type &mut T instead"
101102
),
103+
ObsoleteFixedLengthVec => (
104+
"fixed-length vector",
105+
"Fixed-length types are now written `[T * N]`, and instances \
106+
are type-inferred"
107+
)
102108
};
103109

104110
self.report(sp, kind, kind_str, desc);
@@ -183,5 +189,66 @@ impl Parser : ObsoleteReporter {
183189
false
184190
}
185191
}
192+
193+
fn try_parse_obsolete_fixed_vstore() -> Option<Option<uint>> {
194+
if self.token == token::BINOP(token::SLASH) {
195+
self.bump();
196+
match copy self.token {
197+
token::UNDERSCORE => {
198+
self.obsolete(copy self.last_span,
199+
ObsoleteFixedLengthVec);
200+
self.bump(); Some(None)
201+
}
202+
token::LIT_INT_UNSUFFIXED(i) if i >= 0i64 => {
203+
self.obsolete(copy self.last_span,
204+
ObsoleteFixedLengthVec);
205+
self.bump(); Some(Some(i as uint))
206+
}
207+
_ => None
208+
}
209+
} else {
210+
None
211+
}
212+
}
213+
214+
fn try_convert_ty_to_obsolete_fixed_length_vstore(sp: span, t: ast::ty_)
215+
-> ast::ty_ {
216+
match self.try_parse_obsolete_fixed_vstore() {
217+
// Consider a fixed length vstore suffix (/N or /_)
218+
None => t,
219+
Some(v) => {
220+
ast::ty_fixed_length(
221+
@{id: self.get_id(), node: t, span: sp}, v)
222+
}
223+
}
224+
}
225+
226+
fn try_convert_expr_to_obsolete_fixed_length_vstore(
227+
lo: uint, hi: uint, ex: ast::expr_
228+
) -> (uint, ast::expr_) {
229+
230+
let mut hi = hi;
231+
let mut ex = ex;
232+
233+
// Vstore is legal following expr_lit(lit_str(...)) and expr_vec(...)
234+
// only.
235+
match ex {
236+
ast::expr_lit(@{node: ast::lit_str(_), span: _}) |
237+
ast::expr_vec(_, _) => {
238+
match self.try_parse_obsolete_fixed_vstore() {
239+
None => (),
240+
Some(v) => {
241+
hi = self.span.hi;
242+
ex = ast::expr_vstore(self.mk_expr(lo, hi, ex),
243+
ast::expr_vstore_fixed(v));
244+
}
245+
}
246+
}
247+
_ => ()
248+
}
249+
250+
return (hi, ex);
251+
}
252+
186253
}
187254

src/libsyntax/parse/parser.rs

+9-2
Original file line numberDiff line numberDiff line change
@@ -553,9 +553,13 @@ impl Parser {
553553
} else { self.fatal(~"expected type"); };
554554

555555
let sp = mk_sp(lo, self.last_span.hi);
556-
return @{id: self.get_id(),
557-
node: t,
556+
return {
557+
let node =
558+
self.try_convert_ty_to_obsolete_fixed_length_vstore(sp, t);
559+
@{id: self.get_id(),
560+
node: node,
558561
span: sp}
562+
};
559563
}
560564

561565
fn parse_arg_mode() -> mode {
@@ -1061,6 +1065,9 @@ impl Parser {
10611065
ex = expr_lit(@lit);
10621066
}
10631067

1068+
let (hi, ex) =
1069+
self.try_convert_expr_to_obsolete_fixed_length_vstore(lo, hi, ex);
1070+
10641071
return self.mk_pexpr(lo, hi, ex);
10651072
}
10661073

src/test/compile-fail/obsolete-syntax.rs

+11
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,15 @@ fn obsolete_with() {
5656
//~^ ERROR obsolete syntax: with
5757
}
5858

59+
fn obsolete_fixed_length_vec() {
60+
let foo: [int]/1;
61+
//~^ ERROR obsolete syntax: fixed-length vector
62+
foo = [1]/_;
63+
//~^ ERROR obsolete syntax: fixed-length vector
64+
let foo: [int]/1;
65+
//~^ ERROR obsolete syntax: fixed-length vector
66+
foo = [1]/1;
67+
//~^ ERROR obsolete syntax: fixed-length vector
68+
}
69+
5970
fn main() { }

0 commit comments

Comments
 (0)