@@ -162,6 +162,39 @@ impl<'a> std::fmt::Debug for CrateDump<'a> {
162162 }
163163}
164164
165+ /// Reason that a crate is being sourced as a dependency.
166+ #[ derive( Clone , Copy ) ]
167+ enum CrateOrigin < ' a > {
168+ /// This crate was a dependency of another crate.
169+ IndirectDependency {
170+ dep_root : & ' a CratePaths ,
171+ /// Dependency info about this crate.
172+ dep : & ' a CrateDep ,
173+ } ,
174+ /// Injected by `rustc`.
175+ Injected ,
176+ /// Provided by `extern crate foo` or as part of the extern prelude.
177+ Extern ,
178+ }
179+
180+ impl < ' a > CrateOrigin < ' a > {
181+ /// Return the dependency root, if any.
182+ fn dep_root ( & self ) -> Option < & ' a CratePaths > {
183+ match self {
184+ CrateOrigin :: IndirectDependency { dep_root, .. } => Some ( dep_root) ,
185+ _ => None ,
186+ }
187+ }
188+
189+ /// Return dependency information, if any.
190+ fn dep ( & self ) -> Option < & ' a CrateDep > {
191+ match self {
192+ CrateOrigin :: IndirectDependency { dep, .. } => Some ( dep) ,
193+ _ => None ,
194+ }
195+ }
196+ }
197+
165198impl CStore {
166199 pub fn from_tcx ( tcx : TyCtxt < ' _ > ) -> FreezeReadGuard < ' _ , CStore > {
167200 FreezeReadGuard :: map ( tcx. untracked ( ) . cstore . read ( ) , |cstore| {
@@ -497,20 +530,24 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
497530 & self ,
498531 name : Symbol ,
499532 private_dep : Option < bool > ,
500- dep_root : Option < & CratePaths > ,
533+ origin : CrateOrigin < ' _ > ,
501534 ) -> bool {
502535 // Standard library crates are never private.
503536 if STDLIB_STABLE_CRATES . contains ( & name) {
504537 tracing:: info!( "returning false for {name} is private" ) ;
505538 return false ;
506539 }
507540
541+ if matches ! ( origin, CrateOrigin :: Injected ) {
542+ return true ;
543+ }
544+
508545 let extern_private = self . sess . opts . externs . get ( name. as_str ( ) ) . map ( |e| e. is_private_dep ) ;
509546
510547 // Any descendants of `std` should be private. These crates are usually not marked
511548 // private in metadata, so we ignore that field.
512549 if extern_private. is_none ( )
513- && let Some ( dep) = dep_root
550+ && let Some ( dep) = origin . dep_root ( )
514551 && STDLIB_STABLE_CRATES . contains ( & dep. name )
515552 {
516553 return true ;
@@ -528,7 +565,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
528565 fn register_crate (
529566 & mut self ,
530567 host_lib : Option < Library > ,
531- dep_root : Option < & CratePaths > ,
568+ origin : CrateOrigin < ' _ > ,
532569 lib : Library ,
533570 dep_kind : CrateDepKind ,
534571 name : Symbol ,
@@ -540,7 +577,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
540577 let Library { source, metadata } = lib;
541578 let crate_root = metadata. get_root ( ) ;
542579 let host_hash = host_lib. as_ref ( ) . map ( |lib| lib. metadata . get_root ( ) . hash ( ) ) ;
543- let private_dep = self . is_private_dep ( name, private_dep, dep_root ) ;
580+ let private_dep = self . is_private_dep ( name, private_dep, origin ) ;
544581
545582 // Claim this crate number and cache it
546583 let feed = self . cstore . intern_stable_crate_id ( & crate_root, self . tcx ) ?;
@@ -556,7 +593,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
556593 // Maintain a reference to the top most crate.
557594 // Stash paths for top-most crate locally if necessary.
558595 let crate_paths;
559- let dep_root = if let Some ( dep_root) = dep_root {
596+ let dep_root = if let Some ( dep_root) = origin . dep_root ( ) {
560597 dep_root
561598 } else {
562599 crate_paths = CratePaths :: new ( crate_root. name ( ) , source. clone ( ) ) ;
@@ -664,17 +701,19 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
664701 name : Symbol ,
665702 span : Span ,
666703 dep_kind : CrateDepKind ,
704+ origin : CrateOrigin < ' _ > ,
667705 ) -> Option < CrateNum > {
668706 self . used_extern_options . insert ( name) ;
669- match self . maybe_resolve_crate ( name, dep_kind, None ) {
707+ match self . maybe_resolve_crate ( name, dep_kind, origin ) {
670708 Ok ( cnum) => {
671709 self . cstore . set_used_recursively ( cnum) ;
672710 Some ( cnum)
673711 }
674712 Err ( err) => {
675713 debug ! ( "failed to resolve crate {} {:?}" , name, dep_kind) ;
676- let missing_core =
677- self . maybe_resolve_crate ( sym:: core, CrateDepKind :: Explicit , None ) . is_err ( ) ;
714+ let missing_core = self
715+ . maybe_resolve_crate ( sym:: core, CrateDepKind :: Explicit , CrateOrigin :: Extern )
716+ . is_err ( ) ;
678717 err. report ( self . sess , span, missing_core) ;
679718 None
680719 }
@@ -685,15 +724,15 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
685724 & ' b mut self ,
686725 name : Symbol ,
687726 mut dep_kind : CrateDepKind ,
688- dep_of : Option < ( & ' b CratePaths , & ' b CrateDep ) > ,
727+ origin : CrateOrigin < ' b > ,
689728 ) -> Result < CrateNum , CrateError > {
690729 info ! ( "resolving crate `{}`" , name) ;
691730 if !name. as_str ( ) . is_ascii ( ) {
692731 return Err ( CrateError :: NonAsciiName ( name) ) ;
693732 }
694733
695- let dep_root = dep_of . map ( |d| d . 0 ) ;
696- let dep = dep_of . map ( |d| d . 1 ) ;
734+ let dep_root = origin . dep_root ( ) ;
735+ let dep = origin . dep ( ) ;
697736 let hash = dep. map ( |d| d. hash ) ;
698737 let host_hash = dep. map ( |d| d. host_hash ) . flatten ( ) ;
699738 let extra_filename = dep. map ( |d| & d. extra_filename [ ..] ) ;
@@ -736,7 +775,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
736775 // not specified by `--extern` on command line parameters, it may be
737776 // `private-dependency` when `register_crate` is called for the first time. Then it must be updated to
738777 // `public-dependency` here.
739- let private_dep = self . is_private_dep ( name, private_dep, dep_root ) ;
778+ let private_dep = self . is_private_dep ( name, private_dep, origin ) ;
740779 let data = self . cstore . get_crate_data_mut ( cnum) ;
741780 if data. is_proc_macro_crate ( ) {
742781 dep_kind = CrateDepKind :: MacrosOnly ;
@@ -747,7 +786,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
747786 }
748787 ( LoadResult :: Loaded ( library) , host_library) => {
749788 info ! ( "register newly loaded library for `{}`" , name) ;
750- self . register_crate ( host_library, dep_root , library, dep_kind, name, private_dep)
789+ self . register_crate ( host_library, origin , library, dep_kind, name, private_dep)
751790 }
752791 _ => panic ! ( ) ,
753792 }
@@ -823,7 +862,11 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
823862 CrateDepKind :: MacrosOnly => CrateDepKind :: MacrosOnly ,
824863 _ => dep. kind ,
825864 } ;
826- let cnum = self . maybe_resolve_crate ( dep. name , dep_kind, Some ( ( dep_root, & dep) ) ) ?;
865+ let cnum = self . maybe_resolve_crate (
866+ dep. name ,
867+ dep_kind,
868+ CrateOrigin :: IndirectDependency { dep_root, dep : & dep } ,
869+ ) ?;
827870 crate_num_map. push ( cnum) ;
828871 }
829872
@@ -917,7 +960,9 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
917960 } ;
918961 info ! ( "panic runtime not found -- loading {}" , name) ;
919962
920- let Some ( cnum) = self . resolve_crate ( name, DUMMY_SP , CrateDepKind :: Implicit ) else {
963+ let Some ( cnum) =
964+ self . resolve_crate ( name, DUMMY_SP , CrateDepKind :: Implicit , CrateOrigin :: Injected )
965+ else {
921966 return ;
922967 } ;
923968 let data = self . cstore . get_crate_data ( cnum) ;
@@ -946,7 +991,9 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
946991 info ! ( "loading profiler" ) ;
947992
948993 let name = Symbol :: intern ( & self . sess . opts . unstable_opts . profiler_runtime ) ;
949- let Some ( cnum) = self . resolve_crate ( name, DUMMY_SP , CrateDepKind :: Implicit ) else {
994+ let Some ( cnum) =
995+ self . resolve_crate ( name, DUMMY_SP , CrateDepKind :: Implicit , CrateOrigin :: Injected )
996+ else {
950997 return ;
951998 } ;
952999 let data = self . cstore . get_crate_data ( cnum) ;
@@ -1059,7 +1106,12 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
10591106 if entry. force {
10601107 let name_interned = Symbol :: intern ( name) ;
10611108 if !self . used_extern_options . contains ( & name_interned) {
1062- self . resolve_crate ( name_interned, DUMMY_SP , CrateDepKind :: Explicit ) ;
1109+ self . resolve_crate (
1110+ name_interned,
1111+ DUMMY_SP ,
1112+ CrateDepKind :: Explicit ,
1113+ CrateOrigin :: Extern ,
1114+ ) ;
10631115 }
10641116 }
10651117 }
@@ -1185,6 +1237,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
11851237 info ! ( "{:?}" , CrateDump ( self . cstore) ) ;
11861238 }
11871239
1240+ /// Process an `extern crate foo` AST node.
11881241 pub fn process_extern_crate (
11891242 & mut self ,
11901243 item : & ast:: Item ,
@@ -1210,7 +1263,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
12101263 CrateDepKind :: Explicit
12111264 } ;
12121265
1213- let cnum = self . resolve_crate ( name, item. span , dep_kind) ?;
1266+ let cnum = self . resolve_crate ( name, item. span , dep_kind, CrateOrigin :: Extern ) ?;
12141267
12151268 let path_len = definitions. def_path ( def_id) . data . len ( ) ;
12161269 self . cstore . update_extern_crate (
@@ -1229,7 +1282,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
12291282 }
12301283
12311284 pub fn process_path_extern ( & mut self , name : Symbol , span : Span ) -> Option < CrateNum > {
1232- let cnum = self . resolve_crate ( name, span, CrateDepKind :: Explicit ) ?;
1285+ let cnum = self . resolve_crate ( name, span, CrateDepKind :: Explicit , CrateOrigin :: Extern ) ?;
12331286
12341287 self . cstore . update_extern_crate (
12351288 cnum,
@@ -1246,7 +1299,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
12461299 }
12471300
12481301 pub fn maybe_process_path_extern ( & mut self , name : Symbol ) -> Option < CrateNum > {
1249- self . maybe_resolve_crate ( name, CrateDepKind :: Explicit , None ) . ok ( )
1302+ self . maybe_resolve_crate ( name, CrateDepKind :: Explicit , CrateOrigin :: Extern ) . ok ( )
12501303 }
12511304}
12521305
0 commit comments