From 5a1b336a01608081b5755909b2f3c97e460362a2 Mon Sep 17 00:00:00 2001 From: P1start Date: Sat, 16 May 2015 11:24:06 +1200 Subject: [PATCH] Fix the spans of `move` closures Closes #24986. --- src/libsyntax/parse/parser.rs | 9 +++++---- src/test/compile-fail/move-closure-span.rs | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 src/test/compile-fail/move-closure-span.rs diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 9bf6fa88ba5..165ce7b122b 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -2026,7 +2026,8 @@ impl<'a> Parser<'a> { 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 @@ impl<'a> Parser<'a> { 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 @@ impl<'a> Parser<'a> { } // `|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> { - 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 index 00000000000..3c590e892cc --- /dev/null +++ b/src/test/compile-fail/move-closure-span.rs @@ -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 or the MIT license +// , 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 + || (); +}