Skip to content

Commit

Permalink
wherein we suggest float for integer literals where a float was expected
Browse files Browse the repository at this point in the history
Sunjay Varma pointed out that this is a nice thing that we could do.

Resolves #53280.
  • Loading branch information
zackmdavis committed Aug 12, 2018
1 parent 0aa8d03 commit 58f660f
Show file tree
Hide file tree
Showing 4 changed files with 106 additions and 2 deletions.
17 changes: 16 additions & 1 deletion src/librustc/ty/error.rs
Expand Up @@ -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;
Expand Down Expand Up @@ -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");
Expand Down
5 changes: 4 additions & 1 deletion src/test/ui/catch-block-type-error.stderr
Expand Up @@ -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}`
Expand Down
@@ -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`.

0 comments on commit 58f660f

Please sign in to comment.