about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorSimonas Kazlauskas <git@kazlauskas.me>2015-09-02 22:29:41 +0300
committerSimonas Kazlauskas <git@kazlauskas.me>2015-09-03 03:50:43 +0300
commitd8074e65b02812e96cd5ed987795f5e8cfcef78d (patch)
treefc579b6df045fd1d3888120eda4c9cddc53a57b6 /src/libsyntax
parentcd138dc4475fa90b007969d0a4e00f230be777cf (diff)
downloadrust-d8074e65b02812e96cd5ed987795f5e8cfcef78d.tar.gz
rust-d8074e65b02812e96cd5ed987795f5e8cfcef78d.zip
Use proper span for break and continue labels
Fixes #28109
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/ast.rs4
-rw-r--r--src/libsyntax/fold.rs10
-rw-r--r--src/libsyntax/parse/parser.rs15
-rw-r--r--src/libsyntax/print/pprust.rs4
4 files changed, 21 insertions, 12 deletions
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs
index 25a3540c743..049d45b6e9e 100644
--- a/src/libsyntax/ast.rs
+++ b/src/libsyntax/ast.rs
@@ -891,9 +891,9 @@ pub enum Expr_ {
     /// A referencing operation (`&a` or `&mut a`)
     ExprAddrOf(Mutability, P<Expr>),
     /// A `break`, with an optional label to break
-    ExprBreak(Option<Ident>),
+    ExprBreak(Option<SpannedIdent>),
     /// A `continue`, with an optional label
-    ExprAgain(Option<Ident>),
+    ExprAgain(Option<SpannedIdent>),
     /// A `return`, with an optional value to be returned
     ExprRet(Option<P<Expr>>),
 
diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs
index a547e537c9d..0cfddc9857c 100644
--- a/src/libsyntax/fold.rs
+++ b/src/libsyntax/fold.rs
@@ -1299,8 +1299,14 @@ pub fn noop_fold_expr<T: Folder>(Expr {id, node, span}: Expr, folder: &mut T) ->
                 });
                 ExprPath(qself, folder.fold_path(path))
             }
-            ExprBreak(opt_ident) => ExprBreak(opt_ident.map(|x| folder.fold_ident(x))),
-            ExprAgain(opt_ident) => ExprAgain(opt_ident.map(|x| folder.fold_ident(x))),
+            ExprBreak(opt_ident) => ExprBreak(opt_ident.map(|label|
+                respan(folder.new_span(label.span),
+                       folder.fold_ident(label.node)))
+            ),
+            ExprAgain(opt_ident) => ExprAgain(opt_ident.map(|label|
+                respan(folder.new_span(label.span),
+                       folder.fold_ident(label.node)))
+            ),
             ExprRet(e) => ExprRet(e.map(|x| folder.fold_expr(x))),
             ExprInlineAsm(InlineAsm {
                 inputs,
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 0772d124db8..33f784b72bb 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -2143,9 +2143,12 @@ impl<'a> Parser<'a> {
                 }
                 if try!(self.eat_keyword(keywords::Continue) ){
                     let ex = if self.token.is_lifetime() {
-                        let lifetime = self.get_lifetime();
+                        let ex = ExprAgain(Some(Spanned{
+                            node: self.get_lifetime(),
+                            span: self.span
+                        }));
                         try!(self.bump());
-                        ExprAgain(Some(lifetime))
+                        ex
                     } else {
                         ExprAgain(None)
                     };
@@ -2161,7 +2164,6 @@ impl<'a> Parser<'a> {
                         UnsafeBlock(ast::UserProvided));
                 }
                 if try!(self.eat_keyword(keywords::Return) ){
-                    // RETURN expression
                     if self.token.can_begin_expr() {
                         let e = try!(self.parse_expr_nopanic());
                         hi = e.span.hi;
@@ -2170,11 +2172,12 @@ impl<'a> Parser<'a> {
                         ex = ExprRet(None);
                     }
                 } else if try!(self.eat_keyword(keywords::Break) ){
-                    // BREAK expression
                     if self.token.is_lifetime() {
-                        let lifetime = self.get_lifetime();
+                        ex = ExprBreak(Some(Spanned {
+                            node: self.get_lifetime(),
+                            span: self.span
+                        }));
                         try!(self.bump());
-                        ex = ExprBreak(Some(lifetime));
                     } else {
                         ex = ExprBreak(None);
                     }
diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs
index b93a244df13..1dd43bb19cc 100644
--- a/src/libsyntax/print/pprust.rs
+++ b/src/libsyntax/print/pprust.rs
@@ -1911,7 +1911,7 @@ impl<'a> State<'a> {
                 try!(word(&mut self.s, "break"));
                 try!(space(&mut self.s));
                 if let Some(ident) = opt_ident {
-                    try!(self.print_ident(ident));
+                    try!(self.print_ident(ident.node));
                     try!(space(&mut self.s));
                 }
             }
@@ -1919,7 +1919,7 @@ impl<'a> State<'a> {
                 try!(word(&mut self.s, "continue"));
                 try!(space(&mut self.s));
                 if let Some(ident) = opt_ident {
-                    try!(self.print_ident(ident));
+                    try!(self.print_ident(ident.node));
                     try!(space(&mut self.s))
                 }
             }