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.
This commit is contained in:
Zack M. Davis 2018-08-11 22:54:57 -07:00
parent 0aa8d03202
commit 58f660f025
4 changed files with 106 additions and 2 deletions

View File

@ -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");

View 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}`

View File

@ -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
}

View File

@ -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`.