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 ;
12+ use rustc_middle:: ty:: relate:: TypeRelation ;
1213use rustc_middle:: ty:: GenericArgKind ;
1314use rustc_middle:: ty:: {
1415 self , OpaqueHiddenType , OpaqueTypeKey , Ty , TyCtxt , TypeFoldable , TypeSuperVisitable ,
@@ -21,6 +22,9 @@ mod table;
2122pub type OpaqueTypeMap < ' tcx > = FxIndexMap < OpaqueTypeKey < ' tcx > , OpaqueTypeDecl < ' tcx > > ;
2223pub use table:: { OpaqueTypeStorage , OpaqueTypeTable } ;
2324
25+ use super :: at:: ToTrace ;
26+ use super :: { CombineFields , DefineOpaqueTypes , StructurallyRelateAliases } ;
27+
2428/// Information about the opaque types whose values we
2529/// are inferring in this function (these are the `impl Trait` that
2630/// appear in the return type).
@@ -62,11 +66,23 @@ impl<'tcx> InferCtxt<'tcx> {
6266 {
6367 let def_span = self . tcx . def_span ( def_id) ;
6468 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) ;
6769 let ty_var = self . next_ty_var ( span) ;
6870 obligations. extend (
69- self . handle_opaque_type ( ty, ty_var, & cause, param_env) . unwrap ( ) . obligations ,
71+ self . handle_opaque_type ( ty, ty_var, span, param_env)
72+ . unwrap ( )
73+ . into_iter ( )
74+ . map ( |goal| {
75+ Obligation :: new (
76+ self . tcx ,
77+ ObligationCause :: new (
78+ span,
79+ body_id,
80+ traits:: ObligationCauseCode :: OpaqueReturnType ( None ) ,
81+ ) ,
82+ goal. param_env ,
83+ goal. predicate ,
84+ )
85+ } ) ,
7086 ) ;
7187 ty_var
7288 }
@@ -80,17 +96,17 @@ impl<'tcx> InferCtxt<'tcx> {
8096 & self ,
8197 a : Ty < ' tcx > ,
8298 b : Ty < ' tcx > ,
83- cause : & ObligationCause < ' tcx > ,
99+ span : Span ,
84100 param_env : ty:: ParamEnv < ' tcx > ,
85- ) -> InferResult < ' tcx , ( ) > {
101+ ) -> Result < Vec < Goal < ' tcx , ty :: Predicate < ' tcx > > > , TypeError < ' tcx > > {
86102 let process = |a : Ty < ' tcx > , b : Ty < ' tcx > | match * a. kind ( ) {
87103 ty:: Alias ( ty:: Opaque , ty:: AliasTy { def_id, args, .. } ) if def_id. is_local ( ) => {
88104 let def_id = def_id. expect_local ( ) ;
89105 if self . intercrate {
90106 // See comment on `insert_hidden_type` for why this is sufficient in coherence
91107 return Some ( self . register_hidden_type (
92108 OpaqueTypeKey { def_id, args } ,
93- cause . clone ( ) ,
109+ span ,
94110 param_env,
95111 b,
96112 ) ) ;
@@ -143,18 +159,13 @@ impl<'tcx> InferCtxt<'tcx> {
143159 && self . tcx . is_type_alias_impl_trait ( b_def_id)
144160 {
145161 self . tcx . dcx ( ) . emit_err ( OpaqueHiddenTypeDiag {
146- span : cause . span ,
162+ span,
147163 hidden_type : self . tcx . def_span ( b_def_id) ,
148164 opaque_type : self . tcx . def_span ( def_id) ,
149165 } ) ;
150166 }
151167 }
152- Some ( self . register_hidden_type (
153- OpaqueTypeKey { def_id, args } ,
154- cause. clone ( ) ,
155- param_env,
156- b,
157- ) )
168+ Some ( self . register_hidden_type ( OpaqueTypeKey { def_id, args } , span, param_env, b) )
158169 }
159170 _ => None ,
160171 } ;
@@ -464,24 +475,23 @@ impl<'tcx> InferCtxt<'tcx> {
464475 fn register_hidden_type (
465476 & self ,
466477 opaque_type_key : OpaqueTypeKey < ' tcx > ,
467- cause : ObligationCause < ' tcx > ,
478+ span : Span ,
468479 param_env : ty:: ParamEnv < ' tcx > ,
469480 hidden_ty : Ty < ' tcx > ,
470- ) -> InferResult < ' tcx , ( ) > {
471- let mut obligations = Vec :: new ( ) ;
481+ ) -> Result < Vec < Goal < ' tcx , ty :: Predicate < ' tcx > > > , TypeError < ' tcx > > {
482+ let mut goals = Vec :: new ( ) ;
472483
473- self . insert_hidden_type ( opaque_type_key, & cause , param_env, hidden_ty, & mut obligations ) ?;
484+ self . insert_hidden_type ( opaque_type_key, span , param_env, hidden_ty, & mut goals ) ?;
474485
475486 self . add_item_bounds_for_hidden_type (
476487 opaque_type_key. def_id . to_def_id ( ) ,
477488 opaque_type_key. args ,
478- cause,
479489 param_env,
480490 hidden_ty,
481- & mut obligations ,
491+ & mut goals ,
482492 ) ;
483493
484- Ok ( InferOk { value : ( ) , obligations } )
494+ Ok ( goals )
485495 }
486496
487497 /// Insert a hidden type into the opaque type storage, making sure
@@ -507,38 +517,35 @@ impl<'tcx> InferCtxt<'tcx> {
507517 pub fn insert_hidden_type (
508518 & self ,
509519 opaque_type_key : OpaqueTypeKey < ' tcx > ,
510- cause : & ObligationCause < ' tcx > ,
520+ span : Span ,
511521 param_env : ty:: ParamEnv < ' tcx > ,
512522 hidden_ty : Ty < ' tcx > ,
513- obligations : & mut Vec < PredicateObligation < ' tcx > > ,
523+ goals : & mut Vec < Goal < ' tcx , ty :: Predicate < ' tcx > > > ,
514524 ) -> Result < ( ) , TypeError < ' tcx > > {
515525 // Ideally, we'd get the span where *this specific `ty` came
516526 // from*, but right now we just use the span from the overall
517527 // value being folded. In simple cases like `-> impl Foo`,
518528 // these are the same span, but not in cases like `-> (impl
519529 // Foo, impl Bar)`.
520- let span = cause. span ;
521530 if self . intercrate {
522531 // During intercrate we do not define opaque types but instead always
523532 // force ambiguity unless the hidden type is known to not implement
524533 // our trait.
525- obligations. push ( traits:: Obligation :: new (
526- self . tcx ,
527- cause. clone ( ) ,
528- param_env,
529- ty:: PredicateKind :: Ambiguous ,
530- ) )
534+ goals. push ( Goal :: new ( self . tcx , param_env, ty:: PredicateKind :: Ambiguous ) )
531535 } else {
532536 let prev = self
533537 . inner
534538 . borrow_mut ( )
535539 . opaque_types ( )
536540 . register ( opaque_type_key, OpaqueHiddenType { ty : hidden_ty, span } ) ;
537541 if let Some ( prev) = prev {
538- obligations . extend (
539- self . at ( cause , param_env)
542+ goals . extend (
543+ self . at ( & ObligationCause :: dummy_with_span ( span ) , param_env)
540544 . eq ( DefineOpaqueTypes :: Yes , prev, hidden_ty) ?
541- . obligations ,
545+ . obligations
546+ . into_iter ( )
547+ // FIXME: Shuttling between obligations and goals is awkward.
548+ . map ( Goal :: from) ,
542549 ) ;
543550 }
544551 } ;
@@ -550,10 +557,9 @@ impl<'tcx> InferCtxt<'tcx> {
550557 & self ,
551558 def_id : DefId ,
552559 args : ty:: GenericArgsRef < ' tcx > ,
553- cause : ObligationCause < ' tcx > ,
554560 param_env : ty:: ParamEnv < ' tcx > ,
555561 hidden_ty : Ty < ' tcx > ,
556- obligations : & mut Vec < PredicateObligation < ' tcx > > ,
562+ goals : & mut Vec < Goal < ' tcx , ty :: Predicate < ' tcx > > > ,
557563 ) {
558564 let tcx = self . tcx ;
559565 // Require that the hidden type is well-formed. We have to
@@ -567,12 +573,7 @@ impl<'tcx> InferCtxt<'tcx> {
567573 // type during MIR borrowck, causing us to infer the wrong
568574 // lifetime for its member constraints which then results in
569575 // 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- ) ) ;
576+ goals. push ( Goal :: new ( tcx, param_env, ty:: ClauseKind :: WellFormed ( hidden_ty. into ( ) ) ) ) ;
576577
577578 let item_bounds = tcx. explicit_item_bounds ( def_id) ;
578579 for ( predicate, _) in item_bounds. iter_instantiated_copied ( tcx, args) {
@@ -588,13 +589,18 @@ impl<'tcx> InferCtxt<'tcx> {
588589 && !tcx. is_impl_trait_in_trait ( projection_ty. def_id )
589590 && !self . next_trait_solver ( ) =>
590591 {
591- self . projection_ty_to_infer (
592+ let ty_var = self . next_ty_var ( self . tcx . def_span ( projection_ty. def_id ) ) ;
593+ goals. push ( Goal :: new (
594+ self . tcx ,
592595 param_env,
593- projection_ty,
594- cause. clone ( ) ,
595- 0 ,
596- obligations,
597- )
596+ ty:: PredicateKind :: Clause ( ty:: ClauseKind :: Projection (
597+ ty:: ProjectionPredicate {
598+ projection_term : projection_ty. into ( ) ,
599+ term : ty_var. into ( ) ,
600+ } ,
601+ ) ) ,
602+ ) ) ;
603+ ty_var
598604 }
599605 // Replace all other mentions of the same opaque type with the hidden type,
600606 // as the bounds must hold on the hidden type after all.
@@ -611,12 +617,7 @@ impl<'tcx> InferCtxt<'tcx> {
611617
612618 // Require that the predicate holds for the concrete type.
613619 debug ! ( ?predicate) ;
614- obligations. push ( traits:: Obligation :: new (
615- self . tcx ,
616- cause. clone ( ) ,
617- param_env,
618- predicate,
619- ) ) ;
620+ goals. push ( Goal :: new ( self . tcx , param_env, predicate) ) ;
620621 }
621622 }
622623}
0 commit comments