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; } }