@@ -692,10 +692,12 @@ macro_rules! define_queries_inner {
692
692
impl <$tcx> Queries <$tcx> {
693
693
pub fn new(
694
694
providers: IndexVec <CrateNum , Providers <$tcx>>,
695
+ fallback_extern_providers: Providers <$tcx>,
695
696
on_disk_cache: OnDiskCache <' tcx>,
696
697
) -> Self {
697
698
Queries {
698
699
providers,
700
+ fallback_extern_providers: Box :: new( fallback_extern_providers) ,
699
701
on_disk_cache,
700
702
$( $name: Lock :: new( QueryCache :: new( ) ) ) ,*
701
703
}
@@ -818,7 +820,13 @@ macro_rules! define_queries_inner {
818
820
#[ inline]
819
821
fn compute( tcx: TyCtxt <' _, ' tcx, ' _>, key: Self :: Key ) -> Self :: Value {
820
822
__query_compute:: $name( move || {
821
- let provider = tcx. queries. providers[ key. query_crate( ) ] . $name;
823
+ let provider = tcx. queries. providers. get( key. query_crate( ) )
824
+ // HACK(eddyb) it's possible crates may be loaded after
825
+ // the query engine is created, and because crate loading
826
+ // is not yet integrated with the query engine, such crates
827
+ // would be be missing appropriate entries in `providers`.
828
+ . unwrap_or( & tcx. queries. fallback_extern_providers)
829
+ . $name;
822
830
provider( tcx. global_tcx( ) , key)
823
831
} )
824
832
}
@@ -899,6 +907,7 @@ macro_rules! define_queries_struct {
899
907
pub ( crate ) on_disk_cache: OnDiskCache <' tcx>,
900
908
901
909
providers: IndexVec <CrateNum , Providers <$tcx>>,
910
+ fallback_extern_providers: Box <Providers <$tcx>>,
902
911
903
912
$( $( #[ $attr] ) * $name: Lock <QueryCache <$tcx, queries:: $name<$tcx>>>, ) *
904
913
}
0 commit comments