auto merge of #9504 : brson/rust/continue, r=alexcrichton

This commit is contained in:
bors 2013-09-26 18:46:10 -07:00
commit a94158ce64
10 changed files with 58 additions and 40 deletions

View file

@ -54,8 +54,8 @@ pub fn expand_asm(cx: @ExtCtxt, sp: Span, tts: &[ast::token_tree])
let mut state = Asm;
// Not using labeled break to get us through one round of bootstrapping.
let mut continue = true;
while continue {
let mut continue_ = true;
while continue_ {
match state {
Asm => {
asm = expr_to_str(cx, p.parse_expr(),
@ -142,7 +142,7 @@ pub fn expand_asm(cx: @ExtCtxt, sp: Span, tts: &[ast::token_tree])
match next_state(state) {
Some(x) => x,
None => {
continue = false;
continue_ = false;
break
}
}
@ -151,19 +151,19 @@ pub fn expand_asm(cx: @ExtCtxt, sp: Span, tts: &[ast::token_tree])
let s = match next_state(state) {
Some(x) => x,
None => {
continue = false;
continue_ = false;
break
}
};
match next_state(s) {
Some(x) => x,
None => {
continue = false;
continue_ = false;
break
}
}
} else if *p.token == token::EOF {
continue = false;
continue_ = false;
break;
} else {
state

View file

@ -1786,6 +1786,17 @@ impl Parser {
}
} else if self.eat_keyword(keywords::Loop) {
return self.parse_loop_expr(None);
} else if self.eat_keyword(keywords::Continue) {
let lo = self.span.lo;
let ex = if self.token_is_lifetime(&*self.token) {
let lifetime = self.get_lifetime(&*self.token);
self.bump();
ExprAgain(Some(lifetime.name))
} else {
ExprAgain(None)
};
let hi = self.span.hi;
return self.mk_expr(lo, hi, ex);
} else if self.eat_keyword(keywords::Match) {
return self.parse_match_expr();
} else if self.eat_keyword(keywords::Unsafe) {
@ -2578,6 +2589,7 @@ impl Parser {
return self.mk_expr(lo, hi, ExprLoop(body, opt_ident));
} else {
// This is a 'continue' expression
// FIXME #9467 rm support for 'loop' here after snapshot
if opt_ident.is_some() {
self.span_err(*self.last_span,
"a label may not be used with a `loop` expression");

View file

@ -477,14 +477,15 @@ fn mk_fresh_ident_interner() -> @ident_interner {
"use", // 61
"while", // 62
"in", // 63
"continue", // 64
"be", // 64
"pure", // 65
"yield", // 66
"typeof", // 67
"alignof", // 68
"offsetof", // 69
"sizeof", // 70
"be", // 65
"pure", // 66
"yield", // 67
"typeof", // 68
"alignof", // 69
"offsetof", // 70
"sizeof", // 71
];
@interner::StrInterner::prefill(init_vec)
@ -628,6 +629,7 @@ pub mod keywords {
Unsafe,
Use,
While,
Continue,
// Reserved keywords
Alignof,
@ -676,14 +678,15 @@ pub mod keywords {
Unsafe => Ident { name: 60, ctxt: 0 },
Use => Ident { name: 61, ctxt: 0 },
While => Ident { name: 62, ctxt: 0 },
Continue => Ident { name: 64, ctxt: 0 },
Alignof => Ident { name: 68, ctxt: 0 },
Be => Ident { name: 64, ctxt: 0 },
Offsetof => Ident { name: 69, ctxt: 0 },
Pure => Ident { name: 65, ctxt: 0 },
Sizeof => Ident { name: 70, ctxt: 0 },
Typeof => Ident { name: 67, ctxt: 0 },
Yield => Ident { name: 66, ctxt: 0 },
Alignof => Ident { name: 69, ctxt: 0 },
Be => Ident { name: 65, ctxt: 0 },
Offsetof => Ident { name: 70, ctxt: 0 },
Pure => Ident { name: 66, ctxt: 0 },
Sizeof => Ident { name: 71, ctxt: 0 },
Typeof => Ident { name: 68, ctxt: 0 },
Yield => Ident { name: 67, ctxt: 0 },
}
}
}
@ -709,7 +712,7 @@ pub fn is_any_keyword(tok: &Token) -> bool {
pub fn is_strict_keyword(tok: &Token) -> bool {
match *tok {
token::IDENT(sid, false) => match sid.name {
8 | 27 | 32 .. 63 => true,
8 | 27 | 32 .. 64 => true,
_ => false,
},
_ => false,
@ -719,7 +722,7 @@ pub fn is_strict_keyword(tok: &Token) -> bool {
pub fn is_reserved_keyword(tok: &Token) -> bool {
match *tok {
token::IDENT(sid, false) => match sid.name {
64 .. 70 => true,
65 .. 71 => true,
_ => false,
},
_ => false,