Skip to content

Commit f8d6dcf

Browse files
committed
Warn when reexporting a private extern crate
1 parent 3358fb1 commit f8d6dcf

File tree

5 files changed

+24
-13
lines changed

5 files changed

+24
-13
lines changed

src/librustc/lib.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ extern crate getopts;
5151
extern crate graphviz;
5252
extern crate libc;
5353
extern crate rbml;
54-
extern crate rustc_llvm;
54+
pub extern crate rustc_llvm as llvm;
5555
extern crate rustc_back;
5656
extern crate rustc_front;
5757
extern crate rustc_data_structures;
@@ -66,8 +66,6 @@ extern crate serialize as rustc_serialize; // used by deriving
6666
#[cfg(test)]
6767
extern crate test;
6868

69-
pub use rustc_llvm as llvm;
70-
7169
#[macro_use]
7270
mod macros;
7371

src/librustc_resolve/resolve_imports.rs

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -402,14 +402,23 @@ impl<'a, 'b:'a, 'tcx:'b> ImportResolver<'a, 'b, 'tcx> {
402402
}
403403

404404
(_, &Success(name_binding)) if !name_binding.is_import() && directive.is_public => {
405-
// Disallow reexporting private items, excepting extern crates.
406-
if !name_binding.is_public() && !name_binding.is_extern_crate() {
407-
let msg = format!("`{}` is private, and cannot be reexported", source);
408-
let note_msg =
409-
format!("Consider declaring type or module `{}` with `pub`", source);
410-
struct_span_err!(self.resolver.session, directive.span, E0365, "{}", &msg)
411-
.span_note(directive.span, &note_msg)
412-
.emit();
405+
if !name_binding.is_public() {
406+
if name_binding.is_extern_crate() {
407+
let msg = format!("extern crate `{}` is private, and cannot be reexported \
408+
(error E0364), consider declaring with `pub`",
409+
source);
410+
self.resolver.session.add_lint(lint::builtin::PRIVATE_IN_PUBLIC,
411+
directive.id,
412+
directive.span,
413+
msg);
414+
} else {
415+
let msg = format!("`{}` is private, and cannot be reexported", source);
416+
let note_msg =
417+
format!("Consider declaring type or module `{}` with `pub`", source);
418+
struct_span_err!(self.resolver.session, directive.span, E0365, "{}", &msg)
419+
.span_note(directive.span, &note_msg)
420+
.emit();
421+
}
413422
} else if name_binding.defined_with(DefModifiers::PRIVATE_VARIANT) {
414423
let msg = format!("variant `{}` is private, and cannot be reexported \
415424
(error E0364), consider declaring its enum as `pub`",

src/librustc_trans/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ extern crate rustc;
4646
extern crate rustc_back;
4747
extern crate rustc_data_structures;
4848
extern crate rustc_front;
49-
extern crate rustc_llvm as llvm;
49+
pub extern crate rustc_llvm as llvm;
5050
extern crate rustc_mir;
5151
extern crate rustc_platform_intrinsics as intrinsics;
5252
extern crate serialize;

src/libstd/sys/unix/net.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use sys_common::net::{getsockopt, setsockopt};
2121
use time::Duration;
2222

2323
pub use sys::{cvt, cvt_r};
24-
pub use libc as netc;
24+
pub extern crate libc as netc;
2525

2626
pub type wrlen_t = size_t;
2727

src/test/compile-fail/private-variant-reexport.rs renamed to src/test/compile-fail/private-variant-and-crate-reexport.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111
#![feature(rustc_attrs)]
1212
#![allow(dead_code)]
1313

14+
extern crate core;
15+
pub use core as reexported_core; //~ WARN extern crate `core` is private, and cannot be reexported
16+
//~^ WARNING hard error
17+
1418
mod m1 {
1519
pub use ::E::V; //~ WARN variant `V` is private, and cannot be reexported
1620
//~^ WARNING hard error

0 commit comments

Comments
 (0)