diff options
| author | Zack M. Davis <code@zackmdavis.net> | 2018-08-11 22:54:57 -0700 |
|---|---|---|
| committer | Zack M. Davis <code@zackmdavis.net> | 2018-08-12 10:20:35 -0700 |
| commit | 58f660f025c4afc1cdb5cade60f87d78492d9299 (patch) | |
| tree | 0993378556c6a0daa105c7afc289d410d59a135d /src | |
| parent | 0aa8d0320266b5579428312095fe49af05ada972 (diff) | |
| download | rust-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')
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`. |
