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 ` 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 or the MIT license +// , 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`.