From eb8a7031ef1ecd9b44a929f0b93f0e41c78fda25 Mon Sep 17 00:00:00 2001 From: YI Date: Sun, 26 Apr 2020 10:28:33 +0800 Subject: [PATCH] use defkind.descr in wrong namespace resolve failure --- src/librustc_resolve/lib.rs | 39 ++++++++++++++------------- src/test/ui/issues/issue-71406.rs | 2 +- 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 71fb8147793a8..2d53b7553a156 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::::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 e3de30f92896e..6266112c3a86c 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 22a2ca4f3e233..918163b609473 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