]> git.lizzy.rs Git - rust.git/commitdiff
wherein we suggest float for integer literals where a float was expected
authorZack M. Davis <code@zackmdavis.net>
Sun, 12 Aug 2018 05:54:57 +0000 (22:54 -0700)
committerZack M. Davis <code@zackmdavis.net>
Sun, 12 Aug 2018 17:20:35 +0000 (10:20 -0700)
Sunjay Varma pointed out that this is a nice thing that we could do.

Resolves #53280.

src/librustc/ty/error.rs
src/test/ui/catch-block-type-error.stderr
src/test/ui/did_you_mean/issue-53280-expected-float-found-integer-literal.rs [new file with mode: 0644]
src/test/ui/did_you_mean/issue-53280-expected-float-found-integer-literal.stderr [new file with mode: 0644]

index bcbd8a529f6a7e9f87e6586e459c9ed1f92267a5..49fffaa375b2f705c91f891cdbdb24d38cb57433 100644 (file)
@@ -13,7 +13,7 @@
 use std::fmt;
 use rustc_target::spec::abi;
 use syntax::ast;
-use errors::DiagnosticBuilder;
+use errors::{Applicability, DiagnosticBuilder};
 use syntax_pos::Span;
 
 use hir;
@@ -250,6 +250,21 @@ pub fn note_and_explain_type_err(self,
                     db.note("no two closures, even if identical, have the same type");
                     db.help("consider boxing your closure and/or using it as a trait object");
                 }
+                match (&values.found.sty, &values.expected.sty) { // Issue #53280
+                    (ty::TyInfer(ty::IntVar(_)), ty::TyFloat(_)) => {
+                        if let Ok(snippet) = self.sess.codemap().span_to_snippet(sp) {
+                            if snippet.chars().all(|c| c.is_digit(10) || c == '-' || c == '_') {
+                                db.span_suggestion_with_applicability(
+                                    sp,
+                                    "use a float literal",
+                                    format!("{}.0", snippet),
+                                    Applicability::MachineApplicable
+                                );
+                            }
+                        }
+                    },
+                    _ => {}
+                }
             },
             OldStyleLUB(err) => {
                 db.note("this was previously accepted by the compiler but has been phased out");
index 0ae8d4862f7c8828f2077e583a070305297bdaa0..288168c699263e07871593c8c149a09954c5da00 100644 (file)
@@ -2,7 +2,10 @@ error[E0271]: type mismatch resolving `<std::option::Option<f32> as std::ops::Tr
   --> $DIR/catch-block-type-error.rs:18:9
    |
 LL |         42
-   |         ^^ expected f32, found integral variable
+   |         ^^
+   |         |
+   |         expected f32, found integral variable
+   |         help: use a float literal: `42.0`
    |
    = note: expected type `f32`
               found type `{integer}`
diff --git a/src/test/ui/did_you_mean/issue-53280-expected-float-found-integer-literal.rs b/src/test/ui/did_you_mean/issue-53280-expected-float-found-integer-literal.rs
new file mode 100644 (file)
index 0000000..243e3a6
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+fn main() {
+    let sixteen: f32 = 16;
+    //~^ ERROR mismatched types
+    //~| HELP use a float literal
+    let a_million_and_seventy: f64 = 1_000_070;
+    //~^ ERROR mismatched types
+    //~| HELP use a float literal
+    let negative_nine: f32 = -9;
+    //~^ ERROR mismatched types
+    //~| HELP use a float literal
+
+
+    // only base-10 literals get the suggestion
+
+    let sixteen_again: f64 = 0x10;
+    //~^ ERROR mismatched types
+    let and_once_more: f32 = 0o20;
+    //~^ ERROR mismatched types
+}
diff --git a/src/test/ui/did_you_mean/issue-53280-expected-float-found-integer-literal.stderr b/src/test/ui/did_you_mean/issue-53280-expected-float-found-integer-literal.stderr
new file mode 100644 (file)
index 0000000..caaa954
--- /dev/null
@@ -0,0 +1,57 @@
+error[E0308]: mismatched types
+  --> $DIR/issue-53280-expected-float-found-integer-literal.rs:12:24
+   |
+LL |     let sixteen: f32 = 16;
+   |                        ^^
+   |                        |
+   |                        expected f32, found integral variable
+   |                        help: use a float literal: `16.0`
+   |
+   = note: expected type `f32`
+              found type `{integer}`
+
+error[E0308]: mismatched types
+  --> $DIR/issue-53280-expected-float-found-integer-literal.rs:15:38
+   |
+LL |     let a_million_and_seventy: f64 = 1_000_070;
+   |                                      ^^^^^^^^^
+   |                                      |
+   |                                      expected f64, found integral variable
+   |                                      help: use a float literal: `1_000_070.0`
+   |
+   = note: expected type `f64`
+              found type `{integer}`
+
+error[E0308]: mismatched types
+  --> $DIR/issue-53280-expected-float-found-integer-literal.rs:18:30
+   |
+LL |     let negative_nine: f32 = -9;
+   |                              ^^
+   |                              |
+   |                              expected f32, found integral variable
+   |                              help: use a float literal: `-9.0`
+   |
+   = note: expected type `f32`
+              found type `{integer}`
+
+error[E0308]: mismatched types
+  --> $DIR/issue-53280-expected-float-found-integer-literal.rs:25:30
+   |
+LL |     let sixteen_again: f64 = 0x10;
+   |                              ^^^^ expected f64, found integral variable
+   |
+   = note: expected type `f64`
+              found type `{integer}`
+
+error[E0308]: mismatched types
+  --> $DIR/issue-53280-expected-float-found-integer-literal.rs:27:30
+   |
+LL |     let and_once_more: f32 = 0o20;
+   |                              ^^^^ expected f32, found integral variable
+   |
+   = note: expected type `f32`
+              found type `{integer}`
+
+error: aborting due to 5 previous errors
+
+For more information about this error, try `rustc --explain E0308`.