Skip to content

Commit 6f65b7e

Browse files
committed
suggest adding a missing zero to a floating point number
1 parent 5b8cf49 commit 6f65b7e

4 files changed

+70
-3
lines changed

compiler/rustc_typeck/src/check/expr.rs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2162,14 +2162,31 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
21622162
} else if !expr_t.is_primitive_ty() {
21632163
self.ban_nonexisting_field(field, base, expr, expr_t);
21642164
} else {
2165-
type_error_struct!(
2165+
let field_name = field.to_string();
2166+
let mut err = type_error_struct!(
21662167
self.tcx().sess,
21672168
field.span,
21682169
expr_t,
21692170
E0610,
21702171
"`{expr_t}` is a primitive type and therefore doesn't have fields",
2171-
)
2172-
.emit();
2172+
);
2173+
if expr_t.is_integral()
2174+
&& (field_name
2175+
.strip_prefix('e')
2176+
.or_else(|| field_name.strip_prefix('E'))
2177+
.map(|prefix| prefix.chars().all(|c| c.is_numeric()))
2178+
.unwrap_or_default()
2179+
|| field.name == sym::f32
2180+
|| field.name == sym::f64)
2181+
{
2182+
err.span_suggestion_verbose(
2183+
field.span.shrink_to_lo(),
2184+
"If the number is meant to be a floating point number, consider adding a `0` after the period",
2185+
'0',
2186+
Applicability::MaybeIncorrect,
2187+
);
2188+
}
2189+
err.emit();
21732190
}
21742191

21752192
self.tcx().ty_error()
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// run-rustfix
2+
3+
fn main() {
4+
2.0e1; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
5+
2.0f32; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
6+
2.0f64; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// run-rustfix
2+
3+
fn main() {
4+
2.e1; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
5+
2.f32; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
6+
2.f64; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
7+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
2+
--> $DIR/suggest-adding-missing-zero-to-floating-point-number.rs:4:7
3+
|
4+
LL | 2.e1;
5+
| ^^
6+
|
7+
help: If the number is meant to be a floating point number, consider adding a `0` after the period
8+
|
9+
LL | 2.0e1;
10+
| +
11+
12+
error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
13+
--> $DIR/suggest-adding-missing-zero-to-floating-point-number.rs:5:7
14+
|
15+
LL | 2.f32;
16+
| ^^^
17+
|
18+
help: If the number is meant to be a floating point number, consider adding a `0` after the period
19+
|
20+
LL | 2.0f32;
21+
| +
22+
23+
error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
24+
--> $DIR/suggest-adding-missing-zero-to-floating-point-number.rs:6:7
25+
|
26+
LL | 2.f64;
27+
| ^^^
28+
|
29+
help: If the number is meant to be a floating point number, consider adding a `0` after the period
30+
|
31+
LL | 2.0f64;
32+
| +
33+
34+
error: aborting due to 3 previous errors
35+
36+
For more information about this error, try `rustc --explain E0610`.

0 commit comments

Comments
 (0)