about summary refs log tree commit diff
path: root/src/libsyntax/parse/parser.rs
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2017-08-17 12:14:35 -0700
committerEsteban Küber <esteban@kuber.com.ar>2017-08-17 15:48:39 -0700
commit20a2716206ca879ad9848cbb4ac9fcc739dd3f77 (patch)
treeffdfeb1cfec33b0253c60f0efab5ef627a0ba49a /src/libsyntax/parse/parser.rs
parentc4672f8e879a0c31fbe26990551693da16f00a98 (diff)
downloadrust-20a2716206ca879ad9848cbb4ac9fcc739dd3f77.tar.gz
rust-20a2716206ca879ad9848cbb4ac9fcc739dd3f77.zip
Check for `else` keyword on missing `if` condition
Diffstat (limited to 'src/libsyntax/parse/parser.rs')
-rw-r--r--src/libsyntax/parse/parser.rs27
1 files changed, 11 insertions, 16 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 93902d06e52..22999afb48e 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<Attribute>,
-                         in_else: bool) -> PResult<'a, P<Expr>> {
+    pub fn parse_if_expr(&mut self, attrs: ThinVec<Attribute>) -> 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().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<P<Expr>> = 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<Expr>> {
         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()));