From 0c22cd79066f59500eae430abb26b9738d105b99 Mon Sep 17 00:00:00 2001 From: Nick Hamann Date: Tue, 16 Jun 2015 16:53:37 -0500 Subject: [PATCH] Fix error message for E0256 in certain cases. Previously, it said "import `Foo` conflicts with existing submodule" even when it was a type alias, enum, or trait. The message now says the conflict is with "type in this module" in the case of the first two, and "trait in this module" for the last one. Fixes #24081. --- src/librustc_resolve/resolve_imports.rs | 13 +++++++++---- src/test/compile-fail/issue-24081.rs | 23 +++++++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 src/test/compile-fail/issue-24081.rs 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() {}