1
- use crate :: infer:: { InferenceTable , ParameterEnaVariable , ParameterEnaVariableExt } ;
2
- use crate :: recursive:: { Minimums , RecursiveInferenceTableImpl , Solver } ;
1
+ use crate :: recursive:: { Minimums , Solver } ;
3
2
use crate :: solve:: { Guidance , Solution } ;
4
3
use chalk_ir:: cast:: Cast ;
5
4
use chalk_ir:: fold:: Fold ;
@@ -9,8 +8,8 @@ use chalk_ir::zip::Zip;
9
8
use chalk_ir:: { debug, debug_heading} ;
10
9
use chalk_ir:: {
11
10
Binders , Canonical , ConstrainedSubst , Constraint , DomainGoal , Environment , EqGoal , Fallible ,
12
- Goal , GoalData , InEnvironment , LifetimeOutlives , NoSolution , ProgramClauseImplication ,
13
- QuantifierKind , Substitution , UCanonical , UniverseMap , WhereClause ,
11
+ GenericArg , Goal , GoalData , InEnvironment , LifetimeOutlives , NoSolution ,
12
+ ProgramClauseImplication , QuantifierKind , Substitution , UCanonical , UniverseMap , WhereClause ,
14
13
} ;
15
14
use rustc_hash:: FxHashSet ;
16
15
use std:: fmt:: Debug ;
@@ -46,7 +45,7 @@ enum Obligation<I: Interner> {
46
45
/// so that we can update inference state accordingly.
47
46
#[ derive( Clone , Debug ) ]
48
47
struct PositiveSolution < I : Interner > {
49
- free_vars : Vec < ParameterEnaVariable < I > > ,
48
+ free_vars : Vec < GenericArg < I > > ,
50
49
universes : UniverseMap ,
51
50
solution : Solution < I > ,
52
51
}
@@ -79,7 +78,7 @@ pub(crate) trait RecursiveInferenceTable<I: Interner> {
79
78
& mut self ,
80
79
interner : & I ,
81
80
value : & T ,
82
- ) -> ( Canonical < T :: Result > , Vec < ParameterEnaVariable < I > > )
81
+ ) -> ( Canonical < T :: Result > , Vec < GenericArg < I > > )
83
82
where
84
83
T : Fold < I > ,
85
84
T :: Result : HasInterner < Interner = I > ;
@@ -149,18 +148,15 @@ pub(crate) struct Fulfill<'s, 'db, I: Interner, Infer: RecursiveInferenceTable<I
149
148
cannot_prove : bool ,
150
149
}
151
150
152
- impl < ' s , ' db , I : Interner > Fulfill < ' s , ' db , I , RecursiveInferenceTableImpl < I > > {
153
- fn new < T : Fold < I , I , Result = T > + HasInterner < Interner = I > + Clone > (
151
+ impl < ' s , ' db , I : Interner , Infer : RecursiveInferenceTable < I > > Fulfill < ' s , ' db , I , Infer > {
152
+ pub ( crate ) fn new_with_clause (
154
153
solver : & ' s mut Solver < ' db , I > ,
155
- ucanonical_goal : & UCanonical < InEnvironment < T > > ,
156
- ) -> ( Self , InEnvironment < T :: Result > ) {
157
- let ( infer, subst, canonical_goal) = InferenceTable :: from_canonical (
158
- solver. program . interner ( ) ,
159
- ucanonical_goal. universes ,
160
- & ucanonical_goal. canonical ,
161
- ) ;
162
- let infer = crate :: recursive:: RecursiveInferenceTableImpl { infer } ;
163
- let fulfill = Fulfill {
154
+ infer : Infer ,
155
+ subst : Substitution < I > ,
156
+ canonical_goal : InEnvironment < DomainGoal < I > > ,
157
+ clause : & Binders < ProgramClauseImplication < I > > ,
158
+ ) -> Fallible < Self > {
159
+ let mut fulfill = Fulfill {
164
160
solver,
165
161
infer,
166
162
subst,
@@ -169,16 +165,6 @@ impl<'s, 'db, I: Interner> Fulfill<'s, 'db, I, RecursiveInferenceTableImpl<I>> {
169
165
cannot_prove : false ,
170
166
} ;
171
167
172
- ( fulfill, canonical_goal)
173
- }
174
-
175
- pub ( crate ) fn new_with_clause (
176
- solver : & ' s mut Solver < ' db , I > ,
177
- ucanonical_goal : & UCanonical < InEnvironment < DomainGoal < I > > > ,
178
- clause : & Binders < ProgramClauseImplication < I > > ,
179
- ) -> Fallible < Self > {
180
- let ( mut fulfill, canonical_goal) = Fulfill :: new ( solver, ucanonical_goal) ;
181
-
182
168
let ProgramClauseImplication {
183
169
consequence,
184
170
conditions,
@@ -209,9 +195,18 @@ impl<'s, 'db, I: Interner> Fulfill<'s, 'db, I, RecursiveInferenceTableImpl<I>> {
209
195
210
196
pub ( crate ) fn new_with_simplification (
211
197
solver : & ' s mut Solver < ' db , I > ,
212
- ucanonical_goal : & UCanonical < InEnvironment < Goal < I > > > ,
198
+ infer : Infer ,
199
+ subst : Substitution < I > ,
200
+ canonical_goal : InEnvironment < Goal < I > > ,
213
201
) -> Fallible < Self > {
214
- let ( mut fulfill, canonical_goal) = Fulfill :: new ( solver, ucanonical_goal) ;
202
+ let mut fulfill = Fulfill {
203
+ solver,
204
+ infer,
205
+ subst,
206
+ obligations : vec ! [ ] ,
207
+ constraints : FxHashSet :: default ( ) ,
208
+ cannot_prove : false ,
209
+ } ;
215
210
216
211
if let Err ( e) = fulfill. push_goal ( & canonical_goal. environment , canonical_goal. goal . clone ( ) )
217
212
{
@@ -383,7 +378,7 @@ impl<'s, 'db, I: Interner> Fulfill<'s, 'db, I, RecursiveInferenceTableImpl<I>> {
383
378
/// be mapped into our variables with `free_vars`.
384
379
fn apply_solution (
385
380
& mut self ,
386
- free_vars : Vec < ParameterEnaVariable < I > > ,
381
+ free_vars : Vec < GenericArg < I > > ,
387
382
universes : UniverseMap ,
388
383
subst : Canonical < ConstrainedSubst < I > > ,
389
384
) {
@@ -406,8 +401,7 @@ impl<'s, 'db, I: Interner> Fulfill<'s, 'db, I, RecursiveInferenceTableImpl<I>> {
406
401
407
402
for ( i, free_var) in free_vars. into_iter ( ) . enumerate ( ) {
408
403
let subst_value = subst. at ( self . interner ( ) , i) ;
409
- let free_value = free_var. to_generic_arg ( self . interner ( ) ) ;
410
- self . unify ( empty_env, & free_value, subst_value)
404
+ self . unify ( empty_env, & free_var, subst_value)
411
405
. unwrap_or_else ( |err| {
412
406
panic ! (
413
407
"apply_solution failed with free_var={:?}, subst_value={:?}: {:?}" ,
0 commit comments