@@ -389,6 +389,15 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
389389 None
390390 }
391391
392+ // The `dependency` type is determined by the command line arguments(`--extern`) and
393+ // `private_dep`. However, sometimes the directly dependent crate is not specified by
394+ // `--extern`, in this case, `private-dep` is none during loading. This is equivalent to the
395+ // scenario where the command parameter is set to `public-dependency`
396+ fn is_private_dep ( & self , name : & str , private_dep : Option < bool > ) -> bool {
397+ self . sess . opts . externs . get ( name) . map_or ( private_dep. unwrap_or ( false ) , |e| e. is_private_dep )
398+ && private_dep. unwrap_or ( true )
399+ }
400+
392401 fn register_crate (
393402 & mut self ,
394403 host_lib : Option < Library > ,
@@ -404,14 +413,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
404413 let Library { source, metadata } = lib;
405414 let crate_root = metadata. get_root ( ) ;
406415 let host_hash = host_lib. as_ref ( ) . map ( |lib| lib. metadata . get_root ( ) . hash ( ) ) ;
407-
408- let private_dep = self
409- . sess
410- . opts
411- . externs
412- . get ( name. as_str ( ) )
413- . map_or ( private_dep. unwrap_or ( false ) , |e| e. is_private_dep )
414- && private_dep. unwrap_or ( true ) ;
416+ let private_dep = self . is_private_dep ( name. as_str ( ) , private_dep) ;
415417
416418 // Claim this crate number and cache it
417419 let cnum = self . cstore . intern_stable_crate_id ( & crate_root) ?;
@@ -601,14 +603,17 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
601603
602604 match result {
603605 ( LoadResult :: Previous ( cnum) , None ) => {
606+ // When `private_dep` is none, it indicates the directly dependent crate. If it is
607+ // not specified by `--extern` on command line parameters, it may be
608+ // `private-dependency` when `register_crate` is called for the first time. Then it must be updated to
609+ // `public-dependency` here.
610+ let private_dep = self . is_private_dep ( name. as_str ( ) , private_dep) ;
604611 let data = self . cstore . get_crate_data_mut ( cnum) ;
605612 if data. is_proc_macro_crate ( ) {
606613 dep_kind = CrateDepKind :: MacrosOnly ;
607614 }
608615 data. set_dep_kind ( cmp:: max ( data. dep_kind ( ) , dep_kind) ) ;
609- if let Some ( private_dep) = private_dep {
610- data. update_and_private_dep ( private_dep) ;
611- }
616+ data. update_and_private_dep ( private_dep) ;
612617 Ok ( cnum)
613618 }
614619 ( LoadResult :: Loaded ( library) , host_library) => {
0 commit comments