global old solver cache: use TypingEnv
This commit is contained in:
parent
a8c8ab1acd
commit
795ff6576c
5 changed files with 53 additions and 41 deletions
|
@ -551,7 +551,7 @@ pub struct DerivedCause<'tcx> {
|
|||
pub parent_code: InternedObligationCauseCode<'tcx>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, TypeVisitable)]
|
||||
#[derive(Clone, Debug, PartialEq, Eq, TypeVisitable)]
|
||||
pub enum SelectionError<'tcx> {
|
||||
/// The trait is not implemented.
|
||||
Unimplemented,
|
||||
|
@ -573,7 +573,7 @@ pub enum SelectionError<'tcx> {
|
|||
ConstArgHasWrongType { ct: ty::Const<'tcx>, ct_ty: Ty<'tcx>, expected_ty: Ty<'tcx> },
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, TypeVisitable)]
|
||||
#[derive(Clone, Debug, PartialEq, Eq, TypeVisitable)]
|
||||
pub struct SignatureMismatchData<'tcx> {
|
||||
pub found_trait_ref: ty::TraitRef<'tcx>,
|
||||
pub expected_trait_ref: ty::TraitRef<'tcx>,
|
||||
|
|
|
@ -11,20 +11,10 @@ use self::EvaluationResult::*;
|
|||
use super::{SelectionError, SelectionResult};
|
||||
use crate::ty;
|
||||
|
||||
pub type SelectionCache<'tcx> = Cache<
|
||||
// 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 SelectionCache<'tcx, ENV> =
|
||||
Cache<(ENV, ty::TraitPredicate<'tcx>), SelectionResult<'tcx, SelectionCandidate<'tcx>>>;
|
||||
|
||||
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,
|
||||
>;
|
||||
pub type EvaluationCache<'tcx, ENV> = Cache<(ENV, ty::PolyTraitPredicate<'tcx>), EvaluationResult>;
|
||||
|
||||
/// The selection process begins by considering all impls, where
|
||||
/// clauses, and so forth that might resolve an obligation. Sometimes
|
||||
|
|
|
@ -1326,12 +1326,12 @@ pub struct GlobalCtxt<'tcx> {
|
|||
|
||||
/// Caches the results of trait selection. This cache is used
|
||||
/// for things that do not have to do with the parameters in scope.
|
||||
pub selection_cache: traits::SelectionCache<'tcx>,
|
||||
pub selection_cache: traits::SelectionCache<'tcx, ty::TypingEnv<'tcx>>,
|
||||
|
||||
/// Caches the results of trait evaluation. This cache is used
|
||||
/// for things that do not have to do with the parameters in scope.
|
||||
/// Merge this with `selection_cache`?
|
||||
pub evaluation_cache: traits::EvaluationCache<'tcx>,
|
||||
pub evaluation_cache: traits::EvaluationCache<'tcx, ty::TypingEnv<'tcx>>,
|
||||
|
||||
/// Caches the results of goal evaluation in the new solver.
|
||||
pub new_solver_evaluation_cache: Lock<search_graph::GlobalCache<TyCtxt<'tcx>>>,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue