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:
parent
0aa8d03202
commit
58f660f025
@ -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");
|
||||
|
@ -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}`
|
||||
|
@ -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
|
||||
}
|
@ -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`.
|
Loading…
Reference in New Issue
Block a user