@@ -290,24 +290,7 @@ pub fn provide(providers: &mut ty::query::Providers) {
290
290
291
291
named_region_map : |tcx, id| resolve_lifetimes_for ( tcx, id) . defs . get ( & id) ,
292
292
is_late_bound_map,
293
- object_lifetime_defaults : |tcx, def_id| {
294
- if let Some ( def_id) = def_id. as_local ( ) {
295
- match tcx. hir ( ) . get_by_def_id ( def_id) {
296
- Node :: Item ( item) => compute_object_lifetime_defaults ( tcx, item) ,
297
- _ => None ,
298
- }
299
- } else {
300
- Some ( tcx. arena . alloc_from_iter ( tcx. generics_of ( def_id) . params . iter ( ) . filter_map (
301
- |param| match param. kind {
302
- GenericParamDefKind :: Type { object_lifetime_default, .. } => {
303
- Some ( object_lifetime_default)
304
- }
305
- GenericParamDefKind :: Const { .. } => Some ( Set1 :: Empty ) ,
306
- GenericParamDefKind :: Lifetime => None ,
307
- } ,
308
- ) ) )
309
- }
310
- } ,
293
+ object_lifetime_defaults,
311
294
late_bound_vars_map : |tcx, id| resolve_lifetimes_for ( tcx, id) . late_bound_vars . get ( & id) ,
312
295
313
296
..* providers
@@ -1281,10 +1264,11 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> {
1281
1264
}
1282
1265
}
1283
1266
1284
- fn compute_object_lifetime_defaults < ' tcx > (
1267
+ fn object_lifetime_defaults < ' tcx > (
1285
1268
tcx : TyCtxt < ' tcx > ,
1286
- item : & hir :: Item < ' _ > ,
1269
+ def_id : LocalDefId ,
1287
1270
) -> Option < & ' tcx [ ObjectLifetimeDefault ] > {
1271
+ let hir:: Node :: Item ( item) = tcx. hir ( ) . get_by_def_id ( def_id) else { return None ; } ;
1288
1272
match item. kind {
1289
1273
hir:: ItemKind :: Struct ( _, ref generics)
1290
1274
| hir:: ItemKind :: Union ( _, ref generics)
@@ -1304,24 +1288,13 @@ fn compute_object_lifetime_defaults<'tcx>(
1304
1288
let object_lifetime_default_reprs: String = result
1305
1289
. iter ( )
1306
1290
. map ( |set| match * set {
1307
- Set1 :: Empty => "BaseDefault" . into ( ) ,
1308
- Set1 :: One ( Region :: Static ) => "'static" . into ( ) ,
1309
- Set1 :: One ( Region :: EarlyBound ( mut i, _) ) => generics
1310
- . params
1311
- . iter ( )
1312
- . find_map ( |param| match param. kind {
1313
- GenericParamKind :: Lifetime { .. } => {
1314
- if i == 0 {
1315
- return Some ( param. name . ident ( ) . to_string ( ) . into ( ) ) ;
1316
- }
1317
- i -= 1 ;
1318
- None
1319
- }
1320
- _ => None ,
1321
- } )
1322
- . unwrap ( ) ,
1323
- Set1 :: One ( _) => bug ! ( ) ,
1324
- Set1 :: Many => "Ambiguous" . into ( ) ,
1291
+ ObjectLifetimeDefault :: Empty => "BaseDefault" . into ( ) ,
1292
+ ObjectLifetimeDefault :: Static => "'static" . into ( ) ,
1293
+ ObjectLifetimeDefault :: Param ( def_id) => {
1294
+ let def_id = def_id. expect_local ( ) ;
1295
+ tcx. hir ( ) . ty_param_name ( def_id) . to_string ( ) . into ( )
1296
+ }
1297
+ ObjectLifetimeDefault :: Ambiguous => "Ambiguous" . into ( ) ,
1325
1298
} )
1326
1299
. collect :: < Vec < Cow < ' static , str > > > ( )
1327
1300
. join ( "," ) ;
@@ -1376,40 +1349,20 @@ fn object_lifetime_defaults_for_item<'tcx>(
1376
1349
}
1377
1350
1378
1351
Some ( match set {
1379
- Set1 :: Empty => Set1 :: Empty ,
1380
- Set1 :: One ( name) => {
1381
- if name == hir:: LifetimeName :: Static {
1382
- Set1 :: One ( Region :: Static )
1383
- } else {
1384
- generics
1385
- . params
1386
- . iter ( )
1387
- . filter_map ( |param| match param. kind {
1388
- GenericParamKind :: Lifetime { .. } => {
1389
- let param_def_id = tcx. hir ( ) . local_def_id ( param. hir_id ) ;
1390
- Some ( (
1391
- param_def_id,
1392
- hir:: LifetimeName :: Param ( param_def_id, param. name ) ,
1393
- ) )
1394
- }
1395
- _ => None ,
1396
- } )
1397
- . enumerate ( )
1398
- . find ( |& ( _, ( _, lt_name) ) | lt_name == name)
1399
- . map_or ( Set1 :: Many , |( i, ( def_id, _) ) | {
1400
- Set1 :: One ( Region :: EarlyBound ( i as u32 , def_id. to_def_id ( ) ) )
1401
- } )
1402
- }
1352
+ Set1 :: Empty => ObjectLifetimeDefault :: Empty ,
1353
+ Set1 :: One ( hir:: LifetimeName :: Static ) => ObjectLifetimeDefault :: Static ,
1354
+ Set1 :: One ( hir:: LifetimeName :: Param ( param_def_id, _) ) => {
1355
+ ObjectLifetimeDefault :: Param ( param_def_id. to_def_id ( ) )
1403
1356
}
1404
- Set1 :: Many => Set1 :: Many ,
1357
+ _ => ObjectLifetimeDefault :: Ambiguous ,
1405
1358
} )
1406
1359
}
1407
1360
GenericParamKind :: Const { .. } => {
1408
1361
// Generic consts don't impose any constraints.
1409
1362
//
1410
1363
// We still store a dummy value here to allow generic parameters
1411
1364
// in an arbitrary order.
1412
- Some ( Set1 :: Empty )
1365
+ Some ( ObjectLifetimeDefault :: Empty )
1413
1366
}
1414
1367
} ;
1415
1368
@@ -1769,24 +1722,37 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> {
1769
1722
} ;
1770
1723
1771
1724
let map = & self . map ;
1772
- let set_to_region = |set : & ObjectLifetimeDefault | match * set {
1773
- Set1 :: Empty => {
1725
+ let generics = self . tcx . generics_of ( def_id) ;
1726
+ let set_to_region = |set : ObjectLifetimeDefault | match set {
1727
+ ObjectLifetimeDefault :: Empty => {
1774
1728
if in_body {
1775
1729
None
1776
1730
} else {
1777
1731
Some ( Region :: Static )
1778
1732
}
1779
1733
}
1780
- Set1 :: One ( r) => {
1781
- let lifetimes = generic_args. args . iter ( ) . filter_map ( |arg| match arg {
1782
- GenericArg :: Lifetime ( lt) => Some ( lt) ,
1734
+ ObjectLifetimeDefault :: Static => Some ( Region :: Static ) ,
1735
+ ObjectLifetimeDefault :: Param ( param_def_id) => {
1736
+ let index = generics. param_def_id_to_index [ & param_def_id] ;
1737
+ generic_args. args . get ( index as usize ) . and_then ( |arg| match arg {
1738
+ GenericArg :: Lifetime ( lt) => map. defs . get ( & lt. hir_id ) . copied ( ) ,
1783
1739
_ => None ,
1784
- } ) ;
1785
- r. subst ( lifetimes, map)
1740
+ } )
1786
1741
}
1787
- Set1 :: Many => None ,
1742
+ ObjectLifetimeDefault :: Ambiguous => None ,
1788
1743
} ;
1789
- self . tcx . object_lifetime_defaults ( def_id) . unwrap ( ) . iter ( ) . map ( set_to_region) . collect ( )
1744
+ generics
1745
+ . params
1746
+ . iter ( )
1747
+ . filter_map ( |param| match param. kind {
1748
+ GenericParamDefKind :: Type { object_lifetime_default, .. } => {
1749
+ Some ( object_lifetime_default)
1750
+ }
1751
+ GenericParamDefKind :: Const { .. } => Some ( ObjectLifetimeDefault :: Empty ) ,
1752
+ GenericParamDefKind :: Lifetime => None ,
1753
+ } )
1754
+ . map ( set_to_region)
1755
+ . collect ( )
1790
1756
} ) ;
1791
1757
1792
1758
debug ! ( "visit_segment_args: object_lifetime_defaults={:?}" , object_lifetime_defaults) ;
0 commit comments