diff --git a/src/etc/emacs/rust-mode.el b/src/etc/emacs/rust-mode.el
index a61d916f46f..bad1ea510be 100644
--- a/src/etc/emacs/rust-mode.el
+++ b/src/etc/emacs/rust-mode.el
@@ -127,6 +127,7 @@
(defconst rust-mode-keywords
'("as"
"break"
+ "continue"
"do"
"else" "enum" "extern"
"false" "fn" "for"
diff --git a/src/etc/gedit/share/gtksourceview-3.0/language-specs/rust.lang b/src/etc/gedit/share/gtksourceview-3.0/language-specs/rust.lang
index 1d55d4a02e5..1869024e20b 100644
--- a/src/etc/gedit/share/gtksourceview-3.0/language-specs/rust.lang
+++ b/src/etc/gedit/share/gtksourceview-3.0/language-specs/rust.lang
@@ -39,6 +39,7 @@
assert
break
const
+ continue
do
drop
else
diff --git a/src/etc/kate/rust.xml b/src/etc/kate/rust.xml
index 6a603685537..ba6b9630c3b 100644
--- a/src/etc/kate/rust.xml
+++ b/src/etc/kate/rust.xml
@@ -18,6 +18,7 @@
- as
- break
+ - continue
- do
- drop
- else
diff --git a/src/etc/vim/syntax/rust.vim b/src/etc/vim/syntax/rust.vim
index 689af99b5c4..c465f076c74 100644
--- a/src/etc/vim/syntax/rust.vim
+++ b/src/etc/vim/syntax/rust.vim
@@ -18,7 +18,7 @@ syn keyword rustOperator as
syn match rustAssert "\ EachItemContext<'self> {
}
}
- let mut continue = (self.callback)(*self.path_builder, def_like, vis);
+ let mut continue_ = (self.callback)(*self.path_builder, def_like, vis);
let family = item_family(doc);
if family == ForeignMod {
@@ -572,11 +572,11 @@ impl<'self> EachItemContext<'self> {
self.pop_name(old_len)
}
- if continue {
+ if continue_ {
// Recurse if necessary.
match family {
Mod | ForeignMod | Trait | Impl => {
- continue = self.each_item_of_module(def_id);
+ continue_ = self.each_item_of_module(def_id);
}
ImmStatic | MutStatic | Struct | UnsafeFn | Fn | ForeignFn |
UnsafeStaticMethod | StaticMethod | Type | ForeignType |
@@ -589,7 +589,7 @@ impl<'self> EachItemContext<'self> {
self.pop_name(old_len)
}
- continue
+ continue_
}
fn each_item_of_module(&mut self, def_id: ast::DefId) -> bool {
@@ -612,7 +612,7 @@ impl<'self> EachItemContext<'self> {
}
fn each_child_of_module_or_crate(&mut self, item_doc: ebml::Doc) -> bool {
- let mut continue = true;
+ let mut continue_ = true;
// Iterate over all children.
do reader::tagged_docs(item_doc, tag_mod_child) |child_info_doc| {
@@ -654,16 +654,16 @@ impl<'self> EachItemContext<'self> {
// Process this item.
let vis = item_visibility(child_item_doc);
- continue = self.process_item_and_pop_name(child_item_doc,
+ continue_ = self.process_item_and_pop_name(child_item_doc,
child_def_id,
old_len,
vis);
}
}
- continue
+ continue_
};
- if !continue {
+ if !continue_ {
return false
}
@@ -705,7 +705,7 @@ impl<'self> EachItemContext<'self> {
match maybe_find_item(def_id.node, other_crates_items) {
None => { self.pop_name(old_len); }
Some(reexported_item_doc) => {
- continue = self.process_item_and_pop_name(
+ continue_ = self.process_item_and_pop_name(
reexported_item_doc,
def_id,
old_len,
@@ -713,10 +713,10 @@ impl<'self> EachItemContext<'self> {
}
}
- continue
+ continue_
};
- continue
+ continue_
}
}
diff --git a/src/librustc/metadata/encoder.rs b/src/librustc/metadata/encoder.rs
index de60927f2a2..e3cc155b013 100644
--- a/src/librustc/metadata/encoder.rs
+++ b/src/librustc/metadata/encoder.rs
@@ -521,12 +521,12 @@ fn encode_reexported_static_methods(ecx: &EncodeContext,
/// * For newtype structs, iterates through the node ID of the constructor.
fn each_auxiliary_node_id(item: @item, callback: &fn(NodeId) -> bool)
-> bool {
- let mut continue = true;
+ let mut continue_ = true;
match item.node {
item_enum(ref enum_def, _) => {
for variant in enum_def.variants.iter() {
- continue = callback(variant.node.id);
- if !continue {
+ continue_ = callback(variant.node.id);
+ if !continue_ {
break
}
}
@@ -537,7 +537,7 @@ fn each_auxiliary_node_id(item: @item, callback: &fn(NodeId) -> bool)
Some(ctor_id) if struct_def.fields.len() > 0 &&
struct_def.fields[0].node.kind ==
ast::unnamed_field => {
- continue = callback(ctor_id);
+ continue_ = callback(ctor_id);
}
_ => {}
}
@@ -545,7 +545,7 @@ fn each_auxiliary_node_id(item: @item, callback: &fn(NodeId) -> bool)
_ => {}
}
- continue
+ continue_
}
fn encode_reexports(ecx: &EncodeContext,
diff --git a/src/libsyntax/ext/asm.rs b/src/libsyntax/ext/asm.rs
index b350ef7bb08..d47435dab56 100644
--- a/src/libsyntax/ext/asm.rs
+++ b/src/libsyntax/ext/asm.rs
@@ -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
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 74447b5dae1..d9fb53b4677 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -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");
diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs
index 6cc1058954c..eec4a81b2cf 100644
--- a/src/libsyntax/parse/token.rs
+++ b/src/libsyntax/parse/token.rs
@@ -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,
diff --git a/src/test/run-pass/while-cont.rs b/src/test/run-pass/while-cont.rs
index 836f737b845..f0e6d4b45a5 100644
--- a/src/test/run-pass/while-cont.rs
+++ b/src/test/run-pass/while-cont.rs
@@ -15,6 +15,6 @@ pub fn main() {
assert!((i > 0));
info!(i);
i -= 1;
- loop;
+ continue;
}
}