fix #104088, Slightly improve error message for invalid identifier
This commit is contained in:
parent
101e1822c3
commit
9db8e183dc
5 changed files with 81 additions and 2 deletions
|
@ -384,3 +384,6 @@ parser_fn_ptr_with_generics = function pointer types may not have generic parame
|
||||||
[true] the
|
[true] the
|
||||||
*[false] a
|
*[false] a
|
||||||
} `for` parameter list
|
} `for` parameter list
|
||||||
|
|
||||||
|
parser_invalid_identifier_with_leading_number = expected identifier, found number literal
|
||||||
|
.label = identifiers cannot start with a number
|
||||||
|
|
|
@ -1205,6 +1205,14 @@ pub(crate) struct SelfParamNotFirst {
|
||||||
pub span: Span,
|
pub span: Span,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(parser_invalid_identifier_with_leading_number)]
|
||||||
|
pub(crate) struct InvalidIdentiferStartsWithNumber {
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Diagnostic)]
|
#[derive(Diagnostic)]
|
||||||
#[diag(parser_const_generic_without_braces)]
|
#[diag(parser_const_generic_without_braces)]
|
||||||
pub(crate) struct ConstGenericWithoutBraces {
|
pub(crate) struct ConstGenericWithoutBraces {
|
||||||
|
|
|
@ -10,8 +10,8 @@ use super::{
|
||||||
use crate::errors::{
|
use crate::errors::{
|
||||||
AssignmentElseNotAllowed, CompoundAssignmentExpressionInLet, ConstLetMutuallyExclusive,
|
AssignmentElseNotAllowed, CompoundAssignmentExpressionInLet, ConstLetMutuallyExclusive,
|
||||||
DocCommentDoesNotDocumentAnything, ExpectedStatementAfterOuterAttr, InvalidCurlyInLetElse,
|
DocCommentDoesNotDocumentAnything, ExpectedStatementAfterOuterAttr, InvalidCurlyInLetElse,
|
||||||
InvalidExpressionInLetElse, InvalidVariableDeclaration, InvalidVariableDeclarationSub,
|
InvalidExpressionInLetElse, InvalidIdentiferStartsWithNumber, InvalidVariableDeclaration,
|
||||||
WrapExpressionInParentheses,
|
InvalidVariableDeclarationSub, WrapExpressionInParentheses,
|
||||||
};
|
};
|
||||||
use crate::maybe_whole;
|
use crate::maybe_whole;
|
||||||
|
|
||||||
|
@ -264,6 +264,7 @@ impl<'a> Parser<'a> {
|
||||||
self.bump();
|
self.bump();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.report_invalid_identifier_error()?;
|
||||||
let (pat, colon) = self.parse_pat_before_ty(None, RecoverComma::Yes, "`let` bindings")?;
|
let (pat, colon) = self.parse_pat_before_ty(None, RecoverComma::Yes, "`let` bindings")?;
|
||||||
|
|
||||||
let (err, ty) = if colon {
|
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 }))
|
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) {
|
fn check_let_else_init_bool_expr(&self, init: &ast::Expr) {
|
||||||
if let ast::ExprKind::Binary(op, ..) = init.kind {
|
if let ast::ExprKind::Binary(op, ..) = init.kind {
|
||||||
if op.node.lazy() {
|
if op.node.lazy() {
|
||||||
|
|
26
src/test/ui/parser/issues/issue-104088.rs
Normal file
26
src/test/ui/parser/issues/issue-104088.rs
Normal file
|
@ -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() {}
|
29
src/test/ui/parser/issues/issue-104088.stderr
Normal file
29
src/test/ui/parser/issues/issue-104088.stderr
Normal file
|
@ -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`.
|
Loading…
Add table
Add a link
Reference in a new issue