From c3f53d1b12dfe5e08f98b19e9e3980da116e31ee Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Wed, 16 Sep 2015 00:50:50 +0300 Subject: [PATCH] Resolve prefix in imports with empty braces --- src/librustc_front/visit.rs | 3 +-- src/librustc_resolve/lib.rs | 28 ++++++++++++++++++++------ src/libsyntax/visit.rs | 3 +-- src/test/compile-fail/issue-28388-1.rs | 15 ++++++++++++++ src/test/compile-fail/issue-28388-2.rs | 19 +++++++++++++++++ src/test/compile-fail/issue-28388-3.rs | 16 +++++++++++++++ 6 files changed, 74 insertions(+), 10 deletions(-) create mode 100644 src/test/compile-fail/issue-28388-1.rs create mode 100644 src/test/compile-fail/issue-28388-2.rs create mode 100644 src/test/compile-fail/issue-28388-3.rs diff --git a/src/librustc_front/visit.rs b/src/librustc_front/visit.rs index 12a20a8d21f49..8f5208d3ef119 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 8e34118957ebd..6159ba5b79e0e 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 cda750c5cda7e..f4f4c9dfc24fb 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 0000000000000..ef97b400b00a5 --- /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 or the MIT license +// , 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 0000000000000..837dc67c804eb --- /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 or the MIT license +// , 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 0000000000000..59756be55bd62 --- /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 or the MIT license +// , 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() {}