about summary refs log tree commit diff
diff options
context:
space:
mode:
authoryukang <moorekang@gmail.com>2022-11-12 04:22:47 +0800
committeryukang <moorekang@gmail.com>2022-11-15 08:58:19 +0800
commit9db8e183dc17896ce5f307f6de19c261d746a9bc (patch)
treeb3c6e8b4903ff4d7d55a3d3721e259c97f39921d
parent101e1822c3e54e63996c8aaa014d55716f3937eb (diff)
downloadrust-9db8e183dc17896ce5f307f6de19c261d746a9bc.tar.gz
rust-9db8e183dc17896ce5f307f6de19c261d746a9bc.zip
fix #104088, Slightly improve error message for invalid identifier
-rw-r--r--compiler/rustc_error_messages/locales/en-US/parser.ftl3
-rw-r--r--compiler/rustc_parse/src/errors.rs8
-rw-r--r--compiler/rustc_parse/src/parser/stmt.rs17
-rw-r--r--src/test/ui/parser/issues/issue-104088.rs26
-rw-r--r--src/test/ui/parser/issues/issue-104088.stderr29
5 files changed, 81 insertions, 2 deletions
diff --git a/compiler/rustc_error_messages/locales/en-US/parser.ftl b/compiler/rustc_error_messages/locales/en-US/parser.ftl
index 815e8f4d356..4c7ce30097c 100644
--- a/compiler/rustc_error_messages/locales/en-US/parser.ftl
+++ b/compiler/rustc_error_messages/locales/en-US/parser.ftl
@@ -384,3 +384,6 @@ parser_fn_ptr_with_generics = function pointer types may not have generic parame
         [true] the
         *[false] a
     } `for` parameter list
+
+parser_invalid_identifier_with_leading_number = expected identifier, found number literal
+    .label = identifiers cannot start with a number
diff --git a/compiler/rustc_parse/src/errors.rs b/compiler/rustc_parse/src/errors.rs
index a39398950a5..2b17cea9794 100644
--- a/compiler/rustc_parse/src/errors.rs
+++ b/compiler/rustc_parse/src/errors.rs
@@ -1206,6 +1206,14 @@ pub(crate) struct SelfParamNotFirst {
 }
 
 #[derive(Diagnostic)]
+#[diag(parser_invalid_identifier_with_leading_number)]
+pub(crate) struct InvalidIdentiferStartsWithNumber {
+    #[primary_span]
+    #[label]
+    pub span: Span,
+}
+
+#[derive(Diagnostic)]
 #[diag(parser_const_generic_without_braces)]
 pub(crate) struct ConstGenericWithoutBraces {
     #[primary_span]
diff --git a/compiler/rustc_parse/src/parser/stmt.rs b/compiler/rustc_parse/src/parser/stmt.rs
index 9684145ad99..c2c3ff64ec7 100644
--- a/compiler/rustc_parse/src/parser/stmt.rs
+++ b/compiler/rustc_parse/src/parser/stmt.rs
@@ -10,8 +10,8 @@ use super::{
 use crate::errors::{
     AssignmentElseNotAllowed, CompoundAssignmentExpressionInLet, ConstLetMutuallyExclusive,
     DocCommentDoesNotDocumentAnything, ExpectedStatementAfterOuterAttr, InvalidCurlyInLetElse,
-    InvalidExpressionInLetElse, InvalidVariableDeclaration, InvalidVariableDeclarationSub,
-    WrapExpressionInParentheses,
+    InvalidExpressionInLetElse, InvalidIdentiferStartsWithNumber, InvalidVariableDeclaration,
+    InvalidVariableDeclarationSub, WrapExpressionInParentheses,
 };
 use crate::maybe_whole;
 
@@ -264,6 +264,7 @@ impl<'a> Parser<'a> {
             self.bump();
         }
 
+        self.report_invalid_identifier_error()?;
         let (pat, colon) = self.parse_pat_before_ty(None, RecoverComma::Yes, "`let` bindings")?;
 
         let (err, ty) = if colon {
@@ -355,6 +356,18 @@ impl<'a> Parser<'a> {
         Ok(P(ast::Local { ty, pat, kind, id: DUMMY_NODE_ID, span: lo.to(hi), attrs, tokens: None }))
     }
 
+    /// report error for `let 1x = 123`
+    pub fn report_invalid_identifier_error(&mut self) -> PResult<'a, ()> {
+        if let token::Literal(lit) = self.token.uninterpolate().kind &&
+            let Err(_) = rustc_ast::Lit::from_token(&self.token) &&
+            (lit.kind == token::LitKind::Integer || lit.kind == token::LitKind::Float) &&
+            self.look_ahead(1, |t| matches!(t.kind, token::Eq) || matches!(t.kind, token::Colon ) ) {
+                let err = self.sess.create_err(InvalidIdentiferStartsWithNumber { span: self.token.span });
+                return Err(err);
+        }
+        Ok(())
+    }
+
     fn check_let_else_init_bool_expr(&self, init: &ast::Expr) {
         if let ast::ExprKind::Binary(op, ..) = init.kind {
             if op.node.lazy() {
diff --git a/src/test/ui/parser/issues/issue-104088.rs b/src/test/ui/parser/issues/issue-104088.rs
new file mode 100644
index 00000000000..5f794fe2dc9
--- /dev/null
+++ b/src/test/ui/parser/issues/issue-104088.rs
@@ -0,0 +1,26 @@
+fn test() {
+    if let 123 = 123 { println!("yes"); }
+}
+
+fn test_2() {
+    let 1x = 123;
+    //~^ ERROR expected identifier, found number literal
+}
+
+fn test_3() {
+    let 2x: i32 = 123;
+    //~^ ERROR expected identifier, found number literal
+}
+
+fn test_4() {
+    if let 2e1 = 123 {
+        //~^ ERROR mismatched types
+    }
+}
+
+fn test_5() {
+    let 23name = 123;
+    //~^ ERROR expected identifier, found number literal
+}
+
+fn main() {}
diff --git a/src/test/ui/parser/issues/issue-104088.stderr b/src/test/ui/parser/issues/issue-104088.stderr
new file mode 100644
index 00000000000..ff4b4bdb695
--- /dev/null
+++ b/src/test/ui/parser/issues/issue-104088.stderr
@@ -0,0 +1,29 @@
+error: expected identifier, found number literal
+  --> $DIR/issue-104088.rs:6:9
+   |
+LL |     let 1x = 123;
+   |         ^^ identifiers cannot start with a number
+
+error: expected identifier, found number literal
+  --> $DIR/issue-104088.rs:11:9
+   |
+LL |     let 2x: i32 = 123;
+   |         ^^ identifiers cannot start with a number
+
+error: expected identifier, found number literal
+  --> $DIR/issue-104088.rs:22:9
+   |
+LL |     let 23name = 123;
+   |         ^^^^^^ identifiers cannot start with a number
+
+error[E0308]: mismatched types
+  --> $DIR/issue-104088.rs:16:12
+   |
+LL |     if let 2e1 = 123 {
+   |            ^^^   --- this expression has type `{integer}`
+   |            |
+   |            expected integer, found floating-point number
+
+error: aborting due to 4 previous errors
+
+For more information about this error, try `rustc --explain E0308`.