Skip to content

Commit

Permalink
Point out missing if conditional
Browse files Browse the repository at this point in the history
On a case where an else conditional is missing, point this out
instead of the token immediately after the (incorrect) else block:

```
error: missing condition for `if` statemementt push fork -f

  --> $DIR/issue-13483.rs:16:5
   |
13 |    } else if {
   |             ^ expected if condition here
```

instead of

```
error: expected `{`, found `else`
  --> ../../src/test/ui/issue-13483.rs:14:7
   |
14 |     } else {
   |       ^^^^
```
  • Loading branch information
estebank committed Aug 17, 2017
1 parent a80a873 commit c4672f8
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 4 deletions.
20 changes: 16 additions & 4 deletions src/libsyntax/parse/parser.rs
Expand Up @@ -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;
Expand Down Expand Up @@ -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<Attribute>) -> PResult<'a, P<Expr>> {
pub fn parse_if_expr(&mut self, attrs: ThinVec<Attribute>,
in_else: bool) -> PResult<'a, P<Expr>> {
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<P<Expr>> = None;
let mut hi = thn.span;
if self.eat_keyword(keywords::Else) {
Expand Down Expand Up @@ -3025,7 +3037,7 @@ impl<'a> Parser<'a> {
// `else` token already eaten
pub fn parse_else_expr(&mut self) -> PResult<'a, P<Expr>> {
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()));
Expand Down
22 changes: 22 additions & 0 deletions 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 <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.

fn main() {
if true {
} else if { //ERROR: MISSING CONDITIONAL
} else {
};
}

fn foo() {
if true {
} else if { //ERROR: MISSING CONDITIONAL
};
}
14 changes: 14 additions & 0 deletions 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

0 comments on commit c4672f8

Please sign in to comment.