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>2019-01-20 01:49:04 -0800
committerEsteban Küber <esteban@kuber.com.ar>2019-01-20 01:49:04 -0800
commitacbda76f23b8945fd8f45332352269044ecbf2ca (patch)
tree03dff9f95bbe01a8be8c6768deba719e04568902 /src/libsyntax/parse/parser.rs
parentb1f169fe7a19cf10f70ee2aa2513276185c70e9b (diff)
downloadrust-acbda76f23b8945fd8f45332352269044ecbf2ca.tar.gz
rust-acbda76f23b8945fd8f45332352269044ecbf2ca.zip
Recover with suggestion from writing `.42` instead of `0.42`
Diffstat (limited to 'src/libsyntax/parse/parser.rs')
-rw-r--r--src/libsyntax/parse/parser.rs26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 9b20937cf93..43a263b8a6b 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -1989,6 +1989,32 @@ impl<'a> Parser<'a> {
 
                 result.unwrap()
             }
+            token::Dot if self.look_ahead(1, |t| match t {
+                token::Literal(parse::token::Lit::Integer(_) , None) => true,
+                _ => false,
+            }) => { // recover from `let x = .4;`
+                let lo = self.span;
+                self.bump();
+                if let token::Literal(
+                    parse::token::Lit::Integer(val),
+                    None
+                ) = self.token {
+                    self.bump();
+                    let sp = lo.to(self.prev_span);
+                    let mut err = self.diagnostic()
+                        .struct_span_err(sp, "numeric float literals must have a significant");
+                    err.span_suggestion_with_applicability(
+                        sp,
+                        "numeric float literals must have a significant",
+                        format!("0.{}", val),
+                        Applicability::MachineApplicable,
+                    );
+                    err.emit();
+                    return Ok(ast::LitKind::Float(val, ast::FloatTy::F32));
+                } else {
+                    unreachable!();
+                };
+            }
             _ => { return self.unexpected_last(&self.token); }
         };