Skip to content

Commit 4e3b715

Browse files
committed
If the parent dependency is private, treat dependents as private
Currently, marking a dependency private does not automatically make all its child dependencies private. Resolve this by making its children private by default as well. This also resolves some FIXMEs for tests that are intended to fail but previously passed. [1]: rust-lang#135501 (comment)
1 parent 53f6a05 commit 4e3b715

File tree

5 files changed

+49
-13
lines changed

5 files changed

+49
-13
lines changed

compiler/rustc_metadata/src/creader.rs

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,8 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
456456
&crate_paths
457457
};
458458

459-
let cnum_map = self.resolve_crate_deps(dep_root, &crate_root, &metadata, cnum, dep_kind)?;
459+
let cnum_map =
460+
self.resolve_crate_deps(dep_root, &crate_root, &metadata, cnum, dep_kind, private_dep)?;
460461

461462
let raw_proc_macros = if crate_root.is_proc_macro_crate() {
462463
let temp_root;
@@ -559,15 +560,16 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
559560
dep_kind: CrateDepKind,
560561
) -> Option<CrateNum> {
561562
self.used_extern_options.insert(name);
562-
match self.maybe_resolve_crate(name, dep_kind, None) {
563+
match self.maybe_resolve_crate(name, dep_kind, None, false) {
563564
Ok(cnum) => {
564565
self.cstore.set_used_recursively(cnum);
565566
Some(cnum)
566567
}
567568
Err(err) => {
568569
debug!("failed to resolve crate {} {:?}", name, dep_kind);
569-
let missing_core =
570-
self.maybe_resolve_crate(sym::core, CrateDepKind::Explicit, None).is_err();
570+
let missing_core = self
571+
.maybe_resolve_crate(sym::core, CrateDepKind::Explicit, None, false)
572+
.is_err();
571573
err.report(self.sess, span, missing_core);
572574
None
573575
}
@@ -579,6 +581,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
579581
name: Symbol,
580582
mut dep_kind: CrateDepKind,
581583
dep_of: Option<(&'b CratePaths, &'b CrateDep)>,
584+
parent_is_private: bool,
582585
) -> Result<CrateNum, CrateError> {
583586
info!("resolving crate `{}`", name);
584587
if !name.as_str().is_ascii() {
@@ -591,7 +594,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
591594
let host_hash = dep.map(|d| d.host_hash).flatten();
592595
let extra_filename = dep.map(|d| &d.extra_filename[..]);
593596
let path_kind = if dep.is_some() { PathKind::Dependency } else { PathKind::Crate };
594-
let private_dep = dep.map(|d| d.is_private);
597+
let private_dep = dep.map(|d| d.is_private || parent_is_private);
595598

596599
let result = if let Some(cnum) = self.existing_match(name, hash, path_kind) {
597600
(LoadResult::Previous(cnum), None)
@@ -688,6 +691,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
688691
metadata: &MetadataBlob,
689692
krate: CrateNum,
690693
dep_kind: CrateDepKind,
694+
parent_is_private: bool,
691695
) -> Result<CrateNumMap, CrateError> {
692696
debug!(
693697
"resolving deps of external crate `{}` with dep root `{}`",
@@ -706,17 +710,23 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
706710
crate_num_map.push(krate);
707711
for dep in deps {
708712
info!(
709-
"resolving dep `{}`->`{}` hash: `{}` extra filename: `{}`",
713+
"resolving dep `{}`->`{}` hash: `{}` extra filename: `{}` private {}",
710714
crate_root.name(),
711715
dep.name,
712716
dep.hash,
713-
dep.extra_filename
717+
dep.extra_filename,
718+
dep.is_private,
714719
);
715720
let dep_kind = match dep_kind {
716721
CrateDepKind::MacrosOnly => CrateDepKind::MacrosOnly,
717722
_ => dep.kind,
718723
};
719-
let cnum = self.maybe_resolve_crate(dep.name, dep_kind, Some((dep_root, &dep)))?;
724+
let cnum = self.maybe_resolve_crate(
725+
dep.name,
726+
dep_kind,
727+
Some((dep_root, &dep)),
728+
parent_is_private,
729+
)?;
720730
crate_num_map.push(cnum);
721731
}
722732

@@ -1133,7 +1143,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
11331143
}
11341144

11351145
pub fn maybe_process_path_extern(&mut self, name: Symbol) -> Option<CrateNum> {
1136-
self.maybe_resolve_crate(name, CrateDepKind::Explicit, None).ok()
1146+
self.maybe_resolve_crate(name, CrateDepKind::Explicit, None, false).ok()
11371147
}
11381148
}
11391149

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
//@ aux-crate:priv:reexport=reexport.rs
22
//@ compile-flags: -Zunstable-options
3-
//@ check-pass
43

54
// Checks the behavior of a reexported item from a private dependency.
65

@@ -9,7 +8,7 @@
98

109
extern crate reexport;
1110

12-
// FIXME: This should trigger.
1311
pub fn leaks_priv() -> reexport::Shared {
12+
//~^ ERROR type `Shared` from private dependency 'shared' in public interface
1413
reexport::Shared
1514
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
error: type `Shared` from private dependency 'shared' in public interface
2+
--> $DIR/reexport_from_priv.rs:11:1
3+
|
4+
LL | pub fn leaks_priv() -> reexport::Shared {
5+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
6+
|
7+
note: the lint level is defined here
8+
--> $DIR/reexport_from_priv.rs:7:9
9+
|
10+
LL | #![deny(exported_private_dependencies)]
11+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
12+
13+
error: aborting due to 1 previous error
14+

tests/ui/privacy/pub-priv-dep/shared_indirect.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
//@ aux-crate:priv:shared=shared.rs
22
//@ aux-crate:priv:indirect1=indirect1.rs
33
//@ compile-flags: -Zunstable-options
4-
//@ check-pass
54

65
// A shared dependency, where it is only indirectly public.
76
//
@@ -23,7 +22,7 @@
2322
extern crate shared;
2423
extern crate indirect1;
2524

26-
// FIXME: This should trigger.
2725
pub fn leaks_priv() -> shared::Shared {
26+
//~^ ERROR type `Shared` from private dependency 'shared' in public interface
2827
shared::Shared
2928
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
error: type `Shared` from private dependency 'shared' in public interface
2+
--> $DIR/shared_indirect.rs:25:1
3+
|
4+
LL | pub fn leaks_priv() -> shared::Shared {
5+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
6+
|
7+
note: the lint level is defined here
8+
--> $DIR/shared_indirect.rs:20:9
9+
|
10+
LL | #![deny(exported_private_dependencies)]
11+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
12+
13+
error: aborting due to 1 previous error
14+

0 commit comments

Comments
 (0)