Account for bindings with types and in crate macros

This commit is contained in:
Esteban Küber 2018-06-21 12:10:53 -07:00
parent 70c88e500c
commit 096fbbbe44
4 changed files with 74 additions and 9 deletions

View file

@ -25,7 +25,8 @@ use util::nodemap::FxHashSet;
use syntax::ast;
use syntax::util::lev_distance::find_best_match_for_name;
use errors::DiagnosticBuilder;
use syntax_pos::Span;
use syntax_pos::{Span, FileName};
use rustc::hir::def_id::LOCAL_CRATE;
use rustc::hir;
@ -263,6 +264,11 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
let span = tcx.hir.span(node_id);
let snippet = tcx.sess.codemap().span_to_snippet(span)
.unwrap();
let filename = tcx.sess.codemap().span_to_filename(span);
let is_real_filename = match filename {
FileName::Real(_) => true,
_ => false,
};
let parent_node = self.tcx.hir.get(
self.tcx.hir.get_parent_node(node_id),
@ -271,13 +277,18 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
"you must specify a type for this binding, like `{}`",
concrete_type,
);
match parent_node {
hir_map::NodeLocal(hir::Local {
match (is_real_filename, parent_node) {
(true, hir_map::NodeLocal(hir::Local {
source: hir::LocalSource::Normal,
ty,
..
}) => {
})) => {
err.span_suggestion(
span,
// account for `let x: _ = 42;`
// ^^^^
span.to(ty.as_ref().map(|ty| ty.span)
.unwrap_or(span)),
&msg,
format!("{}: {}", snippet, concrete_type),
);

View file

@ -0,0 +1,14 @@
// 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.
#[macro_export]
macro_rules! mac {
($ident:ident) => { let $ident = 42; }
}

View file

@ -8,15 +8,35 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// aux-build:macro-in-other-crate.rs
#[macro_use] extern crate macro_in_other_crate;
macro_rules! local_mac {
($ident:ident) => { let $ident = 42; }
}
fn main() {
let x = 2.0.neg();
//~^ ERROR can't call method `neg` on ambiguous numeric type `{float}`
let y = 2.0;
let x = y.neg();
//~^ ERROR can't call method `neg` on ambiguous numeric type `{float}`
println!("{:?}", x);
for i in 0..100 {
println!("{}", i.pow(2));
//~^ ERROR can't call method `pow` on ambiguous numeric type `{integer}`
}
local_mac!(local_bar);
local_bar.pow(2);
//~^ ERROR can't call method `pow` on ambiguous numeric type `{integer}`
}
fn qux() {
mac!(bar);
bar.pow(2);
//~^ ERROR can't call method `pow` on ambiguous numeric type `{integer}`
}

View file

@ -1,5 +1,5 @@
error[E0689]: can't call method `neg` on ambiguous numeric type `{float}`
--> $DIR/method-on-ambiguous-numeric-type.rs:12:17
--> $DIR/method-on-ambiguous-numeric-type.rs:20:17
|
LL | let x = 2.0.neg();
| ^^^
@ -9,7 +9,7 @@ LL | let x = 2.0_f32.neg();
| ^^^^^^^
error[E0689]: can't call method `neg` on ambiguous numeric type `{float}`
--> $DIR/method-on-ambiguous-numeric-type.rs:15:15
--> $DIR/method-on-ambiguous-numeric-type.rs:24:15
|
LL | let x = y.neg();
| ^^^
@ -19,13 +19,33 @@ LL | let y: f32 = 2.0;
| ^^^^^^
error[E0689]: can't call method `pow` on ambiguous numeric type `{integer}`
--> $DIR/method-on-ambiguous-numeric-type.rs:19:26
--> $DIR/method-on-ambiguous-numeric-type.rs:29:26
|
LL | for i in 0..100 {
| - you must specify a type for this binding, like `i32`
LL | println!("{}", i.pow(2));
| ^^^
error: aborting due to 3 previous errors
error[E0689]: can't call method `pow` on ambiguous numeric type `{integer}`
--> $DIR/method-on-ambiguous-numeric-type.rs:34:15
|
LL | local_bar.pow(2);
| ^^^
help: you must specify a type for this binding, like `i32`
|
LL | ($ident:ident) => { let $ident: i32 = 42; }
| ^^^^^^^^^^^
error[E0689]: can't call method `pow` on ambiguous numeric type `{integer}`
--> $DIR/method-on-ambiguous-numeric-type.rs:40:9
|
LL | mac!(bar);
| ---------- you must specify a type for this binding, like `i32`
LL | bar.pow(2);
| ^^^
|
= note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
error: aborting due to 5 previous errors
For more information about this error, try `rustc --explain E0689`.