diff --git a/src/librustc_resolve/resolve_imports.rs b/src/librustc_resolve/resolve_imports.rs index 71a63e24faf7c..57d0c98d50e99 100644 --- a/src/librustc_resolve/resolve_imports.rs +++ b/src/librustc_resolve/resolve_imports.rs @@ -12,6 +12,7 @@ use self::ImportDirectiveSubclass::*; use DefModifiers; use Module; +use ModuleKind; use Namespace::{self, TypeNS, ValueNS}; use NameBindings; use NamespaceResult::{BoundResult, UnboundResult, UnknownResult}; @@ -899,7 +900,19 @@ impl<'a, 'b:'a, 'tcx:'b> ImportResolver<'a, 'b, 'tcx> { match target { Some(ref target) if target.shadowable != Shadowable::Always => { let ns_word = match namespace { - TypeNS => "type", + TypeNS => { + if let Some(ref ty_def) = *target.bindings.type_def.borrow() { + match ty_def.module_def { + Some(ref module) + if module.kind.get() == ModuleKind::NormalModuleKind => + "module", + Some(ref module) + if module.kind.get() == ModuleKind::TraitModuleKind => + "trait", + _ => "type", + } + } else { "type" } + }, ValueNS => "value", }; span_err!(self.resolver.session, import_span, E0252, diff --git a/src/test/compile-fail/issue-25396.rs b/src/test/compile-fail/issue-25396.rs new file mode 100644 index 0000000000000..3ada57c999305 --- /dev/null +++ b/src/test/compile-fail/issue-25396.rs @@ -0,0 +1,37 @@ +// Copyright 2015 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use foo::baz; +use bar::baz; //~ ERROR a module named `baz` has already been imported + +use foo::Quux; +use bar::Quux; //~ ERROR a trait named `Quux` has already been imported + +use foo::blah; +use bar::blah; //~ ERROR a type named `blah` has already been imported + +use foo::WOMP; +use bar::WOMP; //~ ERROR a value named `WOMP` has already been imported + +fn main() {} + +mod foo { + pub mod baz {} + pub trait Quux { } + pub type blah = (f64, u32); + pub const WOMP: u8 = 5; +} + +mod bar { + pub mod baz {} + pub type Quux = i32; + struct blah { x: i8 } + pub const WOMP: i8 = -5; +}