diff options
| author | Nick Hamann <nick@wabbo.org> | 2015-06-16 16:53:37 -0500 |
|---|---|---|
| committer | Nick Hamann <nick@wabbo.org> | 2015-06-16 18:55:52 -0500 |
| commit | 0c22cd79066f59500eae430abb26b9738d105b99 (patch) | |
| tree | d36f7bffa55f5c99edd5980051bbae6d28bdc09a | |
| parent | f6d53af85f600731bbf100147be69b18391ae784 (diff) | |
| download | rust-0c22cd79066f59500eae430abb26b9738d105b99.tar.gz rust-0c22cd79066f59500eae430abb26b9738d105b99.zip | |
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.
| -rw-r--r-- | src/librustc_resolve/resolve_imports.rs | 13 | ||||
| -rw-r--r-- | src/test/compile-fail/issue-24081.rs | 23 |
2 files changed, 32 insertions, 4 deletions
diff --git a/src/librustc_resolve/resolve_imports.rs b/src/librustc_resolve/resolve_imports.rs index 71a63e24faf..2edbf6441ba 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 00000000000..11376cec14e --- /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 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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() {} |
