about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>2015-09-16 00:50:50 +0300
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>2015-09-17 14:13:14 +0300
commitc3f53d1b12dfe5e08f98b19e9e3980da116e31ee (patch)
tree9610c3eba35abadd54f0511e95b42bd89e11d1ce
parent357982fae4ac7be0f6e0065399606f2d78618aaf (diff)
downloadrust-c3f53d1b12dfe5e08f98b19e9e3980da116e31ee.tar.gz
rust-c3f53d1b12dfe5e08f98b19e9e3980da116e31ee.zip
Resolve prefix in imports with empty braces
-rw-r--r--src/librustc_front/visit.rs3
-rw-r--r--src/librustc_resolve/lib.rs28
-rw-r--r--src/libsyntax/visit.rs3
-rw-r--r--src/test/compile-fail/issue-28388-1.rs15
-rw-r--r--src/test/compile-fail/issue-28388-2.rs19
-rw-r--r--src/test/compile-fail/issue-28388-3.rs16
6 files changed, 74 insertions, 10 deletions
diff --git a/src/librustc_front/visit.rs b/src/librustc_front/visit.rs
index 12a20a8d21f..8f5208d3ef1 100644
--- a/src/librustc_front/visit.rs
+++ b/src/librustc_front/visit.rs
@@ -218,8 +218,7 @@ pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item) {
                             visitor.visit_path_list_item(prefix, item)
                         }
                     } else {
-                        // FIXME(#28388) visit_path should be used instead of walk_path
-                        walk_path(visitor, prefix);
+                        visitor.visit_path(prefix, item.id);
                     }
                 }
             }
diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs
index 8e34118957e..6159ba5b79e 100644
--- a/src/librustc_resolve/lib.rs
+++ b/src/librustc_resolve/lib.rs
@@ -2210,10 +2210,10 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
 
             ItemUse(ref view_path) => {
                 // check for imports shadowing primitive types
-                let check_rename = |id, ident: Ident| {
-                    match self.def_map.borrow().get(&id).map(|d| d.full_def()) {
+                let check_rename = |this: &Self, id, ident: Ident| {
+                    match this.def_map.borrow().get(&id).map(|d| d.full_def()) {
                         Some(DefTy(..)) | Some(DefStruct(..)) | Some(DefTrait(..)) | None => {
-                            self.check_if_primitive_type_name(ident.name, item.span);
+                            this.check_if_primitive_type_name(ident.name, item.span);
                         }
                         _ => {}
                     }
@@ -2221,12 +2221,28 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
 
                 match view_path.node {
                     hir::ViewPathSimple(ident, _) => {
-                        check_rename(item.id, ident);
+                        check_rename(self, item.id, ident);
                     }
-                    hir::ViewPathList(_, ref items) => {
+                    hir::ViewPathList(ref prefix, ref items) => {
                         for item in items {
                             if let Some(ident) = item.node.rename() {
-                                check_rename(item.node.id(), ident);
+                                check_rename(self, item.node.id(), ident);
+                            }
+                        }
+
+                        // Resolve prefix of an import with empty braces (issue #28388)
+                        if items.is_empty() && !prefix.segments.is_empty() {
+                            match self.resolve_crate_relative_path(prefix.span,
+                                                                   &prefix.segments,
+                                                                   TypeNS) {
+                                Some((def, lp)) => self.record_def(item.id,
+                                                   PathResolution::new(def, lp, 0)),
+                                None => {
+                                    resolve_error(self,
+                                                  prefix.span,
+                                                  ResolutionError::FailedToResolve(
+                                                      &path_names_to_string(prefix, 0)));
+                                }
                             }
                         }
                     }
diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs
index cda750c5cda..f4f4c9dfc24 100644
--- a/src/libsyntax/visit.rs
+++ b/src/libsyntax/visit.rs
@@ -224,8 +224,7 @@ pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item) {
                             visitor.visit_path_list_item(prefix, item)
                         }
                     } else {
-                        // FIXME(#28388) visit_path should be used instead of walk_path
-                        walk_path(visitor, prefix);
+                        visitor.visit_path(prefix, item.id);
                     }
                 }
             }
diff --git a/src/test/compile-fail/issue-28388-1.rs b/src/test/compile-fail/issue-28388-1.rs
new file mode 100644
index 00000000000..ef97b400b00
--- /dev/null
+++ b/src/test/compile-fail/issue-28388-1.rs
@@ -0,0 +1,15 @@
+// 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.
+
+// Prefix in imports with empty braces should be resolved and checked privacy, stability, etc.
+
+use foo::{}; //~ ERROR failed to resolve. foo
+
+fn main() {}
diff --git a/src/test/compile-fail/issue-28388-2.rs b/src/test/compile-fail/issue-28388-2.rs
new file mode 100644
index 00000000000..837dc67c804
--- /dev/null
+++ b/src/test/compile-fail/issue-28388-2.rs
@@ -0,0 +1,19 @@
+// 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.
+
+// Prefix in imports with empty braces should be resolved and checked privacy, stability, etc.
+
+mod m {
+    mod n {}
+}
+
+use m::n::{}; //~ ERROR module `n` is private
+
+fn main() {}
diff --git a/src/test/compile-fail/issue-28388-3.rs b/src/test/compile-fail/issue-28388-3.rs
new file mode 100644
index 00000000000..59756be55bd
--- /dev/null
+++ b/src/test/compile-fail/issue-28388-3.rs
@@ -0,0 +1,16 @@
+// 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.
+
+// Prefix in imports with empty braces should be resolved and checked privacy, stability, etc.
+
+use std::rt::{}; //~ ERROR use of unstable library feature 'rt'
+use std::{}; // OK
+
+fn main() {}