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