diff --git a/src/librustc_resolve/resolve_imports.rs b/src/librustc_resolve/resolve_imports.rs index 71a63e24faf7c..2edbf6441ba71 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}; @@ -980,10 +981,14 @@ impl<'a, 'b:'a, 'tcx:'b> ImportResolver<'a, 'b, 'tcx> { match import_resolution.type_target { Some(ref target) if target.shadowable != Shadowable::Always => { if let Some(ref ty) = *name_bindings.type_def.borrow() { - let (what, note) = if ty.module_def.is_some() { - ("existing submodule", "note conflicting module here") - } else { - ("type in this module", "note conflicting type here") + let (what, note) = match ty.module_def { + Some(ref module) + if module.kind.get() == ModuleKind::NormalModuleKind => + ("existing submodule", "note conflicting module here"), + Some(ref module) + if module.kind.get() == ModuleKind::TraitModuleKind => + ("trait in this module", "note conflicting trait here"), + _ => ("type in this module", "note conflicting type here"), }; span_err!(self.resolver.session, import_span, E0256, "import `{}` conflicts with {}", diff --git a/src/test/compile-fail/issue-24081.rs b/src/test/compile-fail/issue-24081.rs new file mode 100644 index 0000000000000..11376cec14ee3 --- /dev/null +++ b/src/test/compile-fail/issue-24081.rs @@ -0,0 +1,23 @@ +// 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 std::ops::Add; //~ ERROR import `Add` conflicts with type in this module +use std::ops::Sub; //~ ERROR import `Sub` conflicts with type in this module +use std::ops::Mul; //~ ERROR import `Mul` conflicts with type in this module +use std::ops::Div; //~ ERROR import `Div` conflicts with existing submodule +use std::ops::Rem; //~ ERROR import `Rem` conflicts with trait in this module + +type Add = bool; +struct Sub { x: f32 } +enum Mul { A, B } +mod Div { } +trait Rem { } + +fn main() {}