about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorZack M. Davis <code@zackmdavis.net>2018-08-11 22:54:57 -0700
committerZack M. Davis <code@zackmdavis.net>2018-08-12 10:20:35 -0700
commit58f660f025c4afc1cdb5cade60f87d78492d9299 (patch)
tree0993378556c6a0daa105c7afc289d410d59a135d /src
parent0aa8d0320266b5579428312095fe49af05ada972 (diff)
downloadrust-58f660f025c4afc1cdb5cade60f87d78492d9299.tar.gz
rust-58f660f025c4afc1cdb5cade60f87d78492d9299.zip
wherein we suggest float for integer literals where a float was expected
Sunjay Varma pointed out that this is a nice thing that we could do.

Resolves #53280.
Diffstat (limited to 'src')
-rw-r--r--src/librustc/ty/error.rs17
-rw-r--r--src/test/ui/catch-block-type-error.stderr5
-rw-r--r--src/test/ui/did_you_mean/issue-53280-expected-float-found-integer-literal.rs29
-rw-r--r--src/test/ui/did_you_mean/issue-53280-expected-float-found-integer-literal.stderr57
4 files changed, 106 insertions, 2 deletions
diff --git a/src/librustc/ty/error.rs b/src/librustc/ty/error.rs
index bcbd8a529f6..49fffaa375b 100644
--- a/src/librustc/ty/error.rs
+++ b/src/librustc/ty/error.rs
@@ -13,7 +13,7 @@ use ty::{self, BoundRegion, Region, Ty, TyCtxt};
 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 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
                     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");
diff --git a/src/test/ui/catch-block-type-error.stderr b/src/test/ui/catch-block-type-error.stderr
index 0ae8d4862f7..288168c6992 100644
--- a/src/test/ui/catch-block-type-error.stderr
+++ b/src/test/ui/catch-block-type-error.stderr
@@ -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
index 00000000000..243e3a65f39
--- /dev/null
+++ b/src/test/ui/did_you_mean/issue-53280-expected-float-found-integer-literal.rs
@@ -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
index 00000000000..caaa9541417
--- /dev/null
+++ b/src/test/ui/did_you_mean/issue-53280-expected-float-found-integer-literal.stderr
@@ -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`.