From ad28c28f469750c062ebf9907f8416f4ccb1ddda Mon Sep 17 00:00:00 2001 From: Jeffrey Seyfried Date: Tue, 8 Mar 2016 21:50:01 +0000 Subject: [PATCH 1/3] Stop treating a type alias like a module or enum (preventing `use TypeAlias::*`) --- src/librustc_resolve/build_reduced_graph.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/librustc_resolve/build_reduced_graph.rs b/src/librustc_resolve/build_reduced_graph.rs index b3d7be4775e42..e1eead8547e82 100644 --- a/src/librustc_resolve/build_reduced_graph.rs +++ b/src/librustc_resolve/build_reduced_graph.rs @@ -331,10 +331,8 @@ impl<'a, 'b:'a, 'tcx:'b> GraphBuilder<'a, 'b, 'tcx> { // These items live in the type namespace. ItemTy(..) => { - let parent_link = ModuleParentLink(parent, name); let def = Def::TyAlias(self.ast_map.local_def_id(item.id)); - let module = self.new_module(parent_link, Some(def), false, is_public); - self.define(parent, name, TypeNS, (module, sp)); + self.define(parent, name, TypeNS, (def, sp, modifiers)); parent } @@ -505,7 +503,7 @@ impl<'a, 'b:'a, 'tcx:'b> GraphBuilder<'a, 'b, 'tcx> { } match def { - Def::Mod(_) | Def::ForeignMod(_) | Def::Enum(..) | Def::TyAlias(..) => { + Def::Mod(_) | Def::ForeignMod(_) | Def::Enum(..) => { debug!("(building reduced graph for external crate) building module {} {}", final_ident, is_public); @@ -562,7 +560,7 @@ impl<'a, 'b:'a, 'tcx:'b> GraphBuilder<'a, 'b, 'tcx> { let module = self.new_module(parent_link, Some(def), true, is_public); self.try_define(new_parent, name, TypeNS, (module, DUMMY_SP)); } - Def::AssociatedTy(..) => { + Def::TyAlias(..) | Def::AssociatedTy(..) => { debug!("(building reduced graph for external crate) building type {}", final_ident); self.try_define(new_parent, name, TypeNS, (def, DUMMY_SP, modifiers)); From e2171bff7508a76b6c34b2bd9214c19808a3cbaf Mon Sep 17 00:00:00 2001 From: Jeffrey Seyfried Date: Tue, 8 Mar 2016 21:54:46 +0000 Subject: [PATCH 2/3] Add regression test --- src/test/compile-fail/issue-30560.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/test/compile-fail/issue-30560.rs diff --git a/src/test/compile-fail/issue-30560.rs b/src/test/compile-fail/issue-30560.rs new file mode 100644 index 0000000000000..6109922502b92 --- /dev/null +++ b/src/test/compile-fail/issue-30560.rs @@ -0,0 +1,15 @@ +// Copyright 2016 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. + +type Alias = (); +use Alias::*; //~ ERROR Not a module +use std::io::Result::*; //~ ERROR Not a module + +fn main() {} From 1a6092e05cecdaef984b2b0174089e6ae8c24181 Mon Sep 17 00:00:00 2001 From: Jeffrey Seyfried Date: Tue, 8 Mar 2016 22:27:12 +0000 Subject: [PATCH 3/3] Forbid `use Trait::*` --- src/librustc_resolve/resolve_imports.rs | 4 ++++ src/test/compile-fail/issue-30560.rs | 3 +++ 2 files changed, 7 insertions(+) diff --git a/src/librustc_resolve/resolve_imports.rs b/src/librustc_resolve/resolve_imports.rs index f1f47381e4c81..e604107f338ae 100644 --- a/src/librustc_resolve/resolve_imports.rs +++ b/src/librustc_resolve/resolve_imports.rs @@ -586,6 +586,10 @@ impl<'a, 'b:'a, 'tcx:'b> ImportResolver<'a, 'b, 'tcx> { target_module: Module<'b>, directive: &'b ImportDirective) -> ResolveResult<()> { + if let Some(Def::Trait(_)) = target_module.def { + self.resolver.session.span_err(directive.span, "items in traits are not importable."); + } + if module_.def_id() == target_module.def_id() { // This means we are trying to glob import a module into itself, and it is a no-go let msg = "Cannot glob-import a module into itself.".into(); diff --git a/src/test/compile-fail/issue-30560.rs b/src/test/compile-fail/issue-30560.rs index 6109922502b92..71c7e6009655b 100644 --- a/src/test/compile-fail/issue-30560.rs +++ b/src/test/compile-fail/issue-30560.rs @@ -12,4 +12,7 @@ type Alias = (); use Alias::*; //~ ERROR Not a module use std::io::Result::*; //~ ERROR Not a module +trait T {} +use T::*; //~ ERROR items in traits are not importable + fn main() {}