Fix invalid float literal suggestions when recovering an integer

Only suggest adding a zero to integers with a preceding dot when the change will
result in a valid floating point literal.

For example, `.0x0` should not be turned into `0.0x0`.
This commit is contained in:
Cassaundra Smith 2023-01-30 13:39:25 -08:00
parent 481725984b
commit 80fcd7c40e
No known key found for this signature in database
GPG Key ID: E8087B0F3D674D9B
3 changed files with 60 additions and 1 deletions

View File

@ -1854,7 +1854,16 @@ fn recover_after_dot(&mut self) -> Option<Token> {
if let token::Literal(token::Lit { kind: token::Integer, symbol, suffix }) =
next_token.kind
{
if self.token.span.hi() == next_token.span.lo() {
// If this integer looks like a float, then recover as such.
//
// We will never encounter the exponent part of a floating
// point literal here, since there's no use of the exponent
// syntax that also constitutes a valid integer, so we need
// not check for that.
if suffix.map_or(true, |s| s == sym::f32 || s == sym::f64)
&& symbol.as_str().chars().all(|c| c.is_numeric() || c == '_')
&& self.token.span.hi() == next_token.span.lo()
{
let s = String::from("0.") + symbol.as_str();
let kind = TokenKind::lit(token::Float, Symbol::intern(&s), suffix);
return Some(Token::new(kind, self.token.span.to(next_token.span)));

View File

@ -0,0 +1,24 @@
// Check that suggestions to add a zero to integers with a preceding dot only appear when the change
// will result in a valid floating point literal.
fn main() {}
fn a() {
_ = .3u32;
//~^ ERROR expected expression, found `.`
}
fn b() {
_ = .0b0;
//~^ ERROR expected expression, found `.`
}
fn c() {
_ = .0o07;
//~^ ERROR expected expression, found `.`
}
fn d() {
_ = .0x0ABC;
//~^ ERROR expected expression, found `.`
}

View File

@ -0,0 +1,26 @@
error: expected expression, found `.`
--> $DIR/recover-invalid-float-invalid.rs:7:9
|
LL | _ = .3u32;
| ^ expected expression
error: expected expression, found `.`
--> $DIR/recover-invalid-float-invalid.rs:12:9
|
LL | _ = .0b0;
| ^ expected expression
error: expected expression, found `.`
--> $DIR/recover-invalid-float-invalid.rs:17:9
|
LL | _ = .0o07;
| ^ expected expression
error: expected expression, found `.`
--> $DIR/recover-invalid-float-invalid.rs:22:9
|
LL | _ = .0x0ABC;
| ^ expected expression
error: aborting due to 4 previous errors