Skip to content

Commit

Permalink
Rollup merge of rust-lang#98972 - TaKO8Ki:suggest-adding-missing-zero…
Browse files Browse the repository at this point in the history
…-to-floating-point-number, r=compiler-errors

Suggest adding a missing zero to a floating point number

fixes rust-lang#98836
  • Loading branch information
Dylan-DPC authored Jul 12, 2022
2 parents 9b65832 + e03cb7f commit 3cee52d
Show file tree
Hide file tree
Showing 6 changed files with 219 additions and 4 deletions.
49 changes: 45 additions & 4 deletions compiler/rustc_typeck/src/check/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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()
Expand Down
Original file line number Diff line number Diff line change
@@ -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
}
Original file line number Diff line number Diff line change
@@ -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`.
Original file line number Diff line number Diff line change
@@ -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
}
Original file line number Diff line number Diff line change
@@ -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
}
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit 3cee52d

Please sign in to comment.