@@ -240,49 +240,39 @@ impl<'infcx, 'tcx> MirBorrowckCtxt<'_, 'infcx, 'tcx> {
240
240
& self ,
241
241
diag : & mut Diag < ' _ > ,
242
242
lower_bound : RegionVid ,
243
- ) {
243
+ ) -> Option < ( ) > {
244
244
let mut suggestions = vec ! [ ] ;
245
245
let tcx = self . infcx . tcx ;
246
246
247
- // find generic associated types in the given region 'lower_bound'
248
- let gat_id_and_generics = self
249
- . regioncx
250
- . placeholders_contained_in ( lower_bound)
251
- . map ( |placeholder| {
252
- if let Some ( id) = placeholder. bound . kind . get_id ( )
253
- && let Some ( placeholder_id) = id. as_local ( )
254
- && let gat_hir_id = tcx. local_def_id_to_hir_id ( placeholder_id)
255
- && let Some ( generics_impl) =
256
- tcx. parent_hir_node ( tcx. parent_hir_id ( gat_hir_id) ) . generics ( )
257
- {
258
- Some ( ( gat_hir_id, generics_impl) )
259
- } else {
260
- None
261
- }
262
- } )
263
- . collect :: < Vec < _ > > ( ) ;
264
- debug ! ( ?gat_id_and_generics) ;
265
-
266
247
// find higher-ranked trait bounds bounded to the generic associated types
248
+ let scc = self . regioncx . constraint_sccs ( ) . scc ( lower_bound) ;
249
+
250
+ let placeholder: ty:: PlaceholderRegion = self . regioncx . placeholder_representative ( scc) ?;
251
+
252
+ let placeholder_id = placeholder. bound . kind . get_id ( ) ?. as_local ( ) ?;
253
+ let gat_hir_id = self . infcx . tcx . local_def_id_to_hir_id ( placeholder_id) ;
254
+ let generics_impl =
255
+ self . infcx . tcx . parent_hir_node ( self . infcx . tcx . parent_hir_id ( gat_hir_id) ) . generics ( ) ?;
256
+
267
257
let mut hrtb_bounds = vec ! [ ] ;
268
- gat_id_and_generics. iter ( ) . flatten ( ) . for_each ( |( gat_hir_id, generics) | {
269
- for pred in generics. predicates {
270
- let BoundPredicate ( WhereBoundPredicate { bound_generic_params, bounds, .. } ) =
271
- pred. kind
272
- else {
273
- continue ;
274
- } ;
275
- if bound_generic_params
276
- . iter ( )
277
- . rfind ( |bgp| tcx. local_def_id_to_hir_id ( bgp. def_id ) == * gat_hir_id)
278
- . is_some ( )
279
- {
280
- for bound in * bounds {
281
- hrtb_bounds. push ( bound) ;
282
- }
258
+
259
+ for pred in generics_impl. predicates {
260
+ let BoundPredicate ( WhereBoundPredicate { bound_generic_params, bounds, .. } ) =
261
+ pred. kind
262
+ else {
263
+ continue ;
264
+ } ;
265
+ if bound_generic_params
266
+ . iter ( )
267
+ . rfind ( |bgp| self . infcx . tcx . local_def_id_to_hir_id ( bgp. def_id ) == gat_hir_id)
268
+ . is_some ( )
269
+ {
270
+ for bound in * bounds {
271
+ hrtb_bounds. push ( bound) ;
283
272
}
284
273
}
285
- } ) ;
274
+ }
275
+
286
276
debug ! ( ?hrtb_bounds) ;
287
277
288
278
hrtb_bounds. iter ( ) . for_each ( |bound| {
@@ -327,6 +317,7 @@ impl<'infcx, 'tcx> MirBorrowckCtxt<'_, 'infcx, 'tcx> {
327
317
Applicability :: MaybeIncorrect ,
328
318
) ;
329
319
}
320
+ Some ( ( ) )
330
321
}
331
322
332
323
/// Produces nice borrowck error diagnostics for all the errors collected in `nll_errors`.
0 commit comments