]> git.lizzy.rs Git - rust.git/commitdiff
Fix the spans of `move` closures
authorP1start <rewi-github@whanau.org>
Fri, 15 May 2015 23:24:06 +0000 (11:24 +1200)
committerP1start <rewi-github@whanau.org>
Fri, 15 May 2015 23:24:06 +0000 (11:24 +1200)
Closes #24986.

src/libsyntax/parse/parser.rs
src/test/compile-fail/move-closure-span.rs [new file with mode: 0644]

index 9bf6fa88ba5531d48e61fce29a2fb34548a9f8c9..165ce7b122b47d9dcb1908edb5ad94a5ea96cf70 100644 (file)
@@ -2026,7 +2026,8 @@ pub fn parse_bottom_expr(&mut self) -> PResult<P<Expr>> {
                 return self.parse_block_expr(lo, DefaultBlock);
             },
             token::BinOp(token::Or) |  token::OrOr => {
-                return self.parse_lambda_expr(CaptureByRef);
+                let lo = self.span.lo;
+                return self.parse_lambda_expr(lo, CaptureByRef);
             },
             token::Ident(id @ ast::Ident {
                             name: token::SELF_KEYWORD_NAME,
@@ -2081,7 +2082,8 @@ pub fn parse_bottom_expr(&mut self) -> PResult<P<Expr>> {
                     return Ok(self.mk_expr(lo, hi, ExprPath(Some(qself), path)));
                 }
                 if try!(self.eat_keyword(keywords::Move) ){
-                    return self.parse_lambda_expr(CaptureByValue);
+                    let lo = self.last_span.lo;
+                    return self.parse_lambda_expr(lo, CaptureByValue);
                 }
                 if try!(self.eat_keyword(keywords::If)) {
                     return self.parse_if_expr();
@@ -2840,10 +2842,9 @@ pub fn parse_if_let_expr(&mut self) -> PResult<P<Expr>> {
     }
 
     // `|args| expr`
-    pub fn parse_lambda_expr(&mut self, capture_clause: CaptureClause)
+    pub fn parse_lambda_expr(&mut self, lo: BytePos, capture_clause: CaptureClause)
                              -> PResult<P<Expr>>
     {
-        let lo = self.span.lo;
         let decl = try!(self.parse_fn_block_decl());
         let body = match decl.output {
             DefaultReturn(_) => {
diff --git a/src/test/compile-fail/move-closure-span.rs b/src/test/compile-fail/move-closure-span.rs
new file mode 100644 (file)
index 0000000..3c590e8
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// Make sure that the span of a closure marked `move` begins at the `move` keyword.
+
+fn main() {
+    let x: () =
+    move //~ ERROR mismatched types
+    || ();
+}