about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-09-26 18:46:10 -0700
committerbors <bors@rust-lang.org>2013-09-26 18:46:10 -0700
commita94158ce64524b7e21e6c8ec23a6b762d45926fb (patch)
tree910767022dcecd289d5725833b1150054be5ef68
parent1434b4bfcafe90cffa6627e3be18a9e5b6501ad1 (diff)
parentc1d64297f071ea166ffbe5aea4fa5f94da3b3622 (diff)
auto merge of #9504 : brson/rust/continue, r=alexcrichton
-rw-r--r--src/etc/emacs/rust-mode.el1
-rw-r--r--src/etc/gedit/share/gtksourceview-3.0/language-specs/rust.lang1
-rw-r--r--src/etc/kate/rust.xml1
-rw-r--r--src/etc/vim/syntax/rust.vim2
-rw-r--r--src/librustc/metadata/decoder.rs22
-rw-r--r--src/librustc/metadata/encoder.rs10
-rw-r--r--src/libsyntax/ext/asm.rs12
-rw-r--r--src/libsyntax/parse/parser.rs12
-rw-r--r--src/libsyntax/parse/token.rs39
-rw-r--r--src/test/run-pass/while-cont.rs2
10 files changed, 60 insertions, 42 deletions
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 @@
 		<keyword>assert</keyword>
 		<keyword>break</keyword>
 		<keyword>const</keyword>
+		<keyword>continue</keyword>
 		<keyword>do</keyword>
 		<keyword>drop</keyword>
 		<keyword>else</keyword>
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 @@
 	<list name="keywords">
 		<item> as </item>
 		<item> break </item>
+		<item> continue </item>
 		<item> do </item>
 		<item> drop </item>
 		<item> else </item>
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      "\<assert\(\w\)*!" contained
 syn match     rustFail        "\<fail\(\w\)*!" contained
-syn keyword   rustKeyword     break do extern
+syn keyword   rustKeyword     break continue do extern
 syn keyword   rustKeyword     in if impl let log
 syn keyword   rustKeyword     for impl let log
 syn keyword   rustKeyword     loop mod once priv pub
diff --git a/src/librustc/metadata/decoder.rs b/src/librustc/metadata/decoder.rs
index fe7309d4467..69b3c79d1a9 100644
--- a/src/librustc/metadata/decoder.rs
+++ b/src/librustc/metadata/decoder.rs
@@ -564,7 +564,7 @@ impl<'self> 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
-
-        "be",                 // 64
-        "pure",               // 65
-        "yield",              // 66
-        "typeof",             // 67
-        "alignof",            // 68
-        "offsetof",           // 69
-        "sizeof",             // 70
+        "continue",           // 64
+
+        "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 },
-
-                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 },
+                Continue => Ident { name: 64, 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;
     }
 }