Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/next_solver/inspect.rs')
-rw-r--r--crates/hir-ty/src/next_solver/inspect.rs62
1 files changed, 28 insertions, 34 deletions
diff --git a/crates/hir-ty/src/next_solver/inspect.rs b/crates/hir-ty/src/next_solver/inspect.rs
index 63a225b98f..566f72fbd8 100644
--- a/crates/hir-ty/src/next_solver/inspect.rs
+++ b/crates/hir-ty/src/next_solver/inspect.rs
@@ -6,19 +6,22 @@ use rustc_next_trait_solver::{
};
use rustc_type_ir::{
VisitorResult,
- inherent::{IntoKind, Span as _},
+ inherent::IntoKind,
solve::{Certainty, GoalSource, MaybeCause, NoSolution},
};
-use crate::next_solver::{
- DbInterner, GenericArg, GenericArgs, Goal, NormalizesTo, ParamEnv, Predicate, PredicateKind,
- QueryResult, SolverContext, Span, Term,
- fulfill::NextSolverError,
- infer::{
- InferCtxt,
- traits::{Obligation, ObligationCause},
+use crate::{
+ Span,
+ next_solver::{
+ DbInterner, GenericArg, GenericArgs, Goal, NormalizesTo, ParamEnv, Predicate,
+ PredicateKind, QueryResult, SolverContext, Term,
+ fulfill::NextSolverError,
+ infer::{
+ InferCtxt,
+ traits::{Obligation, ObligationCause},
+ },
+ obligation_ctxt::ObligationCtxt,
},
- obligation_ctxt::ObligationCtxt,
};
pub(crate) struct InspectConfig {
@@ -142,7 +145,7 @@ impl<'a, 'db> InspectCandidate<'a, 'db> {
&self,
visitor: &mut V,
) -> V::Result {
- for goal in self.instantiate_nested_goals() {
+ for goal in self.instantiate_nested_goals(visitor.span()) {
try_visit!(goal.visit_with(visitor));
}
@@ -153,7 +156,7 @@ impl<'a, 'db> InspectCandidate<'a, 'db> {
/// inference constraints. This function modifies the state of the `infcx`.
///
/// See [`Self::instantiate_impl_args`] if you need the impl args too.
- pub(crate) fn instantiate_nested_goals(&self) -> Vec<InspectGoal<'a, 'db>> {
+ pub(crate) fn instantiate_nested_goals(&self, span: Span) -> Vec<InspectGoal<'a, 'db>> {
let infcx = self.goal.infcx;
let param_env = self.goal.goal.param_env;
let mut orig_values = self.goal.orig_values.to_vec();
@@ -163,13 +166,7 @@ impl<'a, 'db> InspectCandidate<'a, 'db> {
match **step {
inspect::ProbeStep::AddGoal(source, goal) => instantiated_goals.push((
source,
- instantiate_canonical_state(
- infcx,
- Span::dummy(),
- param_env,
- &mut orig_values,
- goal,
- ),
+ instantiate_canonical_state(infcx, span, param_env, &mut orig_values, goal),
)),
inspect::ProbeStep::RecordImplArgs { .. } => {}
inspect::ProbeStep::MakeCanonicalResponse { .. }
@@ -177,13 +174,8 @@ impl<'a, 'db> InspectCandidate<'a, 'db> {
}
}
- let () = instantiate_canonical_state(
- infcx,
- Span::dummy(),
- param_env,
- &mut orig_values,
- self.final_state,
- );
+ let () =
+ instantiate_canonical_state(infcx, span, param_env, &mut orig_values, self.final_state);
if let Some(term_hack) = &self.goal.normalizes_to_term_hack {
// FIXME: We ignore the expected term of `NormalizesTo` goals
@@ -194,14 +186,14 @@ impl<'a, 'db> InspectCandidate<'a, 'db> {
instantiated_goals
.into_iter()
- .map(|(source, goal)| self.instantiate_proof_tree_for_nested_goal(source, goal))
+ .map(|(source, goal)| self.instantiate_proof_tree_for_nested_goal(source, goal, span))
.collect()
}
/// Instantiate the args of an impl if this candidate came from a
/// `CandidateSource::Impl`. This function modifies the state of the
/// `infcx`.
- pub(crate) fn instantiate_impl_args(&self) -> GenericArgs<'db> {
+ pub(crate) fn instantiate_impl_args(&self, span: Span) -> GenericArgs<'db> {
let infcx = self.goal.infcx;
let param_env = self.goal.goal.param_env;
let mut orig_values = self.goal.orig_values.to_vec();
@@ -211,7 +203,7 @@ impl<'a, 'db> InspectCandidate<'a, 'db> {
inspect::ProbeStep::RecordImplArgs { impl_args } => {
let impl_args = instantiate_canonical_state(
infcx,
- Span::dummy(),
+ span,
param_env,
&mut orig_values,
impl_args,
@@ -219,7 +211,7 @@ impl<'a, 'db> InspectCandidate<'a, 'db> {
let () = instantiate_canonical_state(
infcx,
- Span::dummy(),
+ span,
param_env,
&mut orig_values,
self.final_state,
@@ -246,11 +238,12 @@ impl<'a, 'db> InspectCandidate<'a, 'db> {
&self,
source: GoalSource,
goal: Goal<'db, Predicate<'db>>,
+ span: Span,
) -> InspectGoal<'a, 'db> {
let infcx = self.goal.infcx;
match goal.predicate.kind().no_bound_vars() {
Some(PredicateKind::NormalizesTo(NormalizesTo { alias, term })) => {
- let unconstrained_term = infcx.next_term_var_of_kind(term);
+ let unconstrained_term = infcx.next_term_var_of_kind(term, span);
let goal =
goal.with(infcx.interner, NormalizesTo { alias, term: unconstrained_term });
// We have to use a `probe` here as evaluating a `NormalizesTo` can constrain the
@@ -265,8 +258,7 @@ impl<'a, 'db> InspectCandidate<'a, 'db> {
// considering the constrained RHS, and pass the resulting certainty to
// `InspectGoal::new` so that the goal has the right result (and maintains
// the impression that we don't do this normalizes-to infer hack at all).
- let (nested, proof_tree) =
- infcx.evaluate_root_goal_for_proof_tree(goal, Span::dummy());
+ let (nested, proof_tree) = infcx.evaluate_root_goal_for_proof_tree(goal, span);
let nested_goals_result = nested.and_then(|nested| {
normalizes_to_term_hack.constrain_and(
infcx,
@@ -300,7 +292,7 @@ impl<'a, 'db> InspectCandidate<'a, 'db> {
// constraints, we get an ICE if we already applied the constraints
// from the chosen candidate.
let proof_tree =
- infcx.probe(|_| infcx.evaluate_root_goal_for_proof_tree(goal, Span::dummy()).1);
+ infcx.probe(|_| infcx.evaluate_root_goal_for_proof_tree(goal, span).1);
InspectGoal::new(infcx, self.goal.depth + 1, proof_tree, None, source)
}
}
@@ -469,6 +461,8 @@ impl<'a, 'db> InspectGoal<'a, 'db> {
pub(crate) trait ProofTreeVisitor<'db> {
type Result: VisitorResult;
+ fn span(&self) -> Span;
+
fn config(&self) -> InspectConfig {
InspectConfig { max_depth: 10 }
}
@@ -496,7 +490,7 @@ impl<'db> InferCtxt<'db> {
visitor: &mut V,
) -> V::Result {
let (_, proof_tree) = <&SolverContext<'db>>::from(self)
- .evaluate_root_goal_for_proof_tree(goal, Span::dummy());
+ .evaluate_root_goal_for_proof_tree(goal, visitor.span());
visitor.visit_goal(&InspectGoal::new(self, depth, proof_tree, None, GoalSource::Misc))
}
}