about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2014-12-07 13:42:18 +0000
committerbors <bors@rust-lang.org>2014-12-07 13:42:18 +0000
commita243e8820a2bc61866e6d644f56c2f96096e17bb (patch)
tree91364f671707a7e542d19298f8f8cfff04202264 /src
parent1e835cc7e3828fb21dfa59c4974d535108c4b024 (diff)
parent4b75a5d8da6cc47fdf2a5a292889ac0a3f02e8b1 (diff)
downloadrust-a243e8820a2bc61866e6d644f56c2f96096e17bb.tar.gz
rust-a243e8820a2bc61866e6d644f56c2f96096e17bb.zip
auto merge of #19522 : mukilan/rust/import-conflicts-item, r=cmr
Fixes #19498
Diffstat (limited to 'src')
-rw-r--r--src/librustc/middle/resolve.rs39
-rw-r--r--src/test/compile-fail/issue-19498.rs21
-rw-r--r--src/test/compile-fail/unresolved-extern-mod-suggestion.rs3
3 files changed, 55 insertions, 8 deletions
diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs
index b958bdce0a7..f1a75f996b0 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 00000000000..02b9c42b65b
--- /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 <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() {}
diff --git a/src/test/compile-fail/unresolved-extern-mod-suggestion.rs b/src/test/compile-fail/unresolved-extern-mod-suggestion.rs
index 33d3deb8733..c2ee62c195c 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() {}