diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 15f05df58b50..93902d06e52d 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -2130,7 +2130,7 @@ impl<'a> Parser<'a> { return self.parse_lambda_expr(lo, CaptureBy::Value, attrs); } if self.eat_keyword(keywords::If) { - return self.parse_if_expr(attrs); + return self.parse_if_expr(attrs, false); } if self.eat_keyword(keywords::For) { let lo = self.prev_span; @@ -2962,13 +2962,25 @@ impl<'a> Parser<'a> { } /// Parse an 'if' or 'if let' expression ('if' token already eaten) - pub fn parse_if_expr(&mut self, attrs: ThinVec) -> PResult<'a, P> { + pub fn parse_if_expr(&mut self, attrs: ThinVec, + in_else: bool) -> PResult<'a, P> { if self.check_keyword(keywords::Let) { return self.parse_if_let_expr(attrs); } let lo = self.prev_span; let cond = self.parse_expr_res(RESTRICTION_NO_STRUCT_LITERAL, None)?; - let thn = self.parse_block()?; + let thn = self.parse_block().map_err(|mut err| { + if in_else { + err.cancel(); + let sp = lo.next_point(); + let mut err = self.diagnostic() + .struct_span_err(sp, "missing condition for `if` statemement"); + err.span_label(sp, "expected if condition here"); + err + } else { + err + } + })?; let mut els: Option> = None; let mut hi = thn.span; if self.eat_keyword(keywords::Else) { @@ -3025,7 +3037,7 @@ impl<'a> Parser<'a> { // `else` token already eaten pub fn parse_else_expr(&mut self) -> PResult<'a, P> { if self.eat_keyword(keywords::If) { - return self.parse_if_expr(ThinVec::new()); + return self.parse_if_expr(ThinVec::new(), true); } else { let blk = self.parse_block()?; return Ok(self.mk_expr(blk.span, ExprKind::Block(blk), ThinVec::new())); diff --git a/src/test/ui/issue-13483.rs b/src/test/ui/issue-13483.rs new file mode 100644 index 000000000000..31beab55699a --- /dev/null +++ b/src/test/ui/issue-13483.rs @@ -0,0 +1,22 @@ +// Copyright 2017 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. + +fn main() { + if true { + } else if { //ERROR: MISSING CONDITIONAL + } else { + }; +} + +fn foo() { + if true { + } else if { //ERROR: MISSING CONDITIONAL + }; +} diff --git a/src/test/ui/issue-13483.stderr b/src/test/ui/issue-13483.stderr new file mode 100644 index 000000000000..be0b53d3d983 --- /dev/null +++ b/src/test/ui/issue-13483.stderr @@ -0,0 +1,14 @@ +error: missing condition for `if` statemement + --> $DIR/issue-13483.rs:13:14 + | +13 | } else if { //ERROR: MISSING CONDITIONAL + | ^ expected if condition here + +error: missing conditional + --> $DIR/issue-13483.rs:20:14 + | +20 | } else if { //ERROR: MISSING CONDITIONAL + | ^ expected if condition here + +error: aborting due to 2 previous errors +