auto merge of #19522 : mukilan/rust/import-conflicts-item, r=cmr

Fixes #19498
This commit is contained in:
bors 2014-12-07 13:42:18 +00:00
commit a243e8820a
3 changed files with 55 additions and 8 deletions

View File

@ -2654,6 +2654,28 @@ impl<'a> Resolver<'a> {
}
Some(_) => {
// 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");
@ -2662,6 +2684,8 @@ impl<'a> Resolver<'a> {
}
}
}
}
}
// If we didn't find a result in the type namespace, search the
// external modules.
@ -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());
}

View File

@ -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 <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 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() {}

View File

@ -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() {}