Skip to content

Commit 81d9951

Browse files
Use SolverRelating in new solver
1 parent b7aaeae commit 81d9951

File tree

5 files changed

+66
-40
lines changed

5 files changed

+66
-40
lines changed

compiler/rustc_infer/src/infer/context.rs

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
///! Definition of `InferCtxtLike` from the librarified type layer.
22
use rustc_hir::def_id::{DefId, LocalDefId};
33
use rustc_middle::infer::unify_key::EffectVarValue;
4-
use rustc_middle::traits::solve::{Goal, NoSolution, SolverMode};
4+
use rustc_middle::traits::solve::SolverMode;
55
use rustc_middle::traits::ObligationCause;
66
use rustc_middle::ty::fold::TypeFoldable;
77
use rustc_middle::ty::{self, Ty, TyCtxt};
88
use rustc_span::{ErrorGuaranteed, DUMMY_SP};
99
use rustc_type_ir::relate::combine::PredicateEmittingRelation;
10-
use rustc_type_ir::relate::Relate;
1110
use rustc_type_ir::InferCtxtLike;
1211

1312
use super::{BoundRegionConversionTime, InferCtxt, SubregionOrigin};
@@ -134,26 +133,6 @@ impl<'tcx> InferCtxtLike for InferCtxt<'tcx> {
134133
self.enter_forall(value, f)
135134
}
136135

137-
fn relate<T: Relate<TyCtxt<'tcx>>>(
138-
&self,
139-
param_env: ty::ParamEnv<'tcx>,
140-
lhs: T,
141-
variance: ty::Variance,
142-
rhs: T,
143-
) -> Result<Vec<Goal<'tcx, ty::Predicate<'tcx>>>, NoSolution> {
144-
self.at(&ObligationCause::dummy(), param_env).relate_no_trace(lhs, variance, rhs)
145-
}
146-
147-
fn eq_structurally_relating_aliases<T: Relate<TyCtxt<'tcx>>>(
148-
&self,
149-
param_env: ty::ParamEnv<'tcx>,
150-
lhs: T,
151-
rhs: T,
152-
) -> Result<Vec<Goal<'tcx, ty::Predicate<'tcx>>>, NoSolution> {
153-
self.at(&ObligationCause::dummy(), param_env)
154-
.eq_structurally_relating_aliases_no_trace(lhs, rhs)
155-
}
156-
157136
fn shallow_resolve(&self, ty: Ty<'tcx>) -> Ty<'tcx> {
158137
self.shallow_resolve(ty)
159138
}

compiler/rustc_next_trait_solver/src/relate.rs

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,58 @@
11
use rustc_type_ir::error::{ExpectedFound, TypeError};
22
use rustc_type_ir::inherent::*;
33
pub use rustc_type_ir::relate::*;
4-
use rustc_type_ir::solve::Goal;
4+
use rustc_type_ir::solve::{Goal, NoSolution};
55
use rustc_type_ir::{self as ty, InferCtxtLike, Interner};
66
use tracing::{debug, instrument};
77

88
use self::combine::PredicateEmittingRelation;
99

10+
pub trait RelateExt: InferCtxtLike {
11+
fn relate<T: Relate<Self::Interner>>(
12+
&self,
13+
param_env: <Self::Interner as Interner>::ParamEnv,
14+
lhs: T,
15+
variance: ty::Variance,
16+
rhs: T,
17+
) -> Result<Vec<Goal<Self::Interner, <Self::Interner as Interner>::Predicate>>, NoSolution>;
18+
19+
fn eq_structurally_relating_aliases<T: Relate<Self::Interner>>(
20+
&self,
21+
param_env: <Self::Interner as Interner>::ParamEnv,
22+
lhs: T,
23+
rhs: T,
24+
) -> Result<Vec<Goal<Self::Interner, <Self::Interner as Interner>::Predicate>>, NoSolution>;
25+
}
26+
27+
impl<Infcx: InferCtxtLike> RelateExt for Infcx {
28+
fn relate<T: Relate<Self::Interner>>(
29+
&self,
30+
param_env: <Self::Interner as Interner>::ParamEnv,
31+
lhs: T,
32+
variance: ty::Variance,
33+
rhs: T,
34+
) -> Result<Vec<Goal<Self::Interner, <Self::Interner as Interner>::Predicate>>, NoSolution>
35+
{
36+
let mut relate =
37+
SolverRelating::new(self, StructurallyRelateAliases::No, variance, param_env);
38+
relate.relate(lhs, rhs)?;
39+
Ok(relate.goals)
40+
}
41+
42+
fn eq_structurally_relating_aliases<T: Relate<Self::Interner>>(
43+
&self,
44+
param_env: <Self::Interner as Interner>::ParamEnv,
45+
lhs: T,
46+
rhs: T,
47+
) -> Result<Vec<Goal<Self::Interner, <Self::Interner as Interner>::Predicate>>, NoSolution>
48+
{
49+
let mut relate =
50+
SolverRelating::new(self, StructurallyRelateAliases::Yes, ty::Invariant, param_env);
51+
relate.relate(lhs, rhs)?;
52+
Ok(relate.goals)
53+
}
54+
}
55+
1056
#[allow(unused)]
1157
/// Enforce that `a` is equal to or a subtype of `b`.
1258
pub struct SolverRelating<'infcx, Infcx, I: Interner> {
@@ -22,6 +68,20 @@ where
2268
Infcx: InferCtxtLike<Interner = I>,
2369
I: Interner,
2470
{
71+
fn new(
72+
infcx: &'infcx Infcx,
73+
structurally_relate_aliases: StructurallyRelateAliases,
74+
ambient_variance: ty::Variance,
75+
param_env: I::ParamEnv,
76+
) -> Self {
77+
SolverRelating {
78+
infcx,
79+
structurally_relate_aliases,
80+
ambient_variance,
81+
param_env,
82+
goals: vec![],
83+
}
84+
}
2585
}
2686

2787
impl<Infcx, I> TypeRelation<I> for SolverRelating<'_, Infcx, I>

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use tracing::{instrument, trace};
1919

2020
use crate::canonicalizer::{CanonicalizeMode, Canonicalizer};
2121
use crate::delegate::SolverDelegate;
22+
use crate::relate::RelateExt;
2223
use crate::resolve::EagerResolver;
2324
use crate::solve::eval_ctxt::NestedGoals;
2425
use crate::solve::{

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use tracing::{instrument, trace};
1414

1515
use crate::coherence;
1616
use crate::delegate::SolverDelegate;
17+
use crate::relate::RelateExt;
1718
use crate::solve::inspect::{self, ProofTreeBuilder};
1819
use crate::solve::search_graph::SearchGraph;
1920
use crate::solve::{

compiler/rustc_type_ir/src/infer_ctxt.rs

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::fold::TypeFoldable;
22
use crate::relate::combine::PredicateEmittingRelation;
3-
use crate::relate::{Relate, RelateResult};
4-
use crate::solve::{Goal, NoSolution, SolverMode};
3+
use crate::relate::RelateResult;
4+
use crate::solve::SolverMode;
55
use crate::{self as ty, Interner};
66

77
pub trait InferCtxtLike: Sized {
@@ -90,21 +90,6 @@ pub trait InferCtxtLike: Sized {
9090

9191
fn set_tainted_by_errors(&self, e: <Self::Interner as Interner>::ErrorGuaranteed);
9292

93-
fn relate<T: Relate<Self::Interner>>(
94-
&self,
95-
param_env: <Self::Interner as Interner>::ParamEnv,
96-
lhs: T,
97-
variance: ty::Variance,
98-
rhs: T,
99-
) -> Result<Vec<Goal<Self::Interner, <Self::Interner as Interner>::Predicate>>, NoSolution>;
100-
101-
fn eq_structurally_relating_aliases<T: Relate<Self::Interner>>(
102-
&self,
103-
param_env: <Self::Interner as Interner>::ParamEnv,
104-
lhs: T,
105-
rhs: T,
106-
) -> Result<Vec<Goal<Self::Interner, <Self::Interner as Interner>::Predicate>>, NoSolution>;
107-
10893
fn shallow_resolve(
10994
&self,
11095
ty: <Self::Interner as Interner>::Ty,

0 commit comments

Comments
 (0)