Rollup merge of #98972 - TaKO8Ki:suggest-adding-missing-zero-to-floating-point-number, r=compiler-errors
Suggest adding a missing zero to a floating point number fixes #98836
This commit is contained in:
commit
99fc65bc49
6 changed files with 219 additions and 4 deletions
|
@ -48,7 +48,7 @@ use rustc_middle::ty::{self, AdtKind, DefIdTree, Ty, TypeVisitable};
|
|||
use rustc_session::parse::feature_err;
|
||||
use rustc_span::hygiene::DesugaringKind;
|
||||
use rustc_span::lev_distance::find_best_match_for_name;
|
||||
use rustc_span::source_map::Span;
|
||||
use rustc_span::source_map::{Span, Spanned};
|
||||
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
||||
use rustc_span::{BytePos, Pos};
|
||||
use rustc_target::spec::abi::Abi::RustIntrinsic;
|
||||
|
@ -2162,14 +2162,55 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
} else if !expr_t.is_primitive_ty() {
|
||||
self.ban_nonexisting_field(field, base, expr, expr_t);
|
||||
} else {
|
||||
type_error_struct!(
|
||||
let field_name = field.to_string();
|
||||
let mut err = type_error_struct!(
|
||||
self.tcx().sess,
|
||||
field.span,
|
||||
expr_t,
|
||||
E0610,
|
||||
"`{expr_t}` is a primitive type and therefore doesn't have fields",
|
||||
)
|
||||
.emit();
|
||||
);
|
||||
let is_valid_suffix = |field: String| {
|
||||
if field == "f32" || field == "f64" {
|
||||
return true;
|
||||
}
|
||||
let mut chars = field.chars().peekable();
|
||||
match chars.peek() {
|
||||
Some('e') | Some('E') => {
|
||||
chars.next();
|
||||
if let Some(c) = chars.peek()
|
||||
&& !c.is_numeric() && *c != '-' && *c != '+'
|
||||
{
|
||||
return false;
|
||||
}
|
||||
while let Some(c) = chars.peek() {
|
||||
if !c.is_numeric() {
|
||||
break;
|
||||
}
|
||||
chars.next();
|
||||
}
|
||||
}
|
||||
_ => (),
|
||||
}
|
||||
let suffix = chars.collect::<String>();
|
||||
suffix.is_empty() || suffix == "f32" || suffix == "f64"
|
||||
};
|
||||
if let ty::Infer(ty::IntVar(_)) = expr_t.kind()
|
||||
&& let ExprKind::Lit(Spanned {
|
||||
node: ast::LitKind::Int(_, ast::LitIntType::Unsuffixed),
|
||||
..
|
||||
}) = base.kind
|
||||
&& !base.span.from_expansion()
|
||||
&& is_valid_suffix(field_name)
|
||||
{
|
||||
err.span_suggestion_verbose(
|
||||
field.span.shrink_to_lo(),
|
||||
"If the number is meant to be a floating point number, consider adding a `0` after the period",
|
||||
'0',
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
}
|
||||
err.emit();
|
||||
}
|
||||
|
||||
self.tcx().ty_error()
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
macro_rules! num { () => { 1 } }
|
||||
|
||||
fn main() {
|
||||
let x = 1i32;
|
||||
x.e10; //~ERROR `i32` is a primitive type and therefore doesn't have fields
|
||||
|
||||
let y = 1;
|
||||
y.e10; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
|
||||
|
||||
2u32.e10; //~ERROR `u32` is a primitive type and therefore doesn't have fields
|
||||
|
||||
num!().e10; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
|
||||
|
||||
2.e10foo; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
|
||||
|
||||
42._;
|
||||
//~^ERROR expected identifier, found reserved identifier `_`
|
||||
//~|ERROR `{integer}` is a primitive type and therefore doesn't have fields
|
||||
|
||||
42.a; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
error: expected identifier, found reserved identifier `_`
|
||||
--> $DIR/do-not-suggest-adding-missing-zero-to-floating-point-number.rs:16:8
|
||||
|
|
||||
LL | 42._;
|
||||
| ^ expected identifier, found reserved identifier
|
||||
|
||||
error[E0610]: `i32` is a primitive type and therefore doesn't have fields
|
||||
--> $DIR/do-not-suggest-adding-missing-zero-to-floating-point-number.rs:5:7
|
||||
|
|
||||
LL | x.e10;
|
||||
| ^^^
|
||||
|
||||
error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
|
||||
--> $DIR/do-not-suggest-adding-missing-zero-to-floating-point-number.rs:8:7
|
||||
|
|
||||
LL | y.e10;
|
||||
| ^^^
|
||||
|
||||
error[E0610]: `u32` is a primitive type and therefore doesn't have fields
|
||||
--> $DIR/do-not-suggest-adding-missing-zero-to-floating-point-number.rs:10:10
|
||||
|
|
||||
LL | 2u32.e10;
|
||||
| ^^^
|
||||
|
||||
error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
|
||||
--> $DIR/do-not-suggest-adding-missing-zero-to-floating-point-number.rs:12:12
|
||||
|
|
||||
LL | num!().e10;
|
||||
| ^^^
|
||||
|
||||
error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
|
||||
--> $DIR/do-not-suggest-adding-missing-zero-to-floating-point-number.rs:14:7
|
||||
|
|
||||
LL | 2.e10foo;
|
||||
| ^^^^^^
|
||||
|
||||
error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
|
||||
--> $DIR/do-not-suggest-adding-missing-zero-to-floating-point-number.rs:16:8
|
||||
|
|
||||
LL | 42._;
|
||||
| ^
|
||||
|
||||
error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
|
||||
--> $DIR/do-not-suggest-adding-missing-zero-to-floating-point-number.rs:20:8
|
||||
|
|
||||
LL | 42.a;
|
||||
| ^
|
||||
|
||||
error: aborting due to 8 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0610`.
|
|
@ -0,0 +1,11 @@
|
|||
// run-rustfix
|
||||
|
||||
fn main() {
|
||||
2.0e1; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
|
||||
2.0E1; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
|
||||
2.0f32; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
|
||||
2.0f64; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
|
||||
2.0e+12; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
|
||||
2.0e-12; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
|
||||
2.0e1f32; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
// run-rustfix
|
||||
|
||||
fn main() {
|
||||
2.e1; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
|
||||
2.E1; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
|
||||
2.f32; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
|
||||
2.f64; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
|
||||
2.e+12; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
|
||||
2.e-12; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
|
||||
2.e1f32; //~ERROR `{integer}` is a primitive type and therefore doesn't have fields
|
||||
}
|
|
@ -0,0 +1,80 @@
|
|||
error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
|
||||
--> $DIR/suggest-adding-missing-zero-to-floating-point-number.rs:4:7
|
||||
|
|
||||
LL | 2.e1;
|
||||
| ^^
|
||||
|
|
||||
help: If the number is meant to be a floating point number, consider adding a `0` after the period
|
||||
|
|
||||
LL | 2.0e1;
|
||||
| +
|
||||
|
||||
error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
|
||||
--> $DIR/suggest-adding-missing-zero-to-floating-point-number.rs:5:7
|
||||
|
|
||||
LL | 2.E1;
|
||||
| ^^
|
||||
|
|
||||
help: If the number is meant to be a floating point number, consider adding a `0` after the period
|
||||
|
|
||||
LL | 2.0E1;
|
||||
| +
|
||||
|
||||
error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
|
||||
--> $DIR/suggest-adding-missing-zero-to-floating-point-number.rs:6:7
|
||||
|
|
||||
LL | 2.f32;
|
||||
| ^^^
|
||||
|
|
||||
help: If the number is meant to be a floating point number, consider adding a `0` after the period
|
||||
|
|
||||
LL | 2.0f32;
|
||||
| +
|
||||
|
||||
error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
|
||||
--> $DIR/suggest-adding-missing-zero-to-floating-point-number.rs:7:7
|
||||
|
|
||||
LL | 2.f64;
|
||||
| ^^^
|
||||
|
|
||||
help: If the number is meant to be a floating point number, consider adding a `0` after the period
|
||||
|
|
||||
LL | 2.0f64;
|
||||
| +
|
||||
|
||||
error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
|
||||
--> $DIR/suggest-adding-missing-zero-to-floating-point-number.rs:8:7
|
||||
|
|
||||
LL | 2.e+12;
|
||||
| ^
|
||||
|
|
||||
help: If the number is meant to be a floating point number, consider adding a `0` after the period
|
||||
|
|
||||
LL | 2.0e+12;
|
||||
| +
|
||||
|
||||
error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
|
||||
--> $DIR/suggest-adding-missing-zero-to-floating-point-number.rs:9:7
|
||||
|
|
||||
LL | 2.e-12;
|
||||
| ^
|
||||
|
|
||||
help: If the number is meant to be a floating point number, consider adding a `0` after the period
|
||||
|
|
||||
LL | 2.0e-12;
|
||||
| +
|
||||
|
||||
error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
|
||||
--> $DIR/suggest-adding-missing-zero-to-floating-point-number.rs:10:7
|
||||
|
|
||||
LL | 2.e1f32;
|
||||
| ^^^^^
|
||||
|
|
||||
help: If the number is meant to be a floating point number, consider adding a `0` after the period
|
||||
|
|
||||
LL | 2.0e1f32;
|
||||
| +
|
||||
|
||||
error: aborting due to 7 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0610`.
|
Loading…
Add table
Add a link
Reference in a new issue