@@ -49,7 +49,6 @@ pub struct At<'a, 'tcx> {
4949
5050pub struct Trace < ' a , ' tcx > {
5151 at : At < ' a , ' tcx > ,
52- a_is_expected : bool ,
5352 trace : TypeTrace < ' tcx > ,
5453}
5554
@@ -106,23 +105,6 @@ pub trait ToTrace<'tcx>: Relate<'tcx> + Copy {
106105}
107106
108107impl < ' a , ' tcx > At < ' a , ' tcx > {
109- /// Makes `a <: b`, where `a` may or may not be expected.
110- ///
111- /// See [`At::trace_exp`] and [`Trace::sub`] for a version of
112- /// this method that only requires `T: Relate<'tcx>`
113- pub fn sub_exp < T > (
114- self ,
115- define_opaque_types : DefineOpaqueTypes ,
116- a_is_expected : bool ,
117- a : T ,
118- b : T ,
119- ) -> InferResult < ' tcx , ( ) >
120- where
121- T : ToTrace < ' tcx > ,
122- {
123- self . trace_exp ( a_is_expected, a, b) . sub ( define_opaque_types, a, b)
124- }
125-
126108 /// Makes `actual <: expected`. For example, if type-checking a
127109 /// call like `foo(x)`, where `foo: fn(i32)`, you might have
128110 /// `sup(i32, x)`, since the "expected" type is the type that
@@ -139,7 +121,7 @@ impl<'a, 'tcx> At<'a, 'tcx> {
139121 where
140122 T : ToTrace < ' tcx > ,
141123 {
142- self . sub_exp ( define_opaque_types , false , actual, expected)
124+ self . trace ( expected , actual) . sup ( define_opaque_types , expected, actual )
143125 }
144126
145127 /// Makes `expected <: actual`.
@@ -155,24 +137,7 @@ impl<'a, 'tcx> At<'a, 'tcx> {
155137 where
156138 T : ToTrace < ' tcx > ,
157139 {
158- self . sub_exp ( define_opaque_types, true , expected, actual)
159- }
160-
161- /// Makes `expected <: actual`.
162- ///
163- /// See [`At::trace_exp`] and [`Trace::eq`] for a version of
164- /// this method that only requires `T: Relate<'tcx>`
165- pub fn eq_exp < T > (
166- self ,
167- define_opaque_types : DefineOpaqueTypes ,
168- a_is_expected : bool ,
169- a : T ,
170- b : T ,
171- ) -> InferResult < ' tcx , ( ) >
172- where
173- T : ToTrace < ' tcx > ,
174- {
175- self . trace_exp ( a_is_expected, a, b) . eq ( define_opaque_types, a, b)
140+ self . trace ( expected, actual) . sub ( define_opaque_types, expected, actual)
176141 }
177142
178143 /// Makes `expected <: actual`.
@@ -261,48 +226,50 @@ impl<'a, 'tcx> At<'a, 'tcx> {
261226 where
262227 T : ToTrace < ' tcx > ,
263228 {
264- self . trace_exp ( true , expected, actual)
229+ let trace = ToTrace :: to_trace ( self . cause , true , expected, actual) ;
230+ Trace { at : self , trace }
265231 }
232+ }
266233
267- /// Like `trace`, but the expected value is determined by the
268- /// boolean argument (if true, then the first argument `a` is the
269- /// "expected" value).
270- pub fn trace_exp < T > ( self , a_is_expected : bool , a : T , b : T ) -> Trace < ' a , ' tcx >
234+ impl < ' a , ' tcx > Trace < ' a , ' tcx > {
235+ /// Makes `a <: b`.
236+ # [ instrument ( skip ( self ) , level = "debug" ) ]
237+ pub fn sub < T > ( self , define_opaque_types : DefineOpaqueTypes , a : T , b : T ) -> InferResult < ' tcx , ( ) >
271238 where
272- T : ToTrace < ' tcx > ,
239+ T : Relate < ' tcx > ,
273240 {
274- let trace = ToTrace :: to_trace ( self . cause , a_is_expected, a, b) ;
275- Trace { at : self , trace, a_is_expected }
241+ let Trace { at, trace } = self ;
242+ let mut fields = at. infcx . combine_fields ( trace, at. param_env , define_opaque_types) ;
243+ fields
244+ . sub ( )
245+ . relate ( a, b)
246+ . map ( move |_| InferOk { value : ( ) , obligations : fields. obligations } )
276247 }
277- }
278248
279- impl < ' a , ' tcx > Trace < ' a , ' tcx > {
280- /// Makes `a <: b` where `a` may or may not be expected (if
281- /// `a_is_expected` is true, then `a` is expected).
249+ /// Makes `a :> b`.
282250 #[ instrument( skip( self ) , level = "debug" ) ]
283- pub fn sub < T > ( self , define_opaque_types : DefineOpaqueTypes , a : T , b : T ) -> InferResult < ' tcx , ( ) >
251+ pub fn sup < T > ( self , define_opaque_types : DefineOpaqueTypes , a : T , b : T ) -> InferResult < ' tcx , ( ) >
284252 where
285253 T : Relate < ' tcx > ,
286254 {
287- let Trace { at, trace, a_is_expected } = self ;
255+ let Trace { at, trace } = self ;
288256 let mut fields = at. infcx . combine_fields ( trace, at. param_env , define_opaque_types) ;
289257 fields
290- . sub ( a_is_expected )
258+ . sup ( )
291259 . relate ( a, b)
292260 . map ( move |_| InferOk { value : ( ) , obligations : fields. obligations } )
293261 }
294262
295- /// Makes `a == b`; the expectation is set by the call to
296- /// `trace()`.
263+ /// Makes `a == b`.
297264 #[ instrument( skip( self ) , level = "debug" ) ]
298265 pub fn eq < T > ( self , define_opaque_types : DefineOpaqueTypes , a : T , b : T ) -> InferResult < ' tcx , ( ) >
299266 where
300267 T : Relate < ' tcx > ,
301268 {
302- let Trace { at, trace, a_is_expected } = self ;
269+ let Trace { at, trace } = self ;
303270 let mut fields = at. infcx . combine_fields ( trace, at. param_env , define_opaque_types) ;
304271 fields
305- . equate ( StructurallyRelateAliases :: No , a_is_expected )
272+ . equate ( StructurallyRelateAliases :: No )
306273 . relate ( a, b)
307274 . map ( move |_| InferOk { value : ( ) , obligations : fields. obligations } )
308275 }
@@ -314,11 +281,11 @@ impl<'a, 'tcx> Trace<'a, 'tcx> {
314281 where
315282 T : Relate < ' tcx > ,
316283 {
317- let Trace { at, trace, a_is_expected } = self ;
284+ let Trace { at, trace } = self ;
318285 debug_assert ! ( at. infcx. next_trait_solver( ) ) ;
319286 let mut fields = at. infcx . combine_fields ( trace, at. param_env , DefineOpaqueTypes :: No ) ;
320287 fields
321- . equate ( StructurallyRelateAliases :: Yes , a_is_expected )
288+ . equate ( StructurallyRelateAliases :: Yes )
322289 . relate ( a, b)
323290 . map ( move |_| InferOk { value : ( ) , obligations : fields. obligations } )
324291 }
@@ -328,10 +295,10 @@ impl<'a, 'tcx> Trace<'a, 'tcx> {
328295 where
329296 T : Relate < ' tcx > ,
330297 {
331- let Trace { at, trace, a_is_expected } = self ;
298+ let Trace { at, trace } = self ;
332299 let mut fields = at. infcx . combine_fields ( trace, at. param_env , define_opaque_types) ;
333300 fields
334- . lub ( a_is_expected )
301+ . lub ( )
335302 . relate ( a, b)
336303 . map ( move |t| InferOk { value : t, obligations : fields. obligations } )
337304 }
@@ -341,10 +308,10 @@ impl<'a, 'tcx> Trace<'a, 'tcx> {
341308 where
342309 T : Relate < ' tcx > ,
343310 {
344- let Trace { at, trace, a_is_expected } = self ;
311+ let Trace { at, trace } = self ;
345312 let mut fields = at. infcx . combine_fields ( trace, at. param_env , define_opaque_types) ;
346313 fields
347- . glb ( a_is_expected )
314+ . glb ( )
348315 . relate ( a, b)
349316 . map ( move |t| InferOk { value : t, obligations : fields. obligations } )
350317 }
0 commit comments