Auto merge of #126024 - oli-obk:candidate_key_caching_is_unsound_yay, r=lcnr

Do not use global caches if opaque types can be defined

fixes #119272

r? `@lcnr`

This is certainly a crude way to make the cache sound wrt opaque types, but since perf lets us get away with this, let's do it in the old solver and let the new solver fix this correctly once and for all.

cc https://github.com/rust-lang/rust/pull/122192#issuecomment-2149252655
This commit is contained in:
bors 2024-07-24 11:59:10 +00:00
commit 2ccafed862
2 changed files with 11 additions and 2 deletions

View File

@ -1498,7 +1498,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
return false;
}
// Avoid using the master cache during coherence and just rely
// Avoid using the global cache during coherence and just rely
// on the local cache. This effectively disables caching
// during coherence. It is really just a simplification to
// avoid us having to fear that coherence results "pollute"
@ -1509,6 +1509,12 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
return false;
}
// Avoid using the global cache when we're defining opaque types
// as their hidden type may impact the result of candidate selection.
if !self.infcx.defining_opaque_types().is_empty() {
return false;
}
// Otherwise, we can use the global cache.
true
}

View File

@ -1,4 +1,7 @@
//@ known-bug: #119272
//! used to ICE: #119272
//@ check-pass
#![feature(type_alias_impl_trait)]
mod defining_scope {
use super::*;