Skip to content

Commit 3d2a74a

Browse files
committed
Reserve 'be' as a keyword
1 parent ea01ee2 commit 3d2a74a

File tree

4 files changed

+41
-0
lines changed

4 files changed

+41
-0
lines changed

src/libsyntax/parse/common.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ impl parser: parser_common {
8585

8686
fn parse_ident() -> ast::ident {
8787
self.check_strict_keywords();
88+
self.check_reserved_keywords();
8889
match copy self.token {
8990
token::IDENT(i, _) => { self.bump(); return i; }
9091
token::INTERPOLATED(token::nt_ident(*)) => { self.bug(
@@ -204,6 +205,26 @@ impl parser: parser_common {
204205
}
205206
}
206207

208+
fn is_reserved_keyword(word: ~str) -> bool {
209+
self.reserved_keywords.contains_key_ref(&word)
210+
}
211+
212+
fn check_reserved_keywords() {
213+
match self.token {
214+
token::IDENT(_, false) => {
215+
let w = token_to_str(self.reader, self.token);
216+
self.check_reserved_keywords_(w);
217+
}
218+
_ => ()
219+
}
220+
}
221+
222+
fn check_reserved_keywords_(w: ~str) {
223+
if self.is_reserved_keyword(w) {
224+
self.fatal(~"`" + w + ~"` is a reserved keyword");
225+
}
226+
}
227+
207228
fn expect_gt() {
208229
if self.token == token::GT {
209230
self.bump();

src/libsyntax/parse/parser.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ fn parser(sess: parse_sess, cfg: ast::crate_cfg,
216216
keywords: token::keyword_table(),
217217
restricted_keywords: token::restricted_keyword_table(),
218218
strict_keywords: token::strict_keyword_table(),
219+
reserved_keywords: token::reserved_keyword_table(),
219220
obsolete_set: std::map::HashMap(),
220221
}
221222
}
@@ -237,6 +238,7 @@ struct parser {
237238
keywords: HashMap<~str, ()>,
238239
restricted_keywords: HashMap<~str, ()>,
239240
strict_keywords: HashMap<~str, ()>,
241+
reserved_keywords: HashMap<~str, ()>,
240242
/// The set of seen errors about obsolete syntax. Used to suppress
241243
/// extra detail when the same error is seen twice
242244
obsolete_set: HashMap<ObsoleteSyntax, ()>,

src/libsyntax/parse/token.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,9 @@ fn keyword_table() -> HashMap<~str, ()> {
379379
for strict_keyword_table().each_key |word| {
380380
keywords.insert(word, ());
381381
}
382+
for reserved_keyword_table().each_key |word| {
383+
keywords.insert(word, ());
384+
}
382385
keywords
383386
}
384387

@@ -447,6 +450,17 @@ fn strict_keyword_table() -> HashMap<~str, ()> {
447450
words
448451
}
449452
453+
fn reserved_keyword_table() -> HashMap<~str, ()> {
454+
let words = str_hash();
455+
let keys = ~[
456+
~"be"
457+
];
458+
for keys.each |word| {
459+
words.insert(word, ());
460+
}
461+
words
462+
}
463+
450464
impl binop : cmp::Eq {
451465
pure fn eq(&&other: binop) -> bool {
452466
(self as uint) == (other as uint)

src/test/compile-fail/reserved-be.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
fn main() {
2+
let be = 0;
3+
//~^ ERROR `be` is a reserved keyword
4+
}

0 commit comments

Comments
 (0)