Skip to content

Commit 6b56d57

Browse files
Make ProofTreeBuilder actually generic over interner
1 parent 5b792f6 commit 6b56d57

File tree

7 files changed

+100
-82
lines changed

7 files changed

+100
-82
lines changed

compiler/rustc_middle/src/ty/context.rs

+7
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,13 @@ impl<'tcx> Interner for TyCtxt<'tcx> {
220220
self.check_and_mk_args(def_id, args)
221221
}
222222

223+
fn mk_canonical_goal_evaluation_step(
224+
self,
225+
step: solve::inspect::CanonicalGoalEvaluationStep<TyCtxt<'tcx>>,
226+
) -> &'tcx solve::inspect::CanonicalGoalEvaluationStep<TyCtxt<'tcx>> {
227+
self.arena.alloc(step)
228+
}
229+
223230
fn parent(self, def_id: Self::DefId) -> Self::DefId {
224231
self.parent(def_id)
225232
}

compiler/rustc_trait_selection/src/solve/eval_ctxt/canonical.rs

+16-11
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ use crate::solve::{
1616
use rustc_data_structures::fx::FxHashSet;
1717
use rustc_index::IndexVec;
1818
use rustc_infer::infer::canonical::query_response::make_query_region_constraints;
19-
use rustc_infer::infer::canonical::CanonicalVarValues;
2019
use rustc_infer::infer::canonical::{CanonicalExt, QueryRegionConstraints};
2120
use rustc_infer::infer::RegionVariableOrigin;
2221
use rustc_infer::infer::{InferCtxt, InferOk};
@@ -32,22 +31,24 @@ use rustc_middle::ty::{self, BoundVar, GenericArgKind, Ty, TyCtxt, TypeFoldable}
3231
use rustc_next_trait_solver::canonicalizer::{CanonicalizeMode, Canonicalizer};
3332
use rustc_next_trait_solver::resolve::EagerResolver;
3433
use rustc_span::{Span, DUMMY_SP};
34+
use rustc_type_ir::CanonicalVarValues;
35+
use rustc_type_ir::{InferCtxtLike, Interner};
3536
use std::assert_matches::assert_matches;
3637
use std::iter;
3738
use std::ops::Deref;
3839

3940
trait ResponseT<'tcx> {
40-
fn var_values(&self) -> CanonicalVarValues<'tcx>;
41+
fn var_values(&self) -> CanonicalVarValues<TyCtxt<'tcx>>;
4142
}
4243

4344
impl<'tcx> ResponseT<'tcx> for Response<TyCtxt<'tcx>> {
44-
fn var_values(&self) -> CanonicalVarValues<'tcx> {
45+
fn var_values(&self) -> CanonicalVarValues<TyCtxt<'tcx>> {
4546
self.var_values
4647
}
4748
}
4849

4950
impl<'tcx, T> ResponseT<'tcx> for inspect::State<TyCtxt<'tcx>, T> {
50-
fn var_values(&self) -> CanonicalVarValues<'tcx> {
51+
fn var_values(&self) -> CanonicalVarValues<TyCtxt<'tcx>> {
5152
self.var_values
5253
}
5354
}
@@ -246,7 +247,7 @@ impl<'tcx> EvalCtxt<'_, InferCtxt<'tcx>> {
246247
infcx: &InferCtxt<'tcx>,
247248
original_values: &[ty::GenericArg<'tcx>],
248249
response: &Canonical<'tcx, T>,
249-
) -> CanonicalVarValues<'tcx> {
250+
) -> CanonicalVarValues<TyCtxt<'tcx>> {
250251
// FIXME: Longterm canonical queries should deal with all placeholders
251252
// created inside of the query directly instead of returning them to the
252253
// caller.
@@ -340,7 +341,7 @@ impl<'tcx> EvalCtxt<'_, InferCtxt<'tcx>> {
340341
infcx: &InferCtxt<'tcx>,
341342
param_env: ty::ParamEnv<'tcx>,
342343
original_values: &[ty::GenericArg<'tcx>],
343-
var_values: CanonicalVarValues<'tcx>,
344+
var_values: CanonicalVarValues<TyCtxt<'tcx>>,
344345
) {
345346
assert_eq!(original_values.len(), var_values.len());
346347

@@ -379,13 +380,17 @@ impl<'tcx> EvalCtxt<'_, InferCtxt<'tcx>> {
379380
/// evaluating a goal. The `var_values` not only include the bound variables
380381
/// of the query input, but also contain all unconstrained inference vars
381382
/// created while evaluating this goal.
382-
pub(in crate::solve) fn make_canonical_state<'tcx, T: TypeFoldable<TyCtxt<'tcx>>>(
383-
infcx: &InferCtxt<'tcx>,
384-
var_values: &[ty::GenericArg<'tcx>],
383+
pub(in crate::solve) fn make_canonical_state<
384+
Infcx: InferCtxtLike<Interner = I>,
385+
I: Interner,
386+
T: TypeFoldable<I>,
387+
>(
388+
infcx: &Infcx,
389+
var_values: &[I::GenericArg],
385390
max_input_universe: ty::UniverseIndex,
386391
data: T,
387-
) -> inspect::CanonicalState<TyCtxt<'tcx>, T> {
388-
let var_values = CanonicalVarValues { var_values: infcx.tcx.mk_args(var_values) };
392+
) -> inspect::CanonicalState<I, T> {
393+
let var_values = CanonicalVarValues { var_values: infcx.interner().mk_args(var_values) };
389394
let state = inspect::State { var_values, data };
390395
let state = state.fold_with(&mut EagerResolver::new(infcx));
391396
Canonicalizer::canonicalize(

compiler/rustc_trait_selection/src/solve/eval_ctxt/mod.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ pub struct EvalCtxt<
9595
// evaluation code.
9696
tainted: Result<(), NoSolution>,
9797

98-
pub(super) inspect: ProofTreeBuilder<I>,
98+
pub(super) inspect: ProofTreeBuilder<Infcx>,
9999
}
100100

101101
#[derive(derivative::Derivative)]
@@ -215,7 +215,7 @@ impl<'a, 'tcx> EvalCtxt<'a, InferCtxt<'tcx>> {
215215
tcx: TyCtxt<'tcx>,
216216
search_graph: &'a mut search_graph::SearchGraph<TyCtxt<'tcx>>,
217217
canonical_input: CanonicalInput<'tcx>,
218-
canonical_goal_evaluation: &mut ProofTreeBuilder<TyCtxt<'tcx>>,
218+
canonical_goal_evaluation: &mut ProofTreeBuilder<InferCtxt<'tcx>>,
219219
f: impl FnOnce(&mut EvalCtxt<'_, InferCtxt<'tcx>>, Goal<'tcx, ty::Predicate<'tcx>>) -> R,
220220
) -> R {
221221
let intercrate = match search_graph.solver_mode() {
@@ -277,7 +277,7 @@ impl<'a, 'tcx> EvalCtxt<'a, InferCtxt<'tcx>> {
277277
tcx: TyCtxt<'tcx>,
278278
search_graph: &'a mut search_graph::SearchGraph<TyCtxt<'tcx>>,
279279
canonical_input: CanonicalInput<'tcx>,
280-
goal_evaluation: &mut ProofTreeBuilder<TyCtxt<'tcx>>,
280+
goal_evaluation: &mut ProofTreeBuilder<InferCtxt<'tcx>>,
281281
) -> QueryResult<'tcx> {
282282
let mut canonical_goal_evaluation =
283283
goal_evaluation.new_canonical_goal_evaluation(canonical_input);

0 commit comments

Comments
 (0)