From 7403b0ceaa59918f490271ba9b394df4615bc60d Mon Sep 17 00:00:00 2001 From: Mukilan Thiyagarajan Date: Thu, 4 Dec 2014 18:51:44 +0530 Subject: [PATCH 1/2] Handle conflicting import of items declared in the same module Fixes #19498 --- src/librustc/middle/resolve.rs | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs index b958bdce0a7e8..17dff18c3c378 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 { From 4b75a5d8da6cc47fdf2a5a292889ac0a3f02e8b1 Mon Sep 17 00:00:00 2001 From: Mukilan Thiyagarajan Date: Sun, 7 Dec 2014 07:21:58 +0530 Subject: [PATCH 2/2] Add compile-fail tests for #19498 --- src/librustc/middle/resolve.rs | 5 +++-- src/test/compile-fail/issue-19498.rs | 21 +++++++++++++++++++ .../unresolved-extern-mod-suggestion.rs | 3 ++- 3 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 src/test/compile-fail/issue-19498.rs diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs index 17dff18c3c378..f1a75f996b092 100644 --- a/src/librustc/middle/resolve.rs +++ b/src/librustc/middle/resolve.rs @@ -3055,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() {}