From 20a2716206ca879ad9848cbb4ac9fcc739dd3f77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Thu, 17 Aug 2017 12:14:35 -0700 Subject: [PATCH] Check for `else` keyword on missing `if` condition --- src/libsyntax/parse/parser.rs | 27 +++++++++++---------------- src/test/ui/issue-13483.rs | 6 ------ src/test/ui/issue-13483.stderr | 8 +------- 3 files changed, 12 insertions(+), 29 deletions(-) diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 93902d06e52d8..22999afb48ea2 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, false); + return self.parse_if_expr(attrs); } if self.eat_keyword(keywords::For) { let lo = self.prev_span; @@ -2962,25 +2962,20 @@ impl<'a> Parser<'a> { } /// Parse an 'if' or 'if let' expression ('if' token already eaten) - pub fn parse_if_expr(&mut self, attrs: ThinVec, - in_else: bool) -> PResult<'a, P> { + pub fn parse_if_expr(&mut self, attrs: ThinVec) -> 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().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 - } - })?; + if self.eat_keyword(keywords::Else) { + 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"); + return Err(err) + } + let thn = self.parse_block()?; let mut els: Option> = None; let mut hi = thn.span; if self.eat_keyword(keywords::Else) { @@ -3037,7 +3032,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(), true); + return self.parse_if_expr(ThinVec::new()); } 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 index 31beab55699a6..e94dc38c5e924 100644 --- a/src/test/ui/issue-13483.rs +++ b/src/test/ui/issue-13483.rs @@ -14,9 +14,3 @@ fn main() { } 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 index be0b53d3d9832..e49fdcf6d20a3 100644 --- a/src/test/ui/issue-13483.stderr +++ b/src/test/ui/issue-13483.stderr @@ -4,11 +4,5 @@ error: missing condition for `if` statemement 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 +error: aborting due to previous error