From f8d6dcf46ec646a41d0dc222764cc0ed026ceb03 Mon Sep 17 00:00:00 2001 From: Jeffrey Seyfried Date: Tue, 2 Feb 2016 09:39:59 +0000 Subject: [PATCH] Warn when reexporting a private extern crate --- src/librustc/lib.rs | 4 +-- src/librustc_resolve/resolve_imports.rs | 25 +++++++++++++------ src/librustc_trans/lib.rs | 2 +- src/libstd/sys/unix/net.rs | 2 +- ... => private-variant-and-crate-reexport.rs} | 4 +++ 5 files changed, 24 insertions(+), 13 deletions(-) rename src/test/compile-fail/{private-variant-reexport.rs => private-variant-and-crate-reexport.rs} (88%) diff --git a/src/librustc/lib.rs b/src/librustc/lib.rs index 53fd867e7fd4..bd256d19b672 100644 --- a/src/librustc/lib.rs +++ b/src/librustc/lib.rs @@ -51,7 +51,7 @@ extern crate graphviz; extern crate libc; extern crate rbml; -extern crate rustc_llvm; +pub extern crate rustc_llvm as llvm; extern crate rustc_back; extern crate rustc_front; extern crate rustc_data_structures; @@ -66,8 +66,6 @@ #[cfg(test)] extern crate test; -pub use rustc_llvm as llvm; - #[macro_use] mod macros; diff --git a/src/librustc_resolve/resolve_imports.rs b/src/librustc_resolve/resolve_imports.rs index 4cefffce777f..4776c83b94cf 100644 --- a/src/librustc_resolve/resolve_imports.rs +++ b/src/librustc_resolve/resolve_imports.rs @@ -402,14 +402,23 @@ fn resolve_single_import(&mut self, } (_, &Success(name_binding)) if !name_binding.is_import() && directive.is_public => { - // Disallow reexporting private items, excepting extern crates. - if !name_binding.is_public() && !name_binding.is_extern_crate() { - let msg = format!("`{}` is private, and cannot be reexported", source); - let note_msg = - format!("Consider declaring type or module `{}` with `pub`", source); - struct_span_err!(self.resolver.session, directive.span, E0365, "{}", &msg) - .span_note(directive.span, ¬e_msg) - .emit(); + if !name_binding.is_public() { + if name_binding.is_extern_crate() { + let msg = format!("extern crate `{}` is private, and cannot be reexported \ + (error E0364), consider declaring with `pub`", + source); + self.resolver.session.add_lint(lint::builtin::PRIVATE_IN_PUBLIC, + directive.id, + directive.span, + msg); + } else { + let msg = format!("`{}` is private, and cannot be reexported", source); + let note_msg = + format!("Consider declaring type or module `{}` with `pub`", source); + struct_span_err!(self.resolver.session, directive.span, E0365, "{}", &msg) + .span_note(directive.span, ¬e_msg) + .emit(); + } } else if name_binding.defined_with(DefModifiers::PRIVATE_VARIANT) { let msg = format!("variant `{}` is private, and cannot be reexported \ (error E0364), consider declaring its enum as `pub`", diff --git a/src/librustc_trans/lib.rs b/src/librustc_trans/lib.rs index 27d6dbae28a6..6f596b15b921 100644 --- a/src/librustc_trans/lib.rs +++ b/src/librustc_trans/lib.rs @@ -46,7 +46,7 @@ extern crate rustc_back; extern crate rustc_data_structures; extern crate rustc_front; -extern crate rustc_llvm as llvm; +pub extern crate rustc_llvm as llvm; extern crate rustc_mir; extern crate rustc_platform_intrinsics as intrinsics; extern crate serialize; diff --git a/src/libstd/sys/unix/net.rs b/src/libstd/sys/unix/net.rs index 507cc0f4ea46..16c369674f0a 100644 --- a/src/libstd/sys/unix/net.rs +++ b/src/libstd/sys/unix/net.rs @@ -21,7 +21,7 @@ use time::Duration; pub use sys::{cvt, cvt_r}; -pub use libc as netc; +pub extern crate libc as netc; pub type wrlen_t = size_t; diff --git a/src/test/compile-fail/private-variant-reexport.rs b/src/test/compile-fail/private-variant-and-crate-reexport.rs similarity index 88% rename from src/test/compile-fail/private-variant-reexport.rs rename to src/test/compile-fail/private-variant-and-crate-reexport.rs index 06f08dc13c6b..5811d82681e6 100644 --- a/src/test/compile-fail/private-variant-reexport.rs +++ b/src/test/compile-fail/private-variant-and-crate-reexport.rs @@ -11,6 +11,10 @@ #![feature(rustc_attrs)] #![allow(dead_code)] +extern crate core; +pub use core as reexported_core; //~ WARN extern crate `core` is private, and cannot be reexported +//~^ WARNING hard error + mod m1 { pub use ::E::V; //~ WARN variant `V` is private, and cannot be reexported //~^ WARNING hard error