Skip to content

Commit bac2557

Browse files
Use SolverRelating in favor of TypeRelating in the old solver where possible
1 parent 6b0125c commit bac2557

File tree

3 files changed

+96
-42
lines changed

3 files changed

+96
-42
lines changed

compiler/rustc_infer/src/infer/at.rs

+77-33
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,13 @@
2626
//! things. (That system should probably be refactored.)
2727
2828
use rustc_middle::bug;
29+
use rustc_middle::ty::relate::solver_relating::RelateExt as NextSolverRelate;
2930
use rustc_middle::ty::{Const, ImplSubject};
3031

3132
use super::*;
3233
use crate::infer::relate::{Relate, TypeRelation};
3334
use crate::traits::Obligation;
35+
use crate::traits::solve::Goal;
3436

3537
/// Whether we should define opaque types or just treat them opaquely.
3638
///
@@ -109,14 +111,25 @@ impl<'a, 'tcx> At<'a, 'tcx> {
109111
where
110112
T: ToTrace<'tcx>,
111113
{
112-
let mut fields = CombineFields::new(
113-
self.infcx,
114-
ToTrace::to_trace(self.cause, expected, actual),
115-
self.param_env,
116-
define_opaque_types,
117-
);
118-
fields.sup().relate(expected, actual)?;
119-
Ok(InferOk { value: (), obligations: fields.into_obligations() })
114+
if self.infcx.next_trait_solver() {
115+
NextSolverRelate::relate(
116+
self.infcx,
117+
self.param_env,
118+
expected,
119+
ty::Contravariant,
120+
actual,
121+
)
122+
.map(|goals| self.goals_to_obligations(goals))
123+
} else {
124+
let mut fields = CombineFields::new(
125+
self.infcx,
126+
ToTrace::to_trace(self.cause, expected, actual),
127+
self.param_env,
128+
define_opaque_types,
129+
);
130+
fields.sup().relate(expected, actual)?;
131+
Ok(InferOk { value: (), obligations: fields.into_obligations() })
132+
}
120133
}
121134

122135
/// Makes `expected <: actual`.
@@ -129,14 +142,19 @@ impl<'a, 'tcx> At<'a, 'tcx> {
129142
where
130143
T: ToTrace<'tcx>,
131144
{
132-
let mut fields = CombineFields::new(
133-
self.infcx,
134-
ToTrace::to_trace(self.cause, expected, actual),
135-
self.param_env,
136-
define_opaque_types,
137-
);
138-
fields.sub().relate(expected, actual)?;
139-
Ok(InferOk { value: (), obligations: fields.into_obligations() })
145+
if self.infcx.next_trait_solver() {
146+
NextSolverRelate::relate(self.infcx, self.param_env, expected, ty::Covariant, actual)
147+
.map(|goals| self.goals_to_obligations(goals))
148+
} else {
149+
let mut fields = CombineFields::new(
150+
self.infcx,
151+
ToTrace::to_trace(self.cause, expected, actual),
152+
self.param_env,
153+
define_opaque_types,
154+
);
155+
fields.sub().relate(expected, actual)?;
156+
Ok(InferOk { value: (), obligations: fields.into_obligations() })
157+
}
140158
}
141159

142160
/// Makes `expected == actual`.
@@ -168,23 +186,29 @@ impl<'a, 'tcx> At<'a, 'tcx> {
168186
where
169187
T: Relate<TyCtxt<'tcx>>,
170188
{
171-
let mut fields = CombineFields::new(self.infcx, trace, self.param_env, define_opaque_types);
172-
fields.equate().relate(expected, actual)?;
173-
Ok(InferOk {
174-
value: (),
175-
obligations: fields
176-
.goals
177-
.into_iter()
178-
.map(|goal| {
179-
Obligation::new(
180-
self.infcx.tcx,
181-
fields.trace.cause.clone(),
182-
goal.param_env,
183-
goal.predicate,
184-
)
185-
})
186-
.collect(),
187-
})
189+
if self.infcx.next_trait_solver() {
190+
NextSolverRelate::relate(self.infcx, self.param_env, expected, ty::Invariant, actual)
191+
.map(|goals| self.goals_to_obligations(goals))
192+
} else {
193+
let mut fields =
194+
CombineFields::new(self.infcx, trace, self.param_env, define_opaque_types);
195+
fields.equate().relate(expected, actual)?;
196+
Ok(InferOk {
197+
value: (),
198+
obligations: fields
199+
.goals
200+
.into_iter()
201+
.map(|goal| {
202+
Obligation::new(
203+
self.infcx.tcx,
204+
fields.trace.cause.clone(),
205+
goal.param_env,
206+
goal.predicate,
207+
)
208+
})
209+
.collect(),
210+
})
211+
}
188212
}
189213

190214
pub fn relate<T>(
@@ -256,6 +280,26 @@ impl<'a, 'tcx> At<'a, 'tcx> {
256280
let value = fields.glb().relate(expected, actual)?;
257281
Ok(InferOk { value, obligations: fields.into_obligations() })
258282
}
283+
284+
fn goals_to_obligations(
285+
&self,
286+
goals: Vec<Goal<'tcx, ty::Predicate<'tcx>>>,
287+
) -> InferOk<'tcx, ()> {
288+
InferOk {
289+
value: (),
290+
obligations: goals
291+
.into_iter()
292+
.map(|goal| {
293+
Obligation::new(
294+
self.infcx.tcx,
295+
self.cause.clone(),
296+
goal.param_env,
297+
goal.predicate,
298+
)
299+
})
300+
.collect(),
301+
}
302+
}
259303
}
260304

261305
impl<'tcx> ToTrace<'tcx> for ImplSubject<'tcx> {

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -836,7 +836,7 @@ where
836836
lhs: T,
837837
rhs: T,
838838
) -> Result<Vec<Goal<I, I::Predicate>>, NoSolution> {
839-
self.delegate.relate(param_env, lhs, ty::Variance::Invariant, rhs)
839+
Ok(self.delegate.relate(param_env, lhs, ty::Variance::Invariant, rhs)?)
840840
}
841841

842842
pub(super) fn instantiate_binder_with_infer<T: TypeFoldable<I> + Copy>(

compiler/rustc_type_ir/src/relate/solver_relating.rs

+18-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
pub use rustc_type_ir::relate::*;
2-
use rustc_type_ir::solve::{Goal, NoSolution};
2+
use rustc_type_ir::solve::Goal;
33
use rustc_type_ir::{self as ty, InferCtxtLike, Interner};
44
use tracing::{debug, instrument};
55

@@ -12,14 +12,20 @@ pub trait RelateExt: InferCtxtLike {
1212
lhs: T,
1313
variance: ty::Variance,
1414
rhs: T,
15-
) -> Result<Vec<Goal<Self::Interner, <Self::Interner as Interner>::Predicate>>, NoSolution>;
15+
) -> Result<
16+
Vec<Goal<Self::Interner, <Self::Interner as Interner>::Predicate>>,
17+
TypeError<Self::Interner>,
18+
>;
1619

1720
fn eq_structurally_relating_aliases<T: Relate<Self::Interner>>(
1821
&self,
1922
param_env: <Self::Interner as Interner>::ParamEnv,
2023
lhs: T,
2124
rhs: T,
22-
) -> Result<Vec<Goal<Self::Interner, <Self::Interner as Interner>::Predicate>>, NoSolution>;
25+
) -> Result<
26+
Vec<Goal<Self::Interner, <Self::Interner as Interner>::Predicate>>,
27+
TypeError<Self::Interner>,
28+
>;
2329
}
2430

2531
impl<Infcx: InferCtxtLike> RelateExt for Infcx {
@@ -29,8 +35,10 @@ impl<Infcx: InferCtxtLike> RelateExt for Infcx {
2935
lhs: T,
3036
variance: ty::Variance,
3137
rhs: T,
32-
) -> Result<Vec<Goal<Self::Interner, <Self::Interner as Interner>::Predicate>>, NoSolution>
33-
{
38+
) -> Result<
39+
Vec<Goal<Self::Interner, <Self::Interner as Interner>::Predicate>>,
40+
TypeError<Self::Interner>,
41+
> {
3442
let mut relate =
3543
SolverRelating::new(self, StructurallyRelateAliases::No, variance, param_env);
3644
relate.relate(lhs, rhs)?;
@@ -42,8 +50,10 @@ impl<Infcx: InferCtxtLike> RelateExt for Infcx {
4250
param_env: <Self::Interner as Interner>::ParamEnv,
4351
lhs: T,
4452
rhs: T,
45-
) -> Result<Vec<Goal<Self::Interner, <Self::Interner as Interner>::Predicate>>, NoSolution>
46-
{
53+
) -> Result<
54+
Vec<Goal<Self::Interner, <Self::Interner as Interner>::Predicate>>,
55+
TypeError<Self::Interner>,
56+
> {
4757
let mut relate =
4858
SolverRelating::new(self, StructurallyRelateAliases::Yes, ty::Invariant, param_env);
4959
relate.relate(lhs, rhs)?;
@@ -66,7 +76,7 @@ where
6676
Infcx: InferCtxtLike<Interner = I>,
6777
I: Interner,
6878
{
69-
fn new(
79+
pub fn new(
7080
infcx: &'infcx Infcx,
7181
structurally_relate_aliases: StructurallyRelateAliases,
7282
ambient_variance: ty::Variance,

0 commit comments

Comments
 (0)