diff options
| author | YI <uuuuuu@protonmail.com> | 2020-04-26 10:28:33 +0800 |
|---|---|---|
| committer | YI <uuuuuu@protonmail.com> | 2020-04-26 10:28:33 +0800 |
| commit | eb8a7031ef1ecd9b44a929f0b93f0e41c78fda25 (patch) | |
| tree | 2c3342d656f4bf6a396d373465a6446c6da0a63e | |
| parent | bb1eedb026931853e2f37e752c45b7f3b59c5fa6 (diff) | |
| download | rust-eb8a7031ef1ecd9b44a929f0b93f0e41c78fda25.tar.gz rust-eb8a7031ef1ecd9b44a929f0b93f0e41c78fda25.zip | |
use defkind.descr in wrong namespace resolve failure
| -rw-r--r-- | src/librustc_resolve/lib.rs | 39 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-71406.rs | 2 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-71406.stderr | 4 |
3 files changed, 24 insertions, 21 deletions
diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index 71fb8147793..2d53b7553a1 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -2213,25 +2213,28 @@ impl<'a> Resolver<'a> { } else { let mut msg = format!("could not find `{}` in `{}`", ident, path[i - 1].ident); - if ns == TypeNS { - if let FindBindingResult::Binding(Ok(_)) = - find_binding_in_ns(self, ValueNS) + if ns == TypeNS || ns == ValueNS { + let ns_to_try = if ns == TypeNS { ValueNS } else { TypeNS }; + if let FindBindingResult::Binding(Ok(binding)) = + find_binding_in_ns(self, ns_to_try) { - msg = format!( - "`{}` in `{}` is a concrete value, not a module or Struct you specified", - ident, - path[i - 1].ident - ); - }; - } else if ns == ValueNS { - if let FindBindingResult::Binding(Ok(_)) = - find_binding_in_ns(self, TypeNS) - { - msg = format!( - "`{}` in `{}` is a type, not a concrete value you specified", - ident, - path[i - 1].ident - ); + let mut found = |what| { + msg = format!( + "expected {}, found {} `{}` in `{}`", + ns.descr(), + what, + ident, + path[i - 1].ident + ) + }; + if binding.module().is_some() { + found("module") + } else { + match binding.res() { + def::Res::<NodeId>::Def(kind, id) => found(kind.descr(id)), + _ => found(ns_to_try.descr()), + } + } }; } (msg, None) diff --git a/src/test/ui/issues/issue-71406.rs b/src/test/ui/issues/issue-71406.rs index e3de30f9289..6266112c3a8 100644 --- a/src/test/ui/issues/issue-71406.rs +++ b/src/test/ui/issues/issue-71406.rs @@ -2,5 +2,5 @@ use std::sync::mpsc; fn main() { let (tx, rx) = mpsc::channel::new(1); - //~^ ERROR `channel` in `mpsc` is a concrete value, not a module or Struct you specified + //~^ ERROR expected type, found function `channel` in `mpsc` } diff --git a/src/test/ui/issues/issue-71406.stderr b/src/test/ui/issues/issue-71406.stderr index 22a2ca4f3e2..918163b6094 100644 --- a/src/test/ui/issues/issue-71406.stderr +++ b/src/test/ui/issues/issue-71406.stderr @@ -1,8 +1,8 @@ -error[E0433]: failed to resolve: `channel` in `mpsc` is a concrete value, not a module or Struct you specified +error[E0433]: failed to resolve: expected type, found function `channel` in `mpsc` --> $DIR/issue-71406.rs:4:26 | LL | let (tx, rx) = mpsc::channel::new(1); - | ^^^^^^^ `channel` in `mpsc` is a concrete value, not a module or Struct you specified + | ^^^^^^^ expected type, found function `channel` in `mpsc` error: aborting due to previous error |
