diff options
| -rw-r--r-- | src/librustc/ty/context.rs | 6 | ||||
| -rw-r--r-- | src/librustc/ty/query/plumbing.rs | 11 |
2 files changed, 15 insertions, 2 deletions
diff --git a/src/librustc/ty/context.rs b/src/librustc/ty/context.rs index d1f37250379..6738267b5b8 100644 --- a/src/librustc/ty/context.rs +++ b/src/librustc/ty/context.rs @@ -1247,7 +1247,11 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { .collect(), hir, def_path_hash_to_def_id, - queries: query::Queries::new(providers, on_disk_query_result_cache), + queries: query::Queries::new( + providers, + extern_providers, + on_disk_query_result_cache, + ), rcache: Lock::new(FxHashMap()), selection_cache: traits::SelectionCache::new(), evaluation_cache: traits::EvaluationCache::new(), diff --git a/src/librustc/ty/query/plumbing.rs b/src/librustc/ty/query/plumbing.rs index 3c26732fbac..25e72f462e6 100644 --- a/src/librustc/ty/query/plumbing.rs +++ b/src/librustc/ty/query/plumbing.rs @@ -692,10 +692,12 @@ macro_rules! define_queries_inner { impl<$tcx> Queries<$tcx> { pub fn new( providers: IndexVec<CrateNum, Providers<$tcx>>, + fallback_extern_providers: Providers<$tcx>, on_disk_cache: OnDiskCache<'tcx>, ) -> Self { Queries { providers, + fallback_extern_providers: Box::new(fallback_extern_providers), on_disk_cache, $($name: Lock::new(QueryCache::new())),* } @@ -818,7 +820,13 @@ macro_rules! define_queries_inner { #[inline] fn compute(tcx: TyCtxt<'_, 'tcx, '_>, key: Self::Key) -> Self::Value { __query_compute::$name(move || { - let provider = tcx.queries.providers[key.query_crate()].$name; + let provider = tcx.queries.providers.get(key.query_crate()) + // HACK(eddyb) it's possible crates may be loaded after + // the query engine is created, and because crate loading + // is not yet integrated with the query engine, such crates + // would be be missing appropriate entries in `providers`. + .unwrap_or(&tcx.queries.fallback_extern_providers) + .$name; provider(tcx.global_tcx(), key) }) } @@ -899,6 +907,7 @@ macro_rules! define_queries_struct { pub(crate) on_disk_cache: OnDiskCache<'tcx>, providers: IndexVec<CrateNum, Providers<$tcx>>, + fallback_extern_providers: Box<Providers<$tcx>>, $($(#[$attr])* $name: Lock<QueryCache<$tcx, queries::$name<$tcx>>>,)* } |
