diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs index b958bdce0a7e8..f1a75f996b092 100644 --- a/src/librustc/middle/resolve.rs +++ b/src/librustc/middle/resolve.rs @@ -2654,10 +2654,34 @@ impl<'a> Resolver<'a> { } Some(_) => { - // The import is unresolved. Bail out. - debug!("(resolving single import) unresolved import; \ - bailing out"); - return Indeterminate; + // If containing_module is the same module whose import we are resolving + // and there it has an unresolved import with the same name as `source`, + // then the user is actually trying to import an item that is declared + // in the same scope + // + // e.g + // use self::submodule; + // pub mod submodule; + // + // In this case we continue as if we resolved the import and let the + // check_for_conflicts_between_imports_and_items call below handle + // the conflict + match (module_.def_id.get(), containing_module.def_id.get()) { + (Some(id1), Some(id2)) if id1 == id2 => { + if value_result.is_unknown() { + value_result = UnboundResult; + } + if type_result.is_unknown() { + type_result = UnboundResult; + } + } + _ => { + // The import is unresolved. Bail out. + debug!("(resolving single import) unresolved import; \ + bailing out"); + return Indeterminate; + } + } } } } @@ -3018,7 +3042,7 @@ impl<'a> Resolver<'a> { fn check_for_conflicts_between_imports_and_items(&mut self, module: &Module, import_resolution: - &mut ImportResolution, + &ImportResolution, import_span: Span, name: Name) { if self.session.features.borrow().import_shadowing { @@ -3031,8 +3055,9 @@ impl<'a> Resolver<'a> { .contains_key(&name) { match import_resolution.type_target { Some(ref target) if !target.shadowable => { - let msg = format!("import `{}` conflicts with imported \ - crate in this module", + let msg = format!("import `{0}` conflicts with imported \ + crate in this module \ + (maybe you meant `use {0}::*`?)", token::get_name(name).get()); self.session.span_err(import_span, msg.as_slice()); } diff --git a/src/test/compile-fail/issue-19498.rs b/src/test/compile-fail/issue-19498.rs new file mode 100644 index 0000000000000..02b9c42b65b9a --- /dev/null +++ b/src/test/compile-fail/issue-19498.rs @@ -0,0 +1,21 @@ +// Copyright 2013 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 self::A; //~ ERROR import `A` conflicts with existing submodule +use self::B; //~ ERROR import `B` conflicts with existing submodule +mod A {} +pub mod B {} + +mod C { + use C::D; //~ ERROR import `D` conflicts with existing submodule + mod D {} +} + +fn main() {} diff --git a/src/test/compile-fail/unresolved-extern-mod-suggestion.rs b/src/test/compile-fail/unresolved-extern-mod-suggestion.rs index 33d3deb8733d5..c2ee62c195cb0 100644 --- a/src/test/compile-fail/unresolved-extern-mod-suggestion.rs +++ b/src/test/compile-fail/unresolved-extern-mod-suggestion.rs @@ -9,6 +9,7 @@ // except according to those terms. extern crate core; -use core; //~ ERROR unresolved import (maybe you meant `core::*`?) +use core; +//~^ ERROR import `core` conflicts with imported crate in this module fn main() {}