@@ -133,9 +133,9 @@ pub trait InferCtxtExt<'tcx> {
133133 fn generate_member_constraint (
134134 & self ,
135135 concrete_ty : Ty < ' tcx > ,
136- opaque_type_generics : & ty:: Generics ,
137136 opaque_defn : & OpaqueTypeDecl < ' tcx > ,
138137 opaque_type_def_id : DefId ,
138+ first_own_region_index : usize ,
139139 ) ;
140140
141141 /*private*/
@@ -405,7 +405,16 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
405405
406406 debug ! ( "constrain_opaque_type: concrete_ty={:?}" , concrete_ty) ;
407407
408- let opaque_type_generics = tcx. generics_of ( def_id) ;
408+ let first_own_region = match opaque_defn. origin {
409+ hir:: OpaqueTyOrigin :: FnReturn | hir:: OpaqueTyOrigin :: AsyncFn => {
410+ // For these opaque types, only the item's own lifetime
411+ // parameters are considered.
412+ tcx. generics_of ( def_id) . parent_count
413+ }
414+ // These opaque type inherit all lifetime parameters from their
415+ // parent.
416+ hir:: OpaqueTyOrigin :: Misc => 0 ,
417+ } ;
409418
410419 let span = tcx. def_span ( def_id) ;
411420
@@ -427,12 +436,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
427436 } ) ;
428437 }
429438 if let GenerateMemberConstraints :: IfNoStaticBound = mode {
430- self . generate_member_constraint (
431- concrete_ty,
432- opaque_type_generics,
433- opaque_defn,
434- def_id,
435- ) ;
439+ self . generate_member_constraint ( concrete_ty, opaque_defn, def_id, first_own_region) ;
436440 }
437441 return ;
438442 }
@@ -445,29 +449,27 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
445449 // `['a]` for the first impl trait and `'b` for the
446450 // second.
447451 let mut least_region = None ;
448- for param in & opaque_type_generics. params {
449- match param. kind {
450- GenericParamDefKind :: Lifetime => { }
451- _ => continue ,
452- }
453452
454- // Get the value supplied for this region from the substs.
455- let subst_arg = opaque_defn. substs . region_at ( param. index as usize ) ;
453+ for subst_arg in & opaque_defn. substs [ first_own_region..] {
454+ let subst_region = match subst_arg. unpack ( ) {
455+ GenericArgKind :: Lifetime ( r) => r,
456+ GenericArgKind :: Type ( _) | GenericArgKind :: Const ( _) => continue ,
457+ } ;
456458
457459 // Compute the least upper bound of it with the other regions.
458460 debug ! ( "constrain_opaque_types: least_region={:?}" , least_region) ;
459- debug ! ( "constrain_opaque_types: subst_arg ={:?}" , subst_arg ) ;
461+ debug ! ( "constrain_opaque_types: subst_region ={:?}" , subst_region ) ;
460462 match least_region {
461- None => least_region = Some ( subst_arg ) ,
463+ None => least_region = Some ( subst_region ) ,
462464 Some ( lr) => {
463- if free_region_relations. sub_free_regions ( self . tcx , lr, subst_arg ) {
465+ if free_region_relations. sub_free_regions ( self . tcx , lr, subst_region ) {
464466 // keep the current least region
465- } else if free_region_relations. sub_free_regions ( self . tcx , subst_arg , lr) {
466- // switch to `subst_arg `
467- least_region = Some ( subst_arg ) ;
467+ } else if free_region_relations. sub_free_regions ( self . tcx , subst_region , lr) {
468+ // switch to `subst_region `
469+ least_region = Some ( subst_region ) ;
468470 } else {
469471 // There are two regions (`lr` and
470- // `subst_arg `) which are not relatable. We
472+ // `subst_region `) which are not relatable. We
471473 // can't find a best choice. Therefore,
472474 // instead of creating a single bound like
473475 // `'r: 'a` (which is our preferred choice),
@@ -476,13 +478,13 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
476478 // regions that appear in the impl trait.
477479
478480 // For now, enforce a feature gate outside of async functions.
479- self . member_constraint_feature_gate ( opaque_defn, def_id, lr, subst_arg ) ;
481+ self . member_constraint_feature_gate ( opaque_defn, def_id, lr, subst_region ) ;
480482
481483 return self . generate_member_constraint (
482484 concrete_ty,
483- opaque_type_generics,
484485 opaque_defn,
485486 def_id,
487+ first_own_region,
486488 ) ;
487489 }
488490 }
@@ -494,12 +496,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
494496
495497 if let GenerateMemberConstraints :: IfNoStaticBound = mode {
496498 if least_region != tcx. lifetimes . re_static {
497- self . generate_member_constraint (
498- concrete_ty,
499- opaque_type_generics,
500- opaque_defn,
501- def_id,
502- ) ;
499+ self . generate_member_constraint ( concrete_ty, opaque_defn, def_id, first_own_region) ;
503500 }
504501 }
505502 concrete_ty. visit_with ( & mut ConstrainOpaqueTypeRegionVisitor {
@@ -518,22 +515,20 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
518515 fn generate_member_constraint (
519516 & self ,
520517 concrete_ty : Ty < ' tcx > ,
521- opaque_type_generics : & ty:: Generics ,
522518 opaque_defn : & OpaqueTypeDecl < ' tcx > ,
523519 opaque_type_def_id : DefId ,
520+ first_own_region : usize ,
524521 ) {
525522 // Create the set of choice regions: each region in the hidden
526523 // type can be equal to any of the region parameters of the
527524 // opaque type definition.
528525 let choice_regions: Lrc < Vec < ty:: Region < ' tcx > > > = Lrc :: new (
529- opaque_type_generics
530- . params
526+ opaque_defn. substs [ first_own_region..]
531527 . iter ( )
532- . filter ( |param | match param . kind {
533- GenericParamDefKind :: Lifetime => true ,
534- GenericParamDefKind :: Type { .. } | GenericParamDefKind :: Const => false ,
528+ . filter_map ( |arg | match arg . unpack ( ) {
529+ GenericArgKind :: Lifetime ( r ) => Some ( r ) ,
530+ GenericArgKind :: Type ( _ ) | GenericArgKind :: Const ( _ ) => None ,
535531 } )
536- . map ( |param| opaque_defn. substs . region_at ( param. index as usize ) )
537532 . chain ( std:: iter:: once ( self . tcx . lifetimes . re_static ) )
538533 . collect ( ) ,
539534 ) ;
0 commit comments