@@ -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
@@ -105,23 +104,6 @@ pub trait ToTrace<'tcx>: Relate<'tcx> + Copy {
105104}
106105
107106impl < ' a , ' tcx > At < ' a , ' tcx > {
108- /// Makes `a <: b`, where `a` may or may not be expected.
109- ///
110- /// See [`At::trace_exp`] and [`Trace::sub`] for a version of
111- /// this method that only requires `T: Relate<'tcx>`
112- pub fn sub_exp < T > (
113- self ,
114- define_opaque_types : DefineOpaqueTypes ,
115- a_is_expected : bool ,
116- a : T ,
117- b : T ,
118- ) -> InferResult < ' tcx , ( ) >
119- where
120- T : ToTrace < ' tcx > ,
121- {
122- self . trace_exp ( a_is_expected, a, b) . sub ( define_opaque_types, a, b)
123- }
124-
125107 /// Makes `actual <: expected`. For example, if type-checking a
126108 /// call like `foo(x)`, where `foo: fn(i32)`, you might have
127109 /// `sup(i32, x)`, since the "expected" type is the type that
@@ -138,7 +120,7 @@ impl<'a, 'tcx> At<'a, 'tcx> {
138120 where
139121 T : ToTrace < ' tcx > ,
140122 {
141- self . sub_exp ( define_opaque_types , false , actual, expected)
123+ self . trace ( expected , actual) . sup ( define_opaque_types , expected, actual )
142124 }
143125
144126 /// Makes `expected <: actual`.
@@ -154,24 +136,7 @@ impl<'a, 'tcx> At<'a, 'tcx> {
154136 where
155137 T : ToTrace < ' tcx > ,
156138 {
157- self . sub_exp ( define_opaque_types, true , expected, actual)
158- }
159-
160- /// Makes `expected <: actual`.
161- ///
162- /// See [`At::trace_exp`] and [`Trace::eq`] for a version of
163- /// this method that only requires `T: Relate<'tcx>`
164- pub fn eq_exp < T > (
165- self ,
166- define_opaque_types : DefineOpaqueTypes ,
167- a_is_expected : bool ,
168- a : T ,
169- b : T ,
170- ) -> InferResult < ' tcx , ( ) >
171- where
172- T : ToTrace < ' tcx > ,
173- {
174- self . trace_exp ( a_is_expected, a, b) . eq ( define_opaque_types, a, b)
139+ self . trace ( expected, actual) . sub ( define_opaque_types, expected, actual)
175140 }
176141
177142 /// Makes `expected <: actual`.
@@ -260,48 +225,50 @@ impl<'a, 'tcx> At<'a, 'tcx> {
260225 where
261226 T : ToTrace < ' tcx > ,
262227 {
263- self . trace_exp ( true , expected, actual)
228+ let trace = ToTrace :: to_trace ( self . cause , true , expected, actual) ;
229+ Trace { at : self , trace }
264230 }
231+ }
265232
266- /// Like `trace`, but the expected value is determined by the
267- /// boolean argument (if true, then the first argument `a` is the
268- /// "expected" value).
269- pub fn trace_exp < T > ( self , a_is_expected : bool , a : T , b : T ) -> Trace < ' a , ' tcx >
233+ impl < ' a , ' tcx > Trace < ' a , ' tcx > {
234+ /// Makes `a <: b`.
235+ # [ instrument ( skip ( self ) , level = "debug" ) ]
236+ pub fn sub < T > ( self , define_opaque_types : DefineOpaqueTypes , a : T , b : T ) -> InferResult < ' tcx , ( ) >
270237 where
271- T : ToTrace < ' tcx > ,
238+ T : Relate < ' tcx > ,
272239 {
273- let trace = ToTrace :: to_trace ( self . cause , a_is_expected, a, b) ;
274- Trace { at : self , trace, a_is_expected }
240+ let Trace { at, trace } = self ;
241+ let mut fields = at. infcx . combine_fields ( trace, at. param_env , define_opaque_types) ;
242+ fields
243+ . sub ( )
244+ . relate ( a, b)
245+ . map ( move |_| InferOk { value : ( ) , obligations : fields. obligations } )
275246 }
276- }
277247
278- impl < ' a , ' tcx > Trace < ' a , ' tcx > {
279- /// Makes `a <: b` where `a` may or may not be expected (if
280- /// `a_is_expected` is true, then `a` is expected).
248+ /// Makes `a :> b`.
281249 #[ instrument( skip( self ) , level = "debug" ) ]
282- pub fn sub < T > ( self , define_opaque_types : DefineOpaqueTypes , a : T , b : T ) -> InferResult < ' tcx , ( ) >
250+ pub fn sup < T > ( self , define_opaque_types : DefineOpaqueTypes , a : T , b : T ) -> InferResult < ' tcx , ( ) >
283251 where
284252 T : Relate < ' tcx > ,
285253 {
286- let Trace { at, trace, a_is_expected } = self ;
254+ let Trace { at, trace } = self ;
287255 let mut fields = at. infcx . combine_fields ( trace, at. param_env , define_opaque_types) ;
288256 fields
289- . sub ( a_is_expected )
257+ . sup ( )
290258 . relate ( a, b)
291259 . map ( move |_| InferOk { value : ( ) , obligations : fields. obligations } )
292260 }
293261
294- /// Makes `a == b`; the expectation is set by the call to
295- /// `trace()`.
262+ /// Makes `a == b`.
296263 #[ instrument( skip( self ) , level = "debug" ) ]
297264 pub fn eq < T > ( self , define_opaque_types : DefineOpaqueTypes , a : T , b : T ) -> InferResult < ' tcx , ( ) >
298265 where
299266 T : Relate < ' tcx > ,
300267 {
301- let Trace { at, trace, a_is_expected } = self ;
268+ let Trace { at, trace } = self ;
302269 let mut fields = at. infcx . combine_fields ( trace, at. param_env , define_opaque_types) ;
303270 fields
304- . equate ( StructurallyRelateAliases :: No , a_is_expected )
271+ . equate ( StructurallyRelateAliases :: No )
305272 . relate ( a, b)
306273 . map ( move |_| InferOk { value : ( ) , obligations : fields. obligations } )
307274 }
@@ -313,11 +280,11 @@ impl<'a, 'tcx> Trace<'a, 'tcx> {
313280 where
314281 T : Relate < ' tcx > ,
315282 {
316- let Trace { at, trace, a_is_expected } = self ;
283+ let Trace { at, trace } = self ;
317284 debug_assert ! ( at. infcx. next_trait_solver( ) ) ;
318285 let mut fields = at. infcx . combine_fields ( trace, at. param_env , DefineOpaqueTypes :: No ) ;
319286 fields
320- . equate ( StructurallyRelateAliases :: Yes , a_is_expected )
287+ . equate ( StructurallyRelateAliases :: Yes )
321288 . relate ( a, b)
322289 . map ( move |_| InferOk { value : ( ) , obligations : fields. obligations } )
323290 }
@@ -327,10 +294,10 @@ impl<'a, 'tcx> Trace<'a, 'tcx> {
327294 where
328295 T : Relate < ' tcx > ,
329296 {
330- let Trace { at, trace, a_is_expected } = self ;
297+ let Trace { at, trace } = self ;
331298 let mut fields = at. infcx . combine_fields ( trace, at. param_env , define_opaque_types) ;
332299 fields
333- . lub ( a_is_expected )
300+ . lub ( )
334301 . relate ( a, b)
335302 . map ( move |t| InferOk { value : t, obligations : fields. obligations } )
336303 }
@@ -340,10 +307,10 @@ impl<'a, 'tcx> Trace<'a, 'tcx> {
340307 where
341308 T : Relate < ' tcx > ,
342309 {
343- let Trace { at, trace, a_is_expected } = self ;
310+ let Trace { at, trace } = self ;
344311 let mut fields = at. infcx . combine_fields ( trace, at. param_env , define_opaque_types) ;
345312 fields
346- . glb ( a_is_expected )
313+ . glb ( )
347314 . relate ( a, b)
348315 . map ( move |t| InferOk { value : t, obligations : fields. obligations } )
349316 }
0 commit comments