1
1
use anyhow:: bail;
2
- use contracts :: requires ;
2
+
3
3
use fn_error_context:: context;
4
4
use formality_prove:: Env ;
5
- use formality_rust:: grammar:: {
6
- AssociatedTy , AssociatedTyBoundData , AssociatedTyValue , AssociatedTyValueBoundData , Fn ,
7
- FnBoundData , ImplItem , NegTraitImpl , NegTraitImplBoundData , TraitBoundData , TraitImpl ,
8
- TraitImplBoundData , TraitItem , WhereClause ,
5
+ use formality_rust:: {
6
+ grammar:: {
7
+ AssociatedTy , AssociatedTyBoundData , AssociatedTyValue , AssociatedTyValueBoundData , Fn ,
8
+ FnBoundData , ImplItem , NegTraitImpl , NegTraitImplBoundData , TraitBoundData , TraitImpl ,
9
+ TraitImplBoundData , TraitItem ,
10
+ } ,
11
+ prove:: ToWcs ,
9
12
} ;
10
13
use formality_types:: {
11
14
cast:: Downcasted ,
12
15
grammar:: { Binder , Fallible , Relation , Substitution , Wcs } ,
13
16
term:: Term ,
14
- visit:: Visit ,
15
17
} ;
16
18
17
19
impl super :: Check < ' _ > {
@@ -69,16 +71,20 @@ impl super::Check<'_> {
69
71
Ok ( ( ) )
70
72
}
71
73
72
- #[ requires( assumptions. iter( ) . all( |a| a. references_only_placeholder_variables( ) ) ) ]
73
74
fn check_trait_impl_item (
74
75
& self ,
75
76
env : & Env ,
76
- assumptions : & [ WhereClause ] ,
77
+ assumptions : impl ToWcs ,
77
78
trait_items : & [ TraitItem ] ,
78
79
impl_item : & ImplItem ,
79
80
) -> Fallible < ( ) > {
81
+ let assumptions: Wcs = assumptions. to_wcs ( ) ;
82
+ assert ! (
83
+ env. only_universal_variables( ) && env. encloses( ( & assumptions, trait_items, impl_item) )
84
+ ) ;
85
+
80
86
match impl_item {
81
- ImplItem :: Fn ( v) => self . check_fn_in_impl ( env, assumptions, trait_items, v) ,
87
+ ImplItem :: Fn ( v) => self . check_fn_in_impl ( env, & assumptions, trait_items, v) ,
82
88
ImplItem :: AssociatedTyValue ( v) => {
83
89
self . check_associated_ty_value ( env, assumptions, trait_items, v)
84
90
}
@@ -88,12 +94,13 @@ impl super::Check<'_> {
88
94
fn check_fn_in_impl (
89
95
& self ,
90
96
env : & Env ,
91
- impl_assumptions : & [ WhereClause ] ,
97
+ impl_assumptions : impl ToWcs ,
92
98
trait_items : & [ TraitItem ] ,
93
99
ii_fn : & Fn ,
94
100
) -> Fallible < ( ) > {
101
+ let impl_assumptions: Wcs = impl_assumptions. to_wcs ( ) ;
95
102
assert ! (
96
- env. only_universal_variables( ) && env. encloses( ( impl_assumptions, trait_items, ii_fn) )
103
+ env. only_universal_variables( ) && env. encloses( ( & impl_assumptions, trait_items, ii_fn) )
97
104
) ;
98
105
99
106
// Find the corresponding function from the trait:
@@ -108,7 +115,7 @@ impl super::Check<'_> {
108
115
109
116
tracing:: debug!( ?ti_fn) ;
110
117
111
- self . check_fn ( env, impl_assumptions, ii_fn) ?;
118
+ self . check_fn ( env, & impl_assumptions, ii_fn) ?;
112
119
113
120
let mut env = env. clone ( ) ;
114
121
let (
@@ -128,7 +135,7 @@ impl super::Check<'_> {
128
135
129
136
self . prove_goal (
130
137
& env,
131
- ( impl_assumptions, & ti_where_clauses) ,
138
+ ( & impl_assumptions, & ti_where_clauses) ,
132
139
& ii_where_clauses,
133
140
) ?;
134
141
@@ -143,14 +150,14 @@ impl super::Check<'_> {
143
150
for ( ii_input_ty, ti_input_ty) in ii_input_tys. iter ( ) . zip ( & ti_input_tys) {
144
151
self . prove_goal (
145
152
& env,
146
- ( impl_assumptions, & ii_where_clauses) ,
153
+ ( & impl_assumptions, & ii_where_clauses) ,
147
154
Relation :: sub ( ti_input_ty, ii_input_ty) ,
148
155
) ?;
149
156
}
150
157
151
158
self . prove_goal (
152
159
& env,
153
- ( impl_assumptions, & ii_where_clauses) ,
160
+ ( & impl_assumptions, & ii_where_clauses) ,
154
161
Relation :: sub ( ii_output_ty, ti_output_ty) ,
155
162
) ?;
156
163
@@ -161,10 +168,17 @@ impl super::Check<'_> {
161
168
fn check_associated_ty_value (
162
169
& self ,
163
170
impl_env : & Env ,
164
- impl_assumptions : & [ WhereClause ] ,
171
+ impl_assumptions : impl ToWcs ,
165
172
trait_items : & [ TraitItem ] ,
166
173
impl_value : & AssociatedTyValue ,
167
174
) -> Fallible < ( ) > {
175
+ let impl_assumptions: Wcs = impl_assumptions. to_wcs ( ) ;
176
+
177
+ assert ! (
178
+ impl_env. only_universal_variables( )
179
+ && impl_env. encloses( ( & impl_assumptions, trait_items, impl_value) )
180
+ ) ;
181
+
168
182
let AssociatedTyValue { id, binder } = impl_value;
169
183
170
184
let trait_associated_ty = match trait_items
@@ -191,24 +205,24 @@ impl super::Check<'_> {
191
205
192
206
self . prove_where_clauses_well_formed (
193
207
& env,
194
- ( impl_assumptions, & ii_where_clauses) ,
208
+ ( & impl_assumptions, & ii_where_clauses) ,
195
209
& ii_where_clauses,
196
210
) ?;
197
211
198
212
self . prove_goal (
199
213
& env,
200
- ( impl_assumptions, & ti_where_clauses) ,
214
+ ( & impl_assumptions, & ti_where_clauses) ,
201
215
& ii_where_clauses,
202
216
) ?;
203
217
204
218
self . prove_goal (
205
219
& env,
206
- ( impl_assumptions, & ii_where_clauses) ,
220
+ ( & impl_assumptions, & ii_where_clauses) ,
207
221
ii_ty. well_formed ( ) ,
208
222
) ?;
209
223
210
224
let ensures: Wcs = ti_ensures. iter ( ) . map ( |e| e. to_wc ( & ii_ty) ) . collect ( ) ;
211
- self . prove_goal ( & env, ( impl_assumptions, & ii_where_clauses) , ensures) ?;
225
+ self . prove_goal ( & env, ( & impl_assumptions, & ii_where_clauses) , ensures) ?;
212
226
213
227
Ok ( ( ) )
214
228
}
0 commit comments