Do not use ParamEnv::and to cache param-env with candidate
This commit is contained in:
parent
551b4fa395
commit
8588f79802
@ -13,12 +13,19 @@
|
||||
use rustc_query_system::cache::Cache;
|
||||
|
||||
pub type SelectionCache<'tcx> = Cache<
|
||||
ty::ParamEnvAnd<'tcx, ty::TraitPredicate<'tcx>>,
|
||||
// This cache does not use `ParamEnvAnd` in its keys because `ParamEnv::and` can replace
|
||||
// caller bounds with an empty list if the `TraitPredicate` looks global, which may happen
|
||||
// after erasing lifetimes from the predicate.
|
||||
(ty::ParamEnv<'tcx>, ty::TraitPredicate<'tcx>),
|
||||
SelectionResult<'tcx, SelectionCandidate<'tcx>>,
|
||||
>;
|
||||
|
||||
pub type EvaluationCache<'tcx> =
|
||||
Cache<ty::ParamEnvAnd<'tcx, ty::PolyTraitPredicate<'tcx>>, EvaluationResult>;
|
||||
pub type EvaluationCache<'tcx> = Cache<
|
||||
// See above: this cache does not use `ParamEnvAnd` in its keys due to sometimes incorrectly
|
||||
// caching with the wrong `ParamEnv`.
|
||||
(ty::ParamEnv<'tcx>, ty::PolyTraitPredicate<'tcx>),
|
||||
EvaluationResult,
|
||||
>;
|
||||
|
||||
/// The selection process begins by considering all impls, where
|
||||
/// clauses, and so forth that might resolve an obligation. Sometimes
|
||||
|
@ -1046,11 +1046,11 @@ fn check_evaluation_cache(
|
||||
|
||||
let tcx = self.tcx();
|
||||
if self.can_use_global_caches(param_env) {
|
||||
if let Some(res) = tcx.evaluation_cache.get(¶m_env.and(trait_pred), tcx) {
|
||||
if let Some(res) = tcx.evaluation_cache.get(&(param_env, trait_pred), tcx) {
|
||||
return Some(res);
|
||||
}
|
||||
}
|
||||
self.infcx.evaluation_cache.get(¶m_env.and(trait_pred), tcx)
|
||||
self.infcx.evaluation_cache.get(&(param_env, trait_pred), tcx)
|
||||
}
|
||||
|
||||
fn insert_evaluation_cache(
|
||||
@ -1081,13 +1081,13 @@ fn insert_evaluation_cache(
|
||||
// FIXME: Due to #50507 this overwrites the different values
|
||||
// This should be changed to use HashMapExt::insert_same
|
||||
// when that is fixed
|
||||
self.tcx().evaluation_cache.insert(param_env.and(trait_pred), dep_node, result);
|
||||
self.tcx().evaluation_cache.insert((param_env, trait_pred), dep_node, result);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
debug!(?trait_pred, ?result, "insert_evaluation_cache");
|
||||
self.infcx.evaluation_cache.insert(param_env.and(trait_pred), dep_node, result);
|
||||
self.infcx.evaluation_cache.insert((param_env, trait_pred), dep_node, result);
|
||||
}
|
||||
|
||||
/// For various reasons, it's possible for a subobligation
|
||||
@ -1297,11 +1297,11 @@ fn check_candidate_cache(
|
||||
pred.remap_constness(tcx, &mut param_env);
|
||||
|
||||
if self.can_use_global_caches(param_env) {
|
||||
if let Some(res) = tcx.selection_cache.get(¶m_env.and(pred), tcx) {
|
||||
if let Some(res) = tcx.selection_cache.get(&(param_env, pred), tcx) {
|
||||
return Some(res);
|
||||
}
|
||||
}
|
||||
self.infcx.selection_cache.get(¶m_env.and(pred), tcx)
|
||||
self.infcx.selection_cache.get(&(param_env, pred), tcx)
|
||||
}
|
||||
|
||||
/// Determines whether can we safely cache the result
|
||||
@ -1361,14 +1361,14 @@ fn insert_candidate_cache(
|
||||
if !candidate.needs_infer() {
|
||||
debug!(?pred, ?candidate, "insert_candidate_cache global");
|
||||
// This may overwrite the cache with the same value.
|
||||
tcx.selection_cache.insert(param_env.and(pred), dep_node, candidate);
|
||||
tcx.selection_cache.insert((param_env, pred), dep_node, candidate);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
debug!(?pred, ?candidate, "insert_candidate_cache local");
|
||||
self.infcx.selection_cache.insert(param_env.and(pred), dep_node, candidate);
|
||||
self.infcx.selection_cache.insert((param_env, pred), dep_node, candidate);
|
||||
}
|
||||
|
||||
/// Matches a predicate against the bounds of its self type.
|
||||
|
@ -1,4 +1,4 @@
|
||||
// check-pass
|
||||
// build-pass
|
||||
// edition:2018
|
||||
|
||||
type BoxFuture<T> = std::pin::Pin<Box<dyn std::future::Future<Output=T>>>;
|
||||
@ -65,6 +65,7 @@ async fn run<S>(dep: &str)
|
||||
where
|
||||
S: Storage,
|
||||
for<'a> SaveUser<'a>: StorageRequest<S>,
|
||||
for<'a> SaveUser<'a>: StorageRequestReturnType,
|
||||
{
|
||||
User { dep }.save().await;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user