about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2017-08-13 14:50:27 -0700
committerEsteban Küber <esteban@kuber.com.ar>2017-08-17 10:18:06 -0700
commitc4672f8e879a0c31fbe26990551693da16f00a98 (patch)
tree4f174601c1509cb65b7defc3898e5150687ed752 /src
parenta80a873209a79499290201f8657618703a51b73e (diff)
downloadrust-c4672f8e879a0c31fbe26990551693da16f00a98.tar.gz
rust-c4672f8e879a0c31fbe26990551693da16f00a98.zip
Point out missing if conditional
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 {
   |       ^^^^
```
Diffstat (limited to 'src')
-rw-r--r--src/libsyntax/parse/parser.rs20
-rw-r--r--src/test/ui/issue-13483.rs22
-rw-r--r--src/test/ui/issue-13483.stderr14
3 files changed, 52 insertions, 4 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 15f05df58b5..93902d06e52 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<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) {
@@ -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()));
diff --git a/src/test/ui/issue-13483.rs b/src/test/ui/issue-13483.rs
new file mode 100644
index 00000000000..31beab55699
--- /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 <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
+    };
+}
diff --git a/src/test/ui/issue-13483.stderr b/src/test/ui/issue-13483.stderr
new file mode 100644
index 00000000000..be0b53d3d98
--- /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
+