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 std::fmt;
|
||||||
use rustc_target::spec::abi;
|
use rustc_target::spec::abi;
|
||||||
use syntax::ast;
|
use syntax::ast;
|
||||||
use errors::DiagnosticBuilder;
|
use errors::{Applicability, DiagnosticBuilder};
|
||||||
use syntax_pos::Span;
|
use syntax_pos::Span;
|
||||||
|
|
||||||
use hir;
|
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.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");
|
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) => {
|
OldStyleLUB(err) => {
|
||||||
db.note("this was previously accepted by the compiler but has been phased out");
|
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
|
--> $DIR/catch-block-type-error.rs:18:9
|
||||||
|
|
|
|
||||||
LL | 42
|
LL | 42
|
||||||
| ^^ expected f32, found integral variable
|
| ^^
|
||||||
|
| |
|
||||||
|
| expected f32, found integral variable
|
||||||
|
| help: use a float literal: `42.0`
|
||||||
|
|
|
|
||||||
= note: expected type `f32`
|
= note: expected type `f32`
|
||||||
found type `{integer}`
|
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