@@ -72,6 +72,7 @@ enum NegativeSolution {
72
72
/// goals, and transport what was learned back to the outer context.
73
73
pub ( crate ) struct Fulfill < ' s , ' db , I : Interner > {
74
74
solver : & ' s mut Solver < ' db , I > ,
75
+ subst : Substitution < I > ,
75
76
infer : InferenceTable < I > ,
76
77
77
78
/// The remaining goals to prove or refute
@@ -91,7 +92,7 @@ impl<'s, 'db, I: Interner> Fulfill<'s, 'db, I> {
91
92
fn new < T : Fold < I , I , Result = T > + HasInterner < Interner = I > + Clone > (
92
93
solver : & ' s mut Solver < ' db , I > ,
93
94
ucanonical_goal : & UCanonical < InEnvironment < T > > ,
94
- ) -> ( Self , Substitution < I > , InEnvironment < T :: Result > ) {
95
+ ) -> ( Self , InEnvironment < T :: Result > ) {
95
96
let ( infer, subst, canonical_goal) = InferenceTable :: from_canonical (
96
97
solver. program . interner ( ) ,
97
98
ucanonical_goal. universes ,
@@ -100,20 +101,21 @@ impl<'s, 'db, I: Interner> Fulfill<'s, 'db, I> {
100
101
let fulfill = Fulfill {
101
102
solver,
102
103
infer,
104
+ subst,
103
105
obligations : vec ! [ ] ,
104
106
constraints : FxHashSet :: default ( ) ,
105
107
cannot_prove : false ,
106
108
} ;
107
109
108
- ( fulfill, subst , canonical_goal)
110
+ ( fulfill, canonical_goal)
109
111
}
110
112
111
113
pub ( crate ) fn new_with_clause (
112
114
solver : & ' s mut Solver < ' db , I > ,
113
115
ucanonical_goal : & UCanonical < InEnvironment < DomainGoal < I > > > ,
114
116
clause : & Binders < ProgramClauseImplication < I > > ,
115
- ) -> Fallible < ( Self , Substitution < I > ) > {
116
- let ( mut fulfill, subst , canonical_goal) = Fulfill :: new ( solver, ucanonical_goal) ;
117
+ ) -> Fallible < Self > {
118
+ let ( mut fulfill, canonical_goal) = Fulfill :: new ( solver, ucanonical_goal) ;
117
119
118
120
let ProgramClauseImplication {
119
121
consequence,
@@ -123,7 +125,7 @@ impl<'s, 'db, I: Interner> Fulfill<'s, 'db, I> {
123
125
. infer
124
126
. instantiate_binders_existentially ( fulfill. solver . program . interner ( ) , clause) ;
125
127
126
- debug ! ( "the subst is {:?}" , subst) ;
128
+ debug ! ( "the subst is {:?}" , fulfill . subst) ;
127
129
128
130
if let Err ( e) = fulfill. unify (
129
131
& canonical_goal. environment ,
@@ -140,21 +142,21 @@ impl<'s, 'db, I: Interner> Fulfill<'s, 'db, I> {
140
142
}
141
143
}
142
144
143
- Ok ( ( fulfill, subst ) )
145
+ Ok ( fulfill)
144
146
}
145
147
146
148
pub ( crate ) fn new_with_simplification (
147
149
solver : & ' s mut Solver < ' db , I > ,
148
150
ucanonical_goal : & UCanonical < InEnvironment < Goal < I > > > ,
149
- ) -> Fallible < ( Self , Substitution < I > ) > {
150
- let ( mut fulfill, subst , canonical_goal) = Fulfill :: new ( solver, ucanonical_goal) ;
151
+ ) -> Fallible < Self > {
152
+ let ( mut fulfill, canonical_goal) = Fulfill :: new ( solver, ucanonical_goal) ;
151
153
152
154
if let Err ( e) = fulfill. push_goal ( & canonical_goal. environment , canonical_goal. goal . clone ( ) )
153
155
{
154
156
return Err ( e) ;
155
157
}
156
158
157
- Ok ( ( fulfill, subst ) )
159
+ Ok ( fulfill)
158
160
}
159
161
160
162
fn push_obligation ( & mut self , obligation : Obligation < I > ) {
@@ -438,11 +440,7 @@ impl<'s, 'db, I: Interner> Fulfill<'s, 'db, I> {
438
440
/// Try to fulfill all pending obligations and build the resulting
439
441
/// solution. The returned solution will transform `subst` substitution with
440
442
/// the outcome of type inference by updating the replacements it provides.
441
- pub ( super ) fn solve (
442
- mut self ,
443
- subst : Substitution < I > ,
444
- minimums : & mut Minimums ,
445
- ) -> Fallible < Solution < I > > {
443
+ pub ( super ) fn solve ( mut self , minimums : & mut Minimums ) -> Fallible < Solution < I > > {
446
444
let outcome = match self . fulfill ( minimums) {
447
445
Ok ( o) => o,
448
446
Err ( e) => return Err ( e) ,
@@ -459,7 +457,10 @@ impl<'s, 'db, I: Interner> Fulfill<'s, 'db, I> {
459
457
let constraints = self . constraints . into_iter ( ) . collect ( ) ;
460
458
let constrained = self . infer . canonicalize (
461
459
self . solver . program . interner ( ) ,
462
- & ConstrainedSubst { subst, constraints } ,
460
+ & ConstrainedSubst {
461
+ subst : self . subst ,
462
+ constraints,
463
+ } ,
463
464
) ;
464
465
return Ok ( Solution :: Unique ( constrained. quantified ) ) ;
465
466
}
@@ -470,7 +471,7 @@ impl<'s, 'db, I: Interner> Fulfill<'s, 'db, I> {
470
471
// inference as an ambiguous solution.
471
472
472
473
let interner = self . solver . program . interner ( ) ;
473
- let canonical_subst = self . infer . canonicalize ( interner, & subst) ;
474
+ let canonical_subst = self . infer . canonicalize ( interner, & self . subst ) ;
474
475
475
476
if canonical_subst. quantified . value . is_identity_subst ( interner) {
476
477
// In this case, we didn't learn *anything* definitively. So now, we
0 commit comments