1
Fork 0

check local cache even if global is usable

we store overflow errors locally, even if we can otherwise
use the global cache for this goal.
This commit is contained in:
lcnr 2024-11-29 12:44:01 +01:00
parent cb2bd2bb06
commit de94536553

View file

@ -1537,14 +1537,19 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
if self.can_use_global_caches(param_env, cache_fresh_trait_pred) { if self.can_use_global_caches(param_env, cache_fresh_trait_pred) {
if let Some(res) = tcx.selection_cache.get(&(infcx.typing_env(param_env), pred), tcx) { if let Some(res) = tcx.selection_cache.get(&(infcx.typing_env(param_env), pred), tcx) {
Some(res) return Some(res);
} else { } else if cfg!(debug_assertions) {
debug_assert_eq!(infcx.selection_cache.get(&(param_env, pred), tcx), None); match infcx.selection_cache.get(&(param_env, pred), tcx) {
None None | Some(Err(Overflow(OverflowError::Canonical))) => {}
res => bug!("unexpected local cache result: {res:?}"),
}
} }
} else {
infcx.selection_cache.get(&(param_env, pred), tcx)
} }
// Subtle: we need to check the local cache even if we're able to use the
// global cache as we don't cache overflow in the global cache but need to
// cache it as otherwise rustdoc hangs when compiling diesel.
infcx.selection_cache.get(&(param_env, pred), tcx)
} }
/// Determines whether can we safely cache the result /// Determines whether can we safely cache the result