Pass spans around new solver
This commit is contained in:
parent
fd1110ce6a
commit
4e763c2297
16 changed files with 137 additions and 55 deletions
|
@ -4,8 +4,8 @@ use rustc_type_ir::fold::TypeFoldable;
|
|||
use rustc_type_ir::solve::{Certainty, Goal, NoSolution};
|
||||
use rustc_type_ir::{self as ty, InferCtxtLike, Interner};
|
||||
|
||||
pub trait SolverDelegate: Deref<Target = <Self as SolverDelegate>::Infcx> + Sized {
|
||||
type Infcx: InferCtxtLike<Interner = <Self as SolverDelegate>::Interner>;
|
||||
pub trait SolverDelegate: Deref<Target = Self::Infcx> + Sized {
|
||||
type Infcx: InferCtxtLike<Interner = Self::Interner>;
|
||||
type Interner: Interner;
|
||||
fn cx(&self) -> Self::Interner {
|
||||
(**self).cx()
|
||||
|
@ -59,6 +59,7 @@ pub trait SolverDelegate: Deref<Target = <Self as SolverDelegate>::Infcx> + Size
|
|||
fn instantiate_canonical_var_with_infer(
|
||||
&self,
|
||||
cv_info: ty::CanonicalVarInfo<Self::Interner>,
|
||||
span: <Self::Interner as Interner>::Span,
|
||||
universe_map: impl Fn(ty::UniverseIndex) -> ty::UniverseIndex,
|
||||
) -> <Self::Interner as Interner>::GenericArg;
|
||||
|
||||
|
@ -84,6 +85,7 @@ pub trait SolverDelegate: Deref<Target = <Self as SolverDelegate>::Infcx> + Size
|
|||
&self,
|
||||
key: ty::OpaqueTypeKey<Self::Interner>,
|
||||
hidden_ty: <Self::Interner as Interner>::Ty,
|
||||
span: <Self::Interner as Interner>::Span,
|
||||
);
|
||||
|
||||
fn reset_opaque_types(&self);
|
||||
|
|
|
@ -255,20 +255,29 @@ where
|
|||
self.delegate,
|
||||
&original_values,
|
||||
&response,
|
||||
self.origin_span,
|
||||
);
|
||||
|
||||
let Response { var_values, external_constraints, certainty } =
|
||||
self.delegate.instantiate_canonical(response, instantiation);
|
||||
|
||||
Self::unify_query_var_values(self.delegate, param_env, &original_values, var_values);
|
||||
Self::unify_query_var_values(
|
||||
self.delegate,
|
||||
param_env,
|
||||
&original_values,
|
||||
var_values,
|
||||
self.origin_span,
|
||||
);
|
||||
|
||||
let ExternalConstraintsData {
|
||||
region_constraints,
|
||||
opaque_types,
|
||||
normalization_nested_goals,
|
||||
} = &*external_constraints;
|
||||
|
||||
self.register_region_constraints(region_constraints);
|
||||
self.register_new_opaque_types(opaque_types);
|
||||
|
||||
(normalization_nested_goals.clone(), certainty)
|
||||
}
|
||||
|
||||
|
@ -279,6 +288,7 @@ where
|
|||
delegate: &D,
|
||||
original_values: &[I::GenericArg],
|
||||
response: &Canonical<I, T>,
|
||||
span: I::Span,
|
||||
) -> CanonicalVarValues<I> {
|
||||
// FIXME: Longterm canonical queries should deal with all placeholders
|
||||
// created inside of the query directly instead of returning them to the
|
||||
|
@ -331,7 +341,7 @@ where
|
|||
// A variable from inside a binder of the query. While ideally these shouldn't
|
||||
// exist at all (see the FIXME at the start of this method), we have to deal with
|
||||
// them for now.
|
||||
delegate.instantiate_canonical_var_with_infer(info, |idx| {
|
||||
delegate.instantiate_canonical_var_with_infer(info, span, |idx| {
|
||||
ty::UniverseIndex::from(prev_universe.index() + idx.index())
|
||||
})
|
||||
} else if info.is_existential() {
|
||||
|
@ -345,7 +355,7 @@ where
|
|||
if let Some(v) = opt_values[ty::BoundVar::from_usize(index)] {
|
||||
v
|
||||
} else {
|
||||
delegate.instantiate_canonical_var_with_infer(info, |_| prev_universe)
|
||||
delegate.instantiate_canonical_var_with_infer(info, span, |_| prev_universe)
|
||||
}
|
||||
} else {
|
||||
// For placeholders which were already part of the input, we simply map this
|
||||
|
@ -376,12 +386,13 @@ where
|
|||
param_env: I::ParamEnv,
|
||||
original_values: &[I::GenericArg],
|
||||
var_values: CanonicalVarValues<I>,
|
||||
span: I::Span,
|
||||
) {
|
||||
assert_eq!(original_values.len(), var_values.len());
|
||||
|
||||
for (&orig, response) in iter::zip(original_values, var_values.var_values.iter()) {
|
||||
let goals =
|
||||
delegate.eq_structurally_relating_aliases(param_env, orig, response).unwrap();
|
||||
delegate.eq_structurally_relating_aliases(param_env, orig, response, span).unwrap();
|
||||
assert!(goals.is_empty());
|
||||
}
|
||||
}
|
||||
|
@ -401,7 +412,7 @@ where
|
|||
|
||||
fn register_new_opaque_types(&mut self, opaque_types: &[(ty::OpaqueTypeKey<I>, I::Ty)]) {
|
||||
for &(key, ty) in opaque_types {
|
||||
self.delegate.inject_new_hidden_type_unchecked(key, ty);
|
||||
self.delegate.inject_new_hidden_type_unchecked(key, ty, self.origin_span);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -451,10 +462,10 @@ where
|
|||
}
|
||||
|
||||
let instantiation =
|
||||
EvalCtxt::compute_query_response_instantiation_values(delegate, orig_values, &state);
|
||||
EvalCtxt::compute_query_response_instantiation_values(delegate, orig_values, &state, span);
|
||||
|
||||
let inspect::State { var_values, data } = delegate.instantiate_canonical(state, instantiation);
|
||||
|
||||
EvalCtxt::unify_query_var_values(delegate, param_env, orig_values, var_values);
|
||||
EvalCtxt::unify_query_var_values(delegate, param_env, orig_values, var_values, span);
|
||||
data
|
||||
}
|
||||
|
|
|
@ -78,6 +78,8 @@ where
|
|||
|
||||
nested_goals: NestedGoals<I>,
|
||||
|
||||
pub(super) origin_span: I::Span,
|
||||
|
||||
// Has this `EvalCtxt` errored out with `NoSolution` in `try_evaluate_added_goals`?
|
||||
//
|
||||
// If so, then it can no longer be used to make a canonical query response,
|
||||
|
@ -134,6 +136,7 @@ pub trait SolverDelegateEvalExt: SolverDelegate {
|
|||
&self,
|
||||
goal: Goal<Self::Interner, <Self::Interner as Interner>::Predicate>,
|
||||
generate_proof_tree: GenerateProofTree,
|
||||
span: <Self::Interner as Interner>::Span,
|
||||
) -> (
|
||||
Result<(HasChanged, Certainty), NoSolution>,
|
||||
Option<inspect::GoalEvaluation<Self::Interner>>,
|
||||
|
@ -174,8 +177,9 @@ where
|
|||
&self,
|
||||
goal: Goal<I, I::Predicate>,
|
||||
generate_proof_tree: GenerateProofTree,
|
||||
span: I::Span,
|
||||
) -> (Result<(HasChanged, Certainty), NoSolution>, Option<inspect::GoalEvaluation<I>>) {
|
||||
EvalCtxt::enter_root(self, self.cx().recursion_limit(), generate_proof_tree, |ecx| {
|
||||
EvalCtxt::enter_root(self, self.cx().recursion_limit(), generate_proof_tree, span, |ecx| {
|
||||
ecx.evaluate_goal(GoalEvaluationKind::Root, GoalSource::Misc, goal)
|
||||
})
|
||||
}
|
||||
|
@ -186,7 +190,7 @@ where
|
|||
goal: Goal<Self::Interner, <Self::Interner as Interner>::Predicate>,
|
||||
) -> bool {
|
||||
self.probe(|| {
|
||||
EvalCtxt::enter_root(self, root_depth, GenerateProofTree::No, |ecx| {
|
||||
EvalCtxt::enter_root(self, root_depth, GenerateProofTree::No, I::Span::dummy(), |ecx| {
|
||||
ecx.evaluate_goal(GoalEvaluationKind::Root, GoalSource::Misc, goal)
|
||||
})
|
||||
.0
|
||||
|
@ -203,9 +207,13 @@ where
|
|||
Result<(NestedNormalizationGoals<I>, HasChanged, Certainty), NoSolution>,
|
||||
Option<inspect::GoalEvaluation<I>>,
|
||||
) {
|
||||
EvalCtxt::enter_root(self, self.cx().recursion_limit(), generate_proof_tree, |ecx| {
|
||||
ecx.evaluate_goal_raw(GoalEvaluationKind::Root, GoalSource::Misc, goal)
|
||||
})
|
||||
EvalCtxt::enter_root(
|
||||
self,
|
||||
self.cx().recursion_limit(),
|
||||
generate_proof_tree,
|
||||
I::Span::dummy(),
|
||||
|ecx| ecx.evaluate_goal_raw(GoalEvaluationKind::Root, GoalSource::Misc, goal),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -229,6 +237,7 @@ where
|
|||
delegate: &D,
|
||||
root_depth: usize,
|
||||
generate_proof_tree: GenerateProofTree,
|
||||
origin_span: I::Span,
|
||||
f: impl FnOnce(&mut EvalCtxt<'_, D>) -> R,
|
||||
) -> (R, Option<inspect::GoalEvaluation<I>>) {
|
||||
let mut search_graph = SearchGraph::new(root_depth);
|
||||
|
@ -248,6 +257,7 @@ where
|
|||
variables: Default::default(),
|
||||
var_values: CanonicalVarValues::dummy(),
|
||||
is_normalizes_to_goal: false,
|
||||
origin_span,
|
||||
tainted: Ok(()),
|
||||
};
|
||||
let result = f(&mut ecx);
|
||||
|
@ -289,12 +299,13 @@ where
|
|||
max_input_universe: canonical_input.canonical.max_universe,
|
||||
search_graph,
|
||||
nested_goals: NestedGoals::new(),
|
||||
origin_span: I::Span::dummy(),
|
||||
tainted: Ok(()),
|
||||
inspect: canonical_goal_evaluation.new_goal_evaluation_step(var_values),
|
||||
};
|
||||
|
||||
for &(key, ty) in &input.predefined_opaques_in_body.opaque_types {
|
||||
ecx.delegate.inject_new_hidden_type_unchecked(key, ty);
|
||||
ecx.delegate.inject_new_hidden_type_unchecked(key, ty, ecx.origin_span);
|
||||
}
|
||||
|
||||
if !ecx.nested_goals.is_empty() {
|
||||
|
@ -822,8 +833,12 @@ where
|
|||
let identity_args = self.fresh_args_for_item(alias.def_id);
|
||||
let rigid_ctor = ty::AliasTerm::new_from_args(cx, alias.def_id, identity_args);
|
||||
let ctor_term = rigid_ctor.to_term(cx);
|
||||
let obligations =
|
||||
self.delegate.eq_structurally_relating_aliases(param_env, term, ctor_term)?;
|
||||
let obligations = self.delegate.eq_structurally_relating_aliases(
|
||||
param_env,
|
||||
term,
|
||||
ctor_term,
|
||||
self.origin_span,
|
||||
)?;
|
||||
debug_assert!(obligations.is_empty());
|
||||
self.relate(param_env, alias, variance, rigid_ctor)
|
||||
} else {
|
||||
|
@ -841,7 +856,12 @@ where
|
|||
lhs: T,
|
||||
rhs: T,
|
||||
) -> Result<(), NoSolution> {
|
||||
let result = self.delegate.eq_structurally_relating_aliases(param_env, lhs, rhs)?;
|
||||
let result = self.delegate.eq_structurally_relating_aliases(
|
||||
param_env,
|
||||
lhs,
|
||||
rhs,
|
||||
self.origin_span,
|
||||
)?;
|
||||
assert_eq!(result, vec![]);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -864,7 +884,7 @@ where
|
|||
variance: ty::Variance,
|
||||
rhs: T,
|
||||
) -> Result<(), NoSolution> {
|
||||
let goals = self.delegate.relate(param_env, lhs, variance, rhs)?;
|
||||
let goals = self.delegate.relate(param_env, lhs, variance, rhs, self.origin_span)?;
|
||||
self.add_goals(GoalSource::Misc, goals);
|
||||
Ok(())
|
||||
}
|
||||
|
@ -881,7 +901,7 @@ where
|
|||
lhs: T,
|
||||
rhs: T,
|
||||
) -> Result<Vec<Goal<I, I::Predicate>>, NoSolution> {
|
||||
Ok(self.delegate.relate(param_env, lhs, ty::Variance::Invariant, rhs)?)
|
||||
Ok(self.delegate.relate(param_env, lhs, ty::Variance::Invariant, rhs, self.origin_span)?)
|
||||
}
|
||||
|
||||
pub(super) fn instantiate_binder_with_infer<T: TypeFoldable<I> + Copy>(
|
||||
|
@ -917,12 +937,12 @@ where
|
|||
}
|
||||
|
||||
pub(super) fn register_ty_outlives(&self, ty: I::Ty, lt: I::Region) {
|
||||
self.delegate.register_ty_outlives(ty, lt);
|
||||
self.delegate.register_ty_outlives(ty, lt, self.origin_span);
|
||||
}
|
||||
|
||||
pub(super) fn register_region_outlives(&self, a: I::Region, b: I::Region) {
|
||||
// `b : a` ==> `a <= b`
|
||||
self.delegate.sub_regions(b, a);
|
||||
self.delegate.sub_regions(b, a, self.origin_span);
|
||||
}
|
||||
|
||||
/// Computes the list of goals required for `arg` to be well-formed
|
||||
|
|
|
@ -39,6 +39,7 @@ where
|
|||
max_input_universe,
|
||||
search_graph: outer_ecx.search_graph,
|
||||
nested_goals: outer_ecx.nested_goals.clone(),
|
||||
origin_span: outer_ecx.origin_span,
|
||||
tainted: outer_ecx.tainted,
|
||||
inspect: outer_ecx.inspect.take_and_enter_probe(),
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue