@@ -163,7 +163,10 @@ impl<'a> std::fmt::Debug for CrateDump<'a> {
163163enum CrateOrigin < ' a > {
164164 /// This crate was a dependency of another crate.
165165 Dependency {
166+ /// Where this dependency was included from.
166167 dep_root : & ' a CratePaths ,
168+ /// True if the parent is private, meaning the dependent should also be private.
169+ parent_private : bool ,
167170 /// Dependency info about this crate.
168171 dep : & ' a CrateDep ,
169172 } ,
@@ -193,6 +196,17 @@ impl<'a> CrateOrigin<'a> {
193196 _ => None ,
194197 }
195198 }
199+
200+ /// `Some(true)` if the dependency is private or its parent is private, `Some(false)` if the
201+ /// dependency is not private, `None` if it could not be determined.
202+ fn private_dep ( & self ) -> Option < bool > {
203+ match self {
204+ CrateOrigin :: Dependency { parent_private, dep, .. } => {
205+ Some ( dep. is_private || * parent_private)
206+ }
207+ _ => None ,
208+ }
209+ }
196210}
197211
198212impl CStore {
@@ -497,7 +511,8 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
497511 & crate_paths
498512 } ;
499513
500- let cnum_map = self . resolve_crate_deps ( dep_root, & crate_root, & metadata, cnum, dep_kind) ?;
514+ let cnum_map =
515+ self . resolve_crate_deps ( dep_root, & crate_root, & metadata, cnum, dep_kind, private_dep) ?;
501516
502517 let raw_proc_macros = if crate_root. is_proc_macro_crate ( ) {
503518 let temp_root;
@@ -638,7 +653,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
638653 let host_hash = dep. map ( |d| d. host_hash ) . flatten ( ) ;
639654 let extra_filename = dep. map ( |d| & d. extra_filename [ ..] ) ;
640655 let path_kind = if dep. is_some ( ) { PathKind :: Dependency } else { PathKind :: Crate } ;
641- let private_dep = dep . map ( |d| d . is_private ) ;
656+ let private_dep = origin . private_dep ( ) ;
642657
643658 let result = if let Some ( cnum) = self . existing_match ( name, hash, path_kind) {
644659 ( LoadResult :: Previous ( cnum) , None )
@@ -735,6 +750,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
735750 metadata : & MetadataBlob ,
736751 krate : CrateNum ,
737752 dep_kind : CrateDepKind ,
753+ parent_is_private : bool ,
738754 ) -> Result < CrateNumMap , CrateError > {
739755 debug ! (
740756 "resolving deps of external crate `{}` with dep root `{}`" ,
@@ -753,18 +769,20 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
753769 crate_num_map. push ( krate) ;
754770 for dep in deps {
755771 info ! (
756- "resolving dep `{}`->`{}` hash: `{}` extra filename: `{}`" ,
772+ "resolving dep `{}`->`{}` hash: `{}` extra filename: `{}` private {} " ,
757773 crate_root. name( ) ,
758774 dep. name,
759775 dep. hash,
760- dep. extra_filename
776+ dep. extra_filename,
777+ dep. is_private,
761778 ) ;
762779 let dep_kind = match dep_kind {
763780 CrateDepKind :: MacrosOnly => CrateDepKind :: MacrosOnly ,
764781 _ => dep. kind ,
765782 } ;
766783 let cnum = self . maybe_resolve_crate ( dep. name , dep_kind, CrateOrigin :: Dependency {
767784 dep_root,
785+ parent_private : parent_is_private,
768786 dep : & dep,
769787 } ) ?;
770788 crate_num_map. push ( cnum) ;
0 commit comments