Skip to content

Commit

Permalink
Auto merge of #126024 - oli-obk:candidate_key_caching_is_unsound_yay,…
Browse files Browse the repository at this point in the history
… 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 #122192 (comment)
  • Loading branch information
bors committed Jul 24, 2024
2 parents d24930c + 61b5e11 commit 2ccafed
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 2 deletions.
8 changes: 7 additions & 1 deletion compiler/rustc_trait_selection/src/traits/select/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
//@ known-bug: #119272
//! used to ICE: #119272

//@ check-pass

#![feature(type_alias_impl_trait)]
mod defining_scope {
use super::*;
Expand Down

0 comments on commit 2ccafed

Please sign in to comment.