2626//! things. (That system should probably be refactored.)
2727
2828use rustc_middle:: bug;
29+ use rustc_middle:: ty:: relate:: solver_relating:: RelateExt as NextSolverRelate ;
2930use rustc_middle:: ty:: { Const , ImplSubject } ;
3031
3132use super :: * ;
3233use crate :: infer:: relate:: { Relate , TypeRelation } ;
3334use crate :: traits:: Obligation ;
35+ use crate :: traits:: solve:: Goal ;
3436
3537/// Whether we should define opaque types or just treat them opaquely.
3638///
@@ -109,14 +111,25 @@ impl<'a, 'tcx> At<'a, 'tcx> {
109111 where
110112 T : ToTrace < ' tcx > ,
111113 {
112- let mut fields = CombineFields :: new (
113- self . infcx ,
114- ToTrace :: to_trace ( self . cause , expected, actual) ,
115- self . param_env ,
116- define_opaque_types,
117- ) ;
118- fields. sup ( ) . relate ( expected, actual) ?;
119- Ok ( InferOk { value : ( ) , obligations : fields. into_obligations ( ) } )
114+ if self . infcx . next_trait_solver ( ) {
115+ NextSolverRelate :: relate (
116+ self . infcx ,
117+ self . param_env ,
118+ expected,
119+ ty:: Contravariant ,
120+ actual,
121+ )
122+ . map ( |goals| self . goals_to_obligations ( goals) )
123+ } else {
124+ let mut fields = CombineFields :: new (
125+ self . infcx ,
126+ ToTrace :: to_trace ( self . cause , expected, actual) ,
127+ self . param_env ,
128+ define_opaque_types,
129+ ) ;
130+ fields. sup ( ) . relate ( expected, actual) ?;
131+ Ok ( InferOk { value : ( ) , obligations : fields. into_obligations ( ) } )
132+ }
120133 }
121134
122135 /// Makes `expected <: actual`.
@@ -129,14 +142,19 @@ impl<'a, 'tcx> At<'a, 'tcx> {
129142 where
130143 T : ToTrace < ' tcx > ,
131144 {
132- let mut fields = CombineFields :: new (
133- self . infcx ,
134- ToTrace :: to_trace ( self . cause , expected, actual) ,
135- self . param_env ,
136- define_opaque_types,
137- ) ;
138- fields. sub ( ) . relate ( expected, actual) ?;
139- Ok ( InferOk { value : ( ) , obligations : fields. into_obligations ( ) } )
145+ if self . infcx . next_trait_solver ( ) {
146+ NextSolverRelate :: relate ( self . infcx , self . param_env , expected, ty:: Covariant , actual)
147+ . map ( |goals| self . goals_to_obligations ( goals) )
148+ } else {
149+ let mut fields = CombineFields :: new (
150+ self . infcx ,
151+ ToTrace :: to_trace ( self . cause , expected, actual) ,
152+ self . param_env ,
153+ define_opaque_types,
154+ ) ;
155+ fields. sub ( ) . relate ( expected, actual) ?;
156+ Ok ( InferOk { value : ( ) , obligations : fields. into_obligations ( ) } )
157+ }
140158 }
141159
142160 /// Makes `expected == actual`.
@@ -168,23 +186,29 @@ impl<'a, 'tcx> At<'a, 'tcx> {
168186 where
169187 T : Relate < TyCtxt < ' tcx > > ,
170188 {
171- let mut fields = CombineFields :: new ( self . infcx , trace, self . param_env , define_opaque_types) ;
172- fields. equate ( ) . relate ( expected, actual) ?;
173- Ok ( InferOk {
174- value : ( ) ,
175- obligations : fields
176- . goals
177- . into_iter ( )
178- . map ( |goal| {
179- Obligation :: new (
180- self . infcx . tcx ,
181- fields. trace . cause . clone ( ) ,
182- goal. param_env ,
183- goal. predicate ,
184- )
185- } )
186- . collect ( ) ,
187- } )
189+ if self . infcx . next_trait_solver ( ) {
190+ NextSolverRelate :: relate ( self . infcx , self . param_env , expected, ty:: Invariant , actual)
191+ . map ( |goals| self . goals_to_obligations ( goals) )
192+ } else {
193+ let mut fields =
194+ CombineFields :: new ( self . infcx , trace, self . param_env , define_opaque_types) ;
195+ fields. equate ( ) . relate ( expected, actual) ?;
196+ Ok ( InferOk {
197+ value : ( ) ,
198+ obligations : fields
199+ . goals
200+ . into_iter ( )
201+ . map ( |goal| {
202+ Obligation :: new (
203+ self . infcx . tcx ,
204+ fields. trace . cause . clone ( ) ,
205+ goal. param_env ,
206+ goal. predicate ,
207+ )
208+ } )
209+ . collect ( ) ,
210+ } )
211+ }
188212 }
189213
190214 pub fn relate < T > (
@@ -256,6 +280,26 @@ impl<'a, 'tcx> At<'a, 'tcx> {
256280 let value = fields. glb ( ) . relate ( expected, actual) ?;
257281 Ok ( InferOk { value, obligations : fields. into_obligations ( ) } )
258282 }
283+
284+ fn goals_to_obligations (
285+ & self ,
286+ goals : Vec < Goal < ' tcx , ty:: Predicate < ' tcx > > > ,
287+ ) -> InferOk < ' tcx , ( ) > {
288+ InferOk {
289+ value : ( ) ,
290+ obligations : goals
291+ . into_iter ( )
292+ . map ( |goal| {
293+ Obligation :: new (
294+ self . infcx . tcx ,
295+ self . cause . clone ( ) ,
296+ goal. param_env ,
297+ goal. predicate ,
298+ )
299+ } )
300+ . collect ( ) ,
301+ }
302+ }
259303}
260304
261305impl < ' tcx > ToTrace < ' tcx > for ImplSubject < ' tcx > {
0 commit comments