about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTakayuki Maeda <takoyaki0316@gmail.com>2022-07-12 13:59:51 +0900
committerTakayuki Maeda <takoyaki0316@gmail.com>2022-07-12 13:59:51 +0900
commite03cb7fb9a10bffbec3ccc0a0ca68c6c97112ea8 (patch)
tree74b83230ec0df99db133fd49b2d3138956552914
parent6f65b7e64be256df673bca2d6cc1f0e461b9eea7 (diff)
downloadrust-e03cb7fb9a10bffbec3ccc0a0ca68c6c97112ea8.tar.gz
rust-e03cb7fb9a10bffbec3ccc0a0ca68c6c97112ea8.zip
implement a suggestion for a floating point number with a type suffix
-rw-r--r--compiler/rustc_typeck/src/check/expr.rs42
-rw-r--r--src/test/ui/typeck/do-not-suggest-adding-missing-zero-to-floating-point-number.rs21
-rw-r--r--src/test/ui/typeck/do-not-suggest-adding-missing-zero-to-floating-point-number.stderr51
-rw-r--r--src/test/ui/typeck/suggest-adding-missing-zero-to-floating-point-number.fixed4
-rw-r--r--src/test/ui/typeck/suggest-adding-missing-zero-to-floating-point-number.rs4
-rw-r--r--src/test/ui/typeck/suggest-adding-missing-zero-to-floating-point-number.stderr48
6 files changed, 159 insertions, 11 deletions
diff --git a/compiler/rustc_typeck/src/check/expr.rs b/compiler/rustc_typeck/src/check/expr.rs
index a79257f0f5e..c3fc9776835 100644
--- a/compiler/rustc_typeck/src/check/expr.rs
+++ b/compiler/rustc_typeck/src/check/expr.rs
@@ -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;
@@ -2170,14 +2170,38 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
                 E0610,
                 "`{expr_t}` is a primitive type and therefore doesn't have fields",
             );
-            if expr_t.is_integral()
-                && (field_name
-                    .strip_prefix('e')
-                    .or_else(|| field_name.strip_prefix('E'))
-                    .map(|prefix| prefix.chars().all(|c| c.is_numeric()))
-                    .unwrap_or_default()
-                    || field.name == sym::f32
-                    || field.name == sym::f64)
+            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(),
diff --git a/src/test/ui/typeck/do-not-suggest-adding-missing-zero-to-floating-point-number.rs b/src/test/ui/typeck/do-not-suggest-adding-missing-zero-to-floating-point-number.rs
new file mode 100644
index 00000000000..501f4b6ef9e
--- /dev/null
+++ b/src/test/ui/typeck/do-not-suggest-adding-missing-zero-to-floating-point-number.rs
@@ -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
+}
diff --git a/src/test/ui/typeck/do-not-suggest-adding-missing-zero-to-floating-point-number.stderr b/src/test/ui/typeck/do-not-suggest-adding-missing-zero-to-floating-point-number.stderr
new file mode 100644
index 00000000000..1ef1d4c28e4
--- /dev/null
+++ b/src/test/ui/typeck/do-not-suggest-adding-missing-zero-to-floating-point-number.stderr
@@ -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`.
diff --git a/src/test/ui/typeck/suggest-adding-missing-zero-to-floating-point-number.fixed b/src/test/ui/typeck/suggest-adding-missing-zero-to-floating-point-number.fixed
index 01d3769c1f3..ba83e79005b 100644
--- a/src/test/ui/typeck/suggest-adding-missing-zero-to-floating-point-number.fixed
+++ b/src/test/ui/typeck/suggest-adding-missing-zero-to-floating-point-number.fixed
@@ -2,6 +2,10 @@
 
 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
 }
diff --git a/src/test/ui/typeck/suggest-adding-missing-zero-to-floating-point-number.rs b/src/test/ui/typeck/suggest-adding-missing-zero-to-floating-point-number.rs
index c2cbd5d5189..c102447f602 100644
--- a/src/test/ui/typeck/suggest-adding-missing-zero-to-floating-point-number.rs
+++ b/src/test/ui/typeck/suggest-adding-missing-zero-to-floating-point-number.rs
@@ -2,6 +2,10 @@
 
 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
 }
diff --git a/src/test/ui/typeck/suggest-adding-missing-zero-to-floating-point-number.stderr b/src/test/ui/typeck/suggest-adding-missing-zero-to-floating-point-number.stderr
index 042f9c727cc..e8e069708a8 100644
--- a/src/test/ui/typeck/suggest-adding-missing-zero-to-floating-point-number.stderr
+++ b/src/test/ui/typeck/suggest-adding-missing-zero-to-floating-point-number.stderr
@@ -12,6 +12,17 @@ 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;
    |       ^^^
    |
@@ -21,7 +32,7 @@ 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:6:7
+  --> $DIR/suggest-adding-missing-zero-to-floating-point-number.rs:7:7
    |
 LL |     2.f64;
    |       ^^^
@@ -31,6 +42,39 @@ help: If the number is meant to be a floating point number, consider adding a `0
 LL |     2.0f64;
    |       +
 
-error: aborting due to 3 previous errors
+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`.