Skip to content

Commit 5354933

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. [1]: rust-lang#135501 (comment)
1 parent 7a6a6cd commit 5354933

File tree

1 file changed

+19
-9
lines changed

1 file changed

+19
-9
lines changed

compiler/rustc_metadata/src/creader.rs

+19-9
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

0 commit comments

Comments
 (0)