Sunjay Varma pointed out that this is a nice thing that we could do.
Resolves #53280.
use std::fmt;
use rustc_target::spec::abi;
use syntax::ast;
-use errors::DiagnosticBuilder;
+use errors::{Applicability, DiagnosticBuilder};
use syntax_pos::Span;
use hir;
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");
--> $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}`
--- /dev/null
+// 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
+}
--- /dev/null
+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`.