@@ -251,7 +251,8 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
251
251
. or_else ( || self . give_name_if_anonymous_region_appears_in_upvars ( fr) )
252
252
. or_else ( || self . give_name_if_anonymous_region_appears_in_output ( fr) )
253
253
. or_else ( || self . give_name_if_anonymous_region_appears_in_yield_ty ( fr) )
254
- . or_else ( || self . give_name_if_anonymous_region_appears_in_impl_signature ( fr) ) ;
254
+ . or_else ( || self . give_name_if_anonymous_region_appears_in_impl_signature ( fr) )
255
+ . or_else ( || self . give_name_if_anonymous_region_appears_in_arg_position_impl_trait ( fr) ) ;
255
256
256
257
if let Some ( ref value) = value {
257
258
self . region_names . try_borrow_mut ( ) . unwrap ( ) . insert ( fr, value. clone ( ) ) ;
@@ -869,13 +870,8 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
869
870
return None ;
870
871
}
871
872
872
- let mut found = false ;
873
- tcx. fold_regions ( tcx. type_of ( region_parent) , |r : ty:: Region < ' tcx > , _| {
874
- if * r == ty:: ReEarlyBound ( region) {
875
- found = true ;
876
- }
877
- r
878
- } ) ;
873
+ let found = tcx
874
+ . any_free_region_meets ( & tcx. type_of ( region_parent) , |r| * r == ty:: ReEarlyBound ( region) ) ;
879
875
880
876
Some ( RegionName {
881
877
name : self . synthesize_region_name ( ) ,
@@ -888,4 +884,92 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
888
884
) ,
889
885
} )
890
886
}
887
+
888
+ fn give_name_if_anonymous_region_appears_in_arg_position_impl_trait (
889
+ & self ,
890
+ fr : RegionVid ,
891
+ ) -> Option < RegionName > {
892
+ let ty:: ReEarlyBound ( region) = * self . to_error_region ( fr) ? else {
893
+ return None ;
894
+ } ;
895
+ if region. has_name ( ) {
896
+ return None ;
897
+ } ;
898
+
899
+ let predicates = self
900
+ . infcx
901
+ . tcx
902
+ . predicates_of ( self . body . source . def_id ( ) )
903
+ . instantiate_identity ( self . infcx . tcx )
904
+ . predicates ;
905
+
906
+ if let Some ( upvar_index) = self
907
+ . regioncx
908
+ . universal_regions ( )
909
+ . defining_ty
910
+ . upvar_tys ( )
911
+ . position ( |ty| self . any_param_predicate_mentions ( & predicates, ty, region) )
912
+ {
913
+ let ( upvar_name, upvar_span) = self . regioncx . get_upvar_name_and_span_for_region (
914
+ self . infcx . tcx ,
915
+ & self . upvars ,
916
+ upvar_index,
917
+ ) ;
918
+ let region_name = self . synthesize_region_name ( ) ;
919
+
920
+ Some ( RegionName {
921
+ name : region_name,
922
+ source : RegionNameSource :: AnonRegionFromUpvar ( upvar_span, upvar_name) ,
923
+ } )
924
+ } else if let Some ( arg_index) = self
925
+ . regioncx
926
+ . universal_regions ( )
927
+ . unnormalized_input_tys
928
+ . iter ( )
929
+ . position ( |ty| self . any_param_predicate_mentions ( & predicates, * ty, region) )
930
+ {
931
+ let ( arg_name, arg_span) = self . regioncx . get_argument_name_and_span_for_region (
932
+ self . body ,
933
+ & self . local_names ,
934
+ arg_index,
935
+ ) ;
936
+ let region_name = self . synthesize_region_name ( ) ;
937
+
938
+ Some ( RegionName {
939
+ name : region_name,
940
+ source : RegionNameSource :: AnonRegionFromArgument (
941
+ RegionNameHighlight :: CannotMatchHirTy ( arg_span, arg_name?. to_string ( ) ) ,
942
+ ) ,
943
+ } )
944
+ } else {
945
+ None
946
+ }
947
+ }
948
+
949
+ fn any_param_predicate_mentions (
950
+ & self ,
951
+ predicates : & [ ty:: Predicate < ' tcx > ] ,
952
+ ty : Ty < ' tcx > ,
953
+ region : ty:: EarlyBoundRegion ,
954
+ ) -> bool {
955
+ let tcx = self . infcx . tcx ;
956
+ ty. walk ( ) . any ( |arg| {
957
+ if let ty:: GenericArgKind :: Type ( ty) = arg. unpack ( )
958
+ && let ty:: Param ( _) = ty. kind ( )
959
+ {
960
+ predicates. iter ( ) . any ( |pred| {
961
+ match pred. kind ( ) . skip_binder ( ) {
962
+ ty:: PredicateKind :: Trait ( data) if data. self_ty ( ) == ty => { }
963
+ ty:: PredicateKind :: Projection ( data) if data. projection_ty . self_ty ( ) == ty => { }
964
+ _ => return false ,
965
+ }
966
+ tcx. any_free_region_meets ( pred, |r| {
967
+ * r == ty:: ReEarlyBound ( region)
968
+ } )
969
+ } )
970
+ } else {
971
+ false
972
+ }
973
+ } )
974
+ }
891
975
}
0 commit comments