From f8d6dcf46ec646a41d0dc222764cc0ed026ceb03 Mon Sep 17 00:00:00 2001 From: Jeffrey Seyfried Date: Tue, 2 Feb 2016 09:39:59 +0000 Subject: 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 | 41 ++++++++++++++++++++++ src/test/compile-fail/private-variant-reexport.rs | 37 ------------------- 6 files changed, 61 insertions(+), 50 deletions(-) create mode 100644 src/test/compile-fail/private-variant-and-crate-reexport.rs delete mode 100644 src/test/compile-fail/private-variant-reexport.rs (limited to 'src') diff --git a/src/librustc/lib.rs b/src/librustc/lib.rs index 53fd867e7fd..bd256d19b67 100644 --- a/src/librustc/lib.rs +++ b/src/librustc/lib.rs @@ -51,7 +51,7 @@ extern crate getopts; 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 @@ extern crate serialize as rustc_serialize; // used by deriving #[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 4cefffce777..4776c83b94c 100644 --- a/src/librustc_resolve/resolve_imports.rs +++ b/src/librustc_resolve/resolve_imports.rs @@ -402,14 +402,23 @@ impl<'a, 'b:'a, 'tcx:'b> ImportResolver<'a, 'b, 'tcx> { } (_, &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 27d6dbae28a..6f596b15b92 100644 --- a/src/librustc_trans/lib.rs +++ b/src/librustc_trans/lib.rs @@ -46,7 +46,7 @@ extern crate rustc; 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 507cc0f4ea4..16c369674f0 100644 --- a/src/libstd/sys/unix/net.rs +++ b/src/libstd/sys/unix/net.rs @@ -21,7 +21,7 @@ use sys_common::net::{getsockopt, setsockopt}; 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-and-crate-reexport.rs b/src/test/compile-fail/private-variant-and-crate-reexport.rs new file mode 100644 index 00000000000..5811d82681e --- /dev/null +++ b/src/test/compile-fail/private-variant-and-crate-reexport.rs @@ -0,0 +1,41 @@ +// 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. + +#![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 +} + +mod m2 { + pub use ::E::{V}; //~ WARN variant `V` is private, and cannot be reexported + //~^ WARNING hard error +} + +mod m3 { + pub use ::E::V::{self}; //~ WARN variant `V` is private, and cannot be reexported + //~^ WARNING hard error +} + +mod m4 { + pub use ::E::*; //~ WARN variant `V` is private, and cannot be reexported + //~^ WARNING hard error +} + +enum E { V } + +#[rustc_error] +fn main() {} //~ ERROR compilation successful diff --git a/src/test/compile-fail/private-variant-reexport.rs b/src/test/compile-fail/private-variant-reexport.rs deleted file mode 100644 index 06f08dc13c6..00000000000 --- a/src/test/compile-fail/private-variant-reexport.rs +++ /dev/null @@ -1,37 +0,0 @@ -// 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. - -#![feature(rustc_attrs)] -#![allow(dead_code)] - -mod m1 { - pub use ::E::V; //~ WARN variant `V` is private, and cannot be reexported - //~^ WARNING hard error -} - -mod m2 { - pub use ::E::{V}; //~ WARN variant `V` is private, and cannot be reexported - //~^ WARNING hard error -} - -mod m3 { - pub use ::E::V::{self}; //~ WARN variant `V` is private, and cannot be reexported - //~^ WARNING hard error -} - -mod m4 { - pub use ::E::*; //~ WARN variant `V` is private, and cannot be reexported - //~^ WARNING hard error -} - -enum E { V } - -#[rustc_error] -fn main() {} //~ ERROR compilation successful -- cgit 1.4.1-3-g733a5