add helpful error notes and fix the false 'defined here' messages
This commit is contained in:
parent
1279b3b923
commit
d7cb66d389
|
@ -4,7 +4,7 @@ use crate::type_error_struct;
|
||||||
|
|
||||||
use rustc_errors::{struct_span_err, Applicability, DiagnosticBuilder};
|
use rustc_errors::{struct_span_err, Applicability, DiagnosticBuilder};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::Res;
|
use rustc_hir::def::{Namespace, Res};
|
||||||
use rustc_hir::def_id::{DefId, LOCAL_CRATE};
|
use rustc_hir::def_id::{DefId, LOCAL_CRATE};
|
||||||
use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
|
use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
|
||||||
use rustc_infer::{infer, traits};
|
use rustc_infer::{infer, traits};
|
||||||
|
@ -374,7 +374,26 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
|p| format!("`{}` defined here returns `{}`", p, callee_ty),
|
|p| format!("`{}` defined here returns `{}`", p, callee_ty),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
_ => {
|
||||||
|
match def {
|
||||||
|
// Emit a different diagnostic for local variables, as they are not
|
||||||
|
// type definitions themselves, but rather variables *of* that type.
|
||||||
|
Res::Local(hir_id) => Some(format!(
|
||||||
|
"`{}` has type `{}`",
|
||||||
|
self.tcx.hir().name(hir_id),
|
||||||
|
callee_ty
|
||||||
|
)),
|
||||||
|
Res::Def(kind, def_id)
|
||||||
|
if kind.ns() == Some(Namespace::ValueNS) =>
|
||||||
|
{
|
||||||
|
Some(format!(
|
||||||
|
"`{}` defined here",
|
||||||
|
self.tcx.def_path_str(def_id),
|
||||||
|
))
|
||||||
|
}
|
||||||
_ => Some(format!("`{}` defined here", callee_ty)),
|
_ => Some(format!("`{}` defined here", callee_ty)),
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
if let Some(label) = label {
|
if let Some(label) = label {
|
||||||
err.span_label(span, label);
|
err.span_label(span, label);
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
const FOO: usize = 0;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
FOO(); //~ ERROR expected function, found `usize`
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
error[E0618]: expected function, found `usize`
|
||||||
|
--> $DIR/const-as-fn.rs:4:5
|
||||||
|
|
|
||||||
|
LL | const FOO: usize = 0;
|
||||||
|
| --------------------- `FOO` defined here
|
||||||
|
...
|
||||||
|
LL | FOO();
|
||||||
|
| ^^^--
|
||||||
|
| |
|
||||||
|
| call expression requires function
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0618`.
|
|
@ -18,7 +18,7 @@ error[E0618]: expected function, found `i32`
|
||||||
--> $DIR/E0618.rs:9:5
|
--> $DIR/E0618.rs:9:5
|
||||||
|
|
|
|
||||||
LL | let x = 0i32;
|
LL | let x = 0i32;
|
||||||
| - `i32` defined here
|
| - `x` has type `i32`
|
||||||
LL | x();
|
LL | x();
|
||||||
| ^--
|
| ^--
|
||||||
| |
|
| |
|
||||||
|
|
|
@ -2,7 +2,7 @@ error[E0618]: expected function, found `i32`
|
||||||
--> $DIR/issue-10969.rs:2:5
|
--> $DIR/issue-10969.rs:2:5
|
||||||
|
|
|
|
||||||
LL | fn func(i: i32) {
|
LL | fn func(i: i32) {
|
||||||
| - `i32` defined here
|
| - `i` has type `i32`
|
||||||
LL | i();
|
LL | i();
|
||||||
| ^--
|
| ^--
|
||||||
| |
|
| |
|
||||||
|
@ -12,7 +12,7 @@ error[E0618]: expected function, found `i32`
|
||||||
--> $DIR/issue-10969.rs:6:5
|
--> $DIR/issue-10969.rs:6:5
|
||||||
|
|
|
|
||||||
LL | let i = 0i32;
|
LL | let i = 0i32;
|
||||||
| - `i32` defined here
|
| - `i` has type `i32`
|
||||||
LL | i();
|
LL | i();
|
||||||
| ^--
|
| ^--
|
||||||
| |
|
| |
|
||||||
|
|
|
@ -2,7 +2,7 @@ error[E0618]: expected function, found `U`
|
||||||
--> $DIR/issue-21701.rs:2:13
|
--> $DIR/issue-21701.rs:2:13
|
||||||
|
|
|
|
||||||
LL | fn foo<U>(t: U) {
|
LL | fn foo<U>(t: U) {
|
||||||
| - `U` defined here
|
| - `t` has type `U`
|
||||||
LL | let y = t();
|
LL | let y = t();
|
||||||
| ^--
|
| ^--
|
||||||
| |
|
| |
|
||||||
|
|
|
@ -2,7 +2,7 @@ error[E0618]: expected function, found `&str`
|
||||||
--> $DIR/issue-22468.rs:3:13
|
--> $DIR/issue-22468.rs:3:13
|
||||||
|
|
|
|
||||||
LL | let foo = "bar";
|
LL | let foo = "bar";
|
||||||
| --- `&str` defined here
|
| --- `foo` has type `&str`
|
||||||
LL | let x = foo("baz");
|
LL | let x = foo("baz");
|
||||||
| ^^^-------
|
| ^^^-------
|
||||||
| |
|
| |
|
||||||
|
|
|
@ -5,7 +5,7 @@ LL | $not_a_function($some_argument)
|
||||||
| ------------------------------- call expression requires function
|
| ------------------------------- call expression requires function
|
||||||
...
|
...
|
||||||
LL | let mut value_a = 0;
|
LL | let mut value_a = 0;
|
||||||
| ----------- `{integer}` defined here
|
| ----------- `value_a` has type `{integer}`
|
||||||
LL | let mut value_b = 0;
|
LL | let mut value_b = 0;
|
||||||
LL | macro_panic!(value_a, value_b);
|
LL | macro_panic!(value_a, value_b);
|
||||||
| ^^^^^^^
|
| ^^^^^^^
|
||||||
|
|
|
@ -14,7 +14,7 @@ error[E0618]: expected function, found `{integer}`
|
||||||
--> $DIR/parse-error-correct.rs:7:13
|
--> $DIR/parse-error-correct.rs:7:13
|
||||||
|
|
|
|
||||||
LL | let y = 42;
|
LL | let y = 42;
|
||||||
| - `{integer}` defined here
|
| - `y` has type `{integer}`
|
||||||
LL | let x = y.;
|
LL | let x = y.;
|
||||||
LL | let x = y.();
|
LL | let x = y.();
|
||||||
| ^---
|
| ^---
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
struct S;
|
||||||
|
|
||||||
|
fn repro_ref(thing: S) {
|
||||||
|
thing(); //~ ERROR expected function, found `S`
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -0,0 +1,13 @@
|
||||||
|
error[E0618]: expected function, found `S`
|
||||||
|
--> $DIR/80853.rs:4:5
|
||||||
|
|
|
||||||
|
LL | fn repro_ref(thing: S) {
|
||||||
|
| ----- `thing` has type `S`
|
||||||
|
LL | thing();
|
||||||
|
| ^^^^^--
|
||||||
|
| |
|
||||||
|
| call expression requires function
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0618`.
|
Loading…
Reference in New Issue