1- use  super :: { DefineOpaqueTypes ,  InferResult } ; 
21use  crate :: errors:: OpaqueHiddenTypeDiag ; 
32use  crate :: infer:: { InferCtxt ,  InferOk } ; 
4- use  crate :: traits:: { self ,  PredicateObligation } ; 
3+ use  crate :: traits:: { self ,  Obligation } ; 
54use  hir:: def_id:: { DefId ,  LocalDefId } ; 
65use  rustc_data_structures:: fx:: FxIndexMap ; 
76use  rustc_data_structures:: sync:: Lrc ; 
87use  rustc_hir as  hir; 
8+ use  rustc_middle:: traits:: solve:: Goal ; 
99use  rustc_middle:: traits:: ObligationCause ; 
1010use  rustc_middle:: ty:: error:: { ExpectedFound ,  TypeError } ; 
1111use  rustc_middle:: ty:: fold:: BottomUpFolder ; 
@@ -21,6 +21,8 @@ mod table;
2121pub  type  OpaqueTypeMap < ' tcx >  = FxIndexMap < OpaqueTypeKey < ' tcx > ,  OpaqueTypeDecl < ' tcx > > ; 
2222pub  use  table:: { OpaqueTypeStorage ,  OpaqueTypeTable } ; 
2323
24+ use  super :: DefineOpaqueTypes ; 
25+ 
2426/// Information about the opaque types whose values we 
2527/// are inferring in this function (these are the `impl Trait` that 
2628/// appear in the return type). 
@@ -62,11 +64,23 @@ impl<'tcx> InferCtxt<'tcx> {
6264                { 
6365                    let  def_span = self . tcx . def_span ( def_id) ; 
6466                    let  span = if  span. contains ( def_span)  {  def_span }  else  {  span } ; 
65-                     let  code = traits:: ObligationCauseCode :: OpaqueReturnType ( None ) ; 
66-                     let  cause = ObligationCause :: new ( span,  body_id,  code) ; 
6767                    let  ty_var = self . next_ty_var ( span) ; 
6868                    obligations. extend ( 
69-                         self . handle_opaque_type ( ty,  ty_var,  & cause,  param_env) . unwrap ( ) . obligations , 
69+                         self . handle_opaque_type ( ty,  ty_var,  span,  param_env) 
70+                             . unwrap ( ) 
71+                             . into_iter ( ) 
72+                             . map ( |goal| { 
73+                                 Obligation :: new ( 
74+                                     self . tcx , 
75+                                     ObligationCause :: new ( 
76+                                         span, 
77+                                         body_id, 
78+                                         traits:: ObligationCauseCode :: OpaqueReturnType ( None ) , 
79+                                     ) , 
80+                                     goal. param_env , 
81+                                     goal. predicate , 
82+                                 ) 
83+                             } ) , 
7084                    ) ; 
7185                    ty_var
7286                } 
@@ -80,17 +94,17 @@ impl<'tcx> InferCtxt<'tcx> {
8094        & self , 
8195        a :  Ty < ' tcx > , 
8296        b :  Ty < ' tcx > , 
83-         cause :   & ObligationCause < ' tcx > , 
97+         span :   Span , 
8498        param_env :  ty:: ParamEnv < ' tcx > , 
85-     )  -> InferResult < ' tcx ,  ( ) >  { 
99+     )  -> Result < Vec < Goal < ' tcx ,  ty :: Predicate < ' tcx > > > ,   TypeError < ' tcx > >  { 
86100        let  process = |a :  Ty < ' tcx > ,  b :  Ty < ' tcx > | match  * a. kind ( )  { 
87101            ty:: Alias ( ty:: Opaque ,  ty:: AliasTy  {  def_id,  args,  .. } )  if  def_id. is_local ( )  => { 
88102                let  def_id = def_id. expect_local ( ) ; 
89103                if  self . intercrate  { 
90104                    // See comment on `insert_hidden_type` for why this is sufficient in coherence 
91105                    return  Some ( self . register_hidden_type ( 
92106                        OpaqueTypeKey  {  def_id,  args } , 
93-                         cause . clone ( ) , 
107+                         span , 
94108                        param_env, 
95109                        b, 
96110                    ) ) ; 
@@ -143,18 +157,13 @@ impl<'tcx> InferCtxt<'tcx> {
143157                        && self . tcx . is_type_alias_impl_trait ( b_def_id) 
144158                    { 
145159                        self . tcx . dcx ( ) . emit_err ( OpaqueHiddenTypeDiag  { 
146-                             span :  cause . span , 
160+                             span, 
147161                            hidden_type :  self . tcx . def_span ( b_def_id) , 
148162                            opaque_type :  self . tcx . def_span ( def_id) , 
149163                        } ) ; 
150164                    } 
151165                } 
152-                 Some ( self . register_hidden_type ( 
153-                     OpaqueTypeKey  {  def_id,  args } , 
154-                     cause. clone ( ) , 
155-                     param_env, 
156-                     b, 
157-                 ) ) 
166+                 Some ( self . register_hidden_type ( OpaqueTypeKey  {  def_id,  args } ,  span,  param_env,  b) ) 
158167            } 
159168            _ => None , 
160169        } ; 
@@ -464,24 +473,23 @@ impl<'tcx> InferCtxt<'tcx> {
464473    fn  register_hidden_type ( 
465474        & self , 
466475        opaque_type_key :  OpaqueTypeKey < ' tcx > , 
467-         cause :   ObligationCause < ' tcx > , 
476+         span :   Span , 
468477        param_env :  ty:: ParamEnv < ' tcx > , 
469478        hidden_ty :  Ty < ' tcx > , 
470-     )  -> InferResult < ' tcx ,  ( ) >  { 
471-         let  mut  obligations  = Vec :: new ( ) ; 
479+     )  -> Result < Vec < Goal < ' tcx ,  ty :: Predicate < ' tcx > > > ,   TypeError < ' tcx > >  { 
480+         let  mut  goals  = Vec :: new ( ) ; 
472481
473-         self . insert_hidden_type ( opaque_type_key,  & cause ,  param_env,  hidden_ty,  & mut  obligations ) ?; 
482+         self . insert_hidden_type ( opaque_type_key,  span ,  param_env,  hidden_ty,  & mut  goals ) ?; 
474483
475484        self . add_item_bounds_for_hidden_type ( 
476485            opaque_type_key. def_id . to_def_id ( ) , 
477486            opaque_type_key. args , 
478-             cause, 
479487            param_env, 
480488            hidden_ty, 
481-             & mut  obligations , 
489+             & mut  goals , 
482490        ) ; 
483491
484-         Ok ( InferOk   {   value :   ( ) ,  obligations  } ) 
492+         Ok ( goals ) 
485493    } 
486494
487495    /// Insert a hidden type into the opaque type storage, making sure 
@@ -507,38 +515,35 @@ impl<'tcx> InferCtxt<'tcx> {
507515     pub  fn  insert_hidden_type ( 
508516        & self , 
509517        opaque_type_key :  OpaqueTypeKey < ' tcx > , 
510-         cause :   & ObligationCause < ' tcx > , 
518+         span :   Span , 
511519        param_env :  ty:: ParamEnv < ' tcx > , 
512520        hidden_ty :  Ty < ' tcx > , 
513-         obligations :  & mut  Vec < PredicateObligation < ' tcx > > , 
521+         goals :  & mut  Vec < Goal < ' tcx ,  ty :: Predicate < ' tcx > > > , 
514522    )  -> Result < ( ) ,  TypeError < ' tcx > >  { 
515523        // Ideally, we'd get the span where *this specific `ty` came 
516524        // from*, but right now we just use the span from the overall 
517525        // value being folded. In simple cases like `-> impl Foo`, 
518526        // these are the same span, but not in cases like `-> (impl 
519527        // Foo, impl Bar)`. 
520-         let  span = cause. span ; 
521528        if  self . intercrate  { 
522529            // During intercrate we do not define opaque types but instead always 
523530            // force ambiguity unless the hidden type is known to not implement 
524531            // our trait. 
525-             obligations. push ( traits:: Obligation :: new ( 
526-                 self . tcx , 
527-                 cause. clone ( ) , 
528-                 param_env, 
529-                 ty:: PredicateKind :: Ambiguous , 
530-             ) ) 
532+             goals. push ( Goal :: new ( self . tcx ,  param_env,  ty:: PredicateKind :: Ambiguous ) ) 
531533        }  else  { 
532534            let  prev = self 
533535                . inner 
534536                . borrow_mut ( ) 
535537                . opaque_types ( ) 
536538                . register ( opaque_type_key,  OpaqueHiddenType  {  ty :  hidden_ty,  span } ) ; 
537539            if  let  Some ( prev)  = prev { 
538-                 obligations . extend ( 
539-                     self . at ( cause ,  param_env) 
540+                 goals . extend ( 
541+                     self . at ( & ObligationCause :: dummy_with_span ( span ) ,  param_env) 
540542                        . eq ( DefineOpaqueTypes :: Yes ,  prev,  hidden_ty) ?
541-                         . obligations , 
543+                         . obligations 
544+                         . into_iter ( ) 
545+                         // FIXME: Shuttling between obligations and goals is awkward. 
546+                         . map ( Goal :: from) , 
542547                ) ; 
543548            } 
544549        } ; 
@@ -550,10 +555,9 @@ impl<'tcx> InferCtxt<'tcx> {
550555        & self , 
551556        def_id :  DefId , 
552557        args :  ty:: GenericArgsRef < ' tcx > , 
553-         cause :  ObligationCause < ' tcx > , 
554558        param_env :  ty:: ParamEnv < ' tcx > , 
555559        hidden_ty :  Ty < ' tcx > , 
556-         obligations :  & mut  Vec < PredicateObligation < ' tcx > > , 
560+         goals :  & mut  Vec < Goal < ' tcx ,  ty :: Predicate < ' tcx > > > , 
557561    )  { 
558562        let  tcx = self . tcx ; 
559563        // Require that the hidden type is well-formed. We have to 
@@ -567,12 +571,7 @@ impl<'tcx> InferCtxt<'tcx> {
567571        // type during MIR borrowck, causing us to infer the wrong 
568572        // lifetime for its member constraints which then results in 
569573        // unexpected region errors. 
570-         obligations. push ( traits:: Obligation :: new ( 
571-             tcx, 
572-             cause. clone ( ) , 
573-             param_env, 
574-             ty:: ClauseKind :: WellFormed ( hidden_ty. into ( ) ) , 
575-         ) ) ; 
574+         goals. push ( Goal :: new ( tcx,  param_env,  ty:: ClauseKind :: WellFormed ( hidden_ty. into ( ) ) ) ) ; 
576575
577576        let  item_bounds = tcx. explicit_item_bounds ( def_id) ; 
578577        for  ( predicate,  _)  in  item_bounds. iter_instantiated_copied ( tcx,  args)  { 
@@ -588,13 +587,18 @@ impl<'tcx> InferCtxt<'tcx> {
588587                            && !tcx. is_impl_trait_in_trait ( projection_ty. def_id ) 
589588                            && !self . next_trait_solver ( )  =>
590589                    { 
591-                         self . projection_ty_to_infer ( 
590+                         let  ty_var = self . next_ty_var ( self . tcx . def_span ( projection_ty. def_id ) ) ; 
591+                         goals. push ( Goal :: new ( 
592+                             self . tcx , 
592593                            param_env, 
593-                             projection_ty, 
594-                             cause. clone ( ) , 
595-                             0 , 
596-                             obligations, 
597-                         ) 
594+                             ty:: PredicateKind :: Clause ( ty:: ClauseKind :: Projection ( 
595+                                 ty:: ProjectionPredicate  { 
596+                                     projection_term :  projection_ty. into ( ) , 
597+                                     term :  ty_var. into ( ) , 
598+                                 } , 
599+                             ) ) , 
600+                         ) ) ; 
601+                         ty_var
598602                    } 
599603                    // Replace all other mentions of the same opaque type with the hidden type, 
600604                    // as the bounds must hold on the hidden type after all. 
@@ -611,12 +615,7 @@ impl<'tcx> InferCtxt<'tcx> {
611615
612616            // Require that the predicate holds for the concrete type. 
613617            debug ! ( ?predicate) ; 
614-             obligations. push ( traits:: Obligation :: new ( 
615-                 self . tcx , 
616-                 cause. clone ( ) , 
617-                 param_env, 
618-                 predicate, 
619-             ) ) ; 
618+             goals. push ( Goal :: new ( self . tcx ,  param_env,  predicate) ) ; 
620619        } 
621620    } 
622621} 
0 commit comments