@@ -51,9 +51,9 @@ use rustc_data_structures::sorted_map::SortedMap;
51
51
use rustc_data_structures:: stable_hasher:: { HashStable , StableHasher } ;
52
52
use rustc_data_structures:: sync:: Lrc ;
53
53
use rustc_errors:: { DiagArgFromDisplay , DiagCtxt , StashKey } ;
54
- use rustc_hir as hir;
55
54
use rustc_hir:: def:: { DefKind , LifetimeRes , Namespace , PartialRes , PerNS , Res } ;
56
55
use rustc_hir:: def_id:: { LocalDefId , LocalDefIdMap , CRATE_DEF_ID , LOCAL_CRATE } ;
56
+ use rustc_hir:: { self as hir} ;
57
57
use rustc_hir:: {
58
58
ConstArg , GenericArg , HirId , ItemLocalMap , MissingLifetimeKind , ParamName , TraitCandidate ,
59
59
} ;
@@ -1384,14 +1384,20 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1384
1384
}
1385
1385
None
1386
1386
}
1387
+ // Ignore `use` syntax since that is not valid in objects.
1388
+ GenericBound :: Use ( _, span) => {
1389
+ this. dcx ( )
1390
+ . span_delayed_bug ( * span, "use<> not allowed in dyn types" ) ;
1391
+ None
1392
+ }
1387
1393
} ) ) ;
1388
1394
let lifetime_bound =
1389
1395
lifetime_bound. unwrap_or_else ( || this. elided_dyn_bound ( t. span ) ) ;
1390
1396
( bounds, lifetime_bound)
1391
1397
} ) ;
1392
1398
hir:: TyKind :: TraitObject ( bounds, lifetime_bound, * kind)
1393
1399
}
1394
- TyKind :: ImplTrait ( def_node_id, bounds, precise_capturing ) => {
1400
+ TyKind :: ImplTrait ( def_node_id, bounds) => {
1395
1401
let span = t. span ;
1396
1402
match itctx {
1397
1403
ImplTraitContext :: OpaqueTy { origin, fn_kind } => self . lower_opaque_impl_trait (
@@ -1401,12 +1407,15 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1401
1407
bounds,
1402
1408
fn_kind,
1403
1409
itctx,
1404
- precise_capturing. as_deref ( ) . map ( |( args, span) | ( args. as_slice ( ) , * span) ) ,
1405
1410
) ,
1406
1411
ImplTraitContext :: Universal => {
1407
- if let Some ( & ( _, span) ) = precise_capturing. as_deref ( ) {
1412
+ if let Some ( span) = bounds. iter ( ) . find_map ( |bound| match * bound {
1413
+ ast:: GenericBound :: Use ( _, span) => Some ( span) ,
1414
+ _ => None ,
1415
+ } ) {
1408
1416
self . tcx . dcx ( ) . emit_err ( errors:: NoPreciseCapturesOnApit { span } ) ;
1409
- } ;
1417
+ }
1418
+
1410
1419
let span = t. span ;
1411
1420
1412
1421
// HACK: pprust breaks strings with newlines when the type
@@ -1517,7 +1526,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1517
1526
bounds : & GenericBounds ,
1518
1527
fn_kind : Option < FnDeclKind > ,
1519
1528
itctx : ImplTraitContext ,
1520
- precise_capturing_args : Option < ( & [ PreciseCapturingArg ] , Span ) > ,
1521
1529
) -> hir:: TyKind < ' hir > {
1522
1530
// Make sure we know that some funky desugaring has been going on here.
1523
1531
// This is a first: there is code in other places like for loop
@@ -1526,59 +1534,64 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1526
1534
// frequently opened issues show.
1527
1535
let opaque_ty_span = self . mark_span_with_reason ( DesugaringKind :: OpaqueTy , span, None ) ;
1528
1536
1529
- let captured_lifetimes_to_duplicate =
1530
- if let Some ( ( precise_capturing, _) ) = precise_capturing_args {
1531
- // We'll actually validate these later on; all we need is the list of
1532
- // lifetimes to duplicate during this portion of lowering.
1533
- precise_capturing
1534
- . iter ( )
1535
- . filter_map ( |arg| match arg {
1536
- PreciseCapturingArg :: Lifetime ( lt) => Some ( * lt) ,
1537
- PreciseCapturingArg :: Arg ( ..) => None ,
1538
- } )
1539
- // Add in all the lifetimes mentioned in the bounds. We will error
1540
- // them out later, but capturing them here is important to make sure
1541
- // they actually get resolved in resolve_bound_vars.
1542
- . chain ( lifetime_collector:: lifetimes_in_bounds ( self . resolver , bounds) )
1543
- . collect ( )
1544
- } else {
1545
- match origin {
1546
- hir:: OpaqueTyOrigin :: TyAlias { .. } => {
1547
- // type alias impl trait and associated type position impl trait were
1548
- // decided to capture all in-scope lifetimes, which we collect for
1549
- // all opaques during resolution.
1537
+ let captured_lifetimes_to_duplicate = if let Some ( args) =
1538
+ // We only look for one `use<...>` syntax since we syntactially reject more than one.
1539
+ bounds. iter ( ) . find_map (
1540
+ |bound| match bound {
1541
+ ast:: GenericBound :: Use ( a, _) => Some ( a) ,
1542
+ _ => None ,
1543
+ } ,
1544
+ ) {
1545
+ // We'll actually validate these later on; all we need is the list of
1546
+ // lifetimes to duplicate during this portion of lowering.
1547
+ args. iter ( )
1548
+ . filter_map ( |arg| match arg {
1549
+ PreciseCapturingArg :: Lifetime ( lt) => Some ( * lt) ,
1550
+ PreciseCapturingArg :: Arg ( ..) => None ,
1551
+ } )
1552
+ // Add in all the lifetimes mentioned in the bounds. We will error
1553
+ // them out later, but capturing them here is important to make sure
1554
+ // they actually get resolved in resolve_bound_vars.
1555
+ . chain ( lifetime_collector:: lifetimes_in_bounds ( self . resolver , bounds) )
1556
+ . collect ( )
1557
+ } else {
1558
+ match origin {
1559
+ hir:: OpaqueTyOrigin :: TyAlias { .. } => {
1560
+ // type alias impl trait and associated type position impl trait were
1561
+ // decided to capture all in-scope lifetimes, which we collect for
1562
+ // all opaques during resolution.
1563
+ self . resolver
1564
+ . take_extra_lifetime_params ( opaque_ty_node_id)
1565
+ . into_iter ( )
1566
+ . map ( |( ident, id, _) | Lifetime { id, ident } )
1567
+ . collect ( )
1568
+ }
1569
+ hir:: OpaqueTyOrigin :: FnReturn ( ..) => {
1570
+ if matches ! (
1571
+ fn_kind. expect( "expected RPITs to be lowered with a FnKind" ) ,
1572
+ FnDeclKind :: Impl | FnDeclKind :: Trait
1573
+ ) || self . tcx . features ( ) . lifetime_capture_rules_2024
1574
+ || span. at_least_rust_2024 ( )
1575
+ {
1576
+ // return-position impl trait in trait was decided to capture all
1577
+ // in-scope lifetimes, which we collect for all opaques during resolution.
1550
1578
self . resolver
1551
1579
. take_extra_lifetime_params ( opaque_ty_node_id)
1552
1580
. into_iter ( )
1553
1581
. map ( |( ident, id, _) | Lifetime { id, ident } )
1554
1582
. collect ( )
1555
- }
1556
- hir:: OpaqueTyOrigin :: FnReturn ( ..) => {
1557
- if matches ! (
1558
- fn_kind. expect( "expected RPITs to be lowered with a FnKind" ) ,
1559
- FnDeclKind :: Impl | FnDeclKind :: Trait
1560
- ) || self . tcx . features ( ) . lifetime_capture_rules_2024
1561
- || span. at_least_rust_2024 ( )
1562
- {
1563
- // return-position impl trait in trait was decided to capture all
1564
- // in-scope lifetimes, which we collect for all opaques during resolution.
1565
- self . resolver
1566
- . take_extra_lifetime_params ( opaque_ty_node_id)
1567
- . into_iter ( )
1568
- . map ( |( ident, id, _) | Lifetime { id, ident } )
1569
- . collect ( )
1570
- } else {
1571
- // in fn return position, like the `fn test<'a>() -> impl Debug + 'a`
1572
- // example, we only need to duplicate lifetimes that appear in the
1573
- // bounds, since those are the only ones that are captured by the opaque.
1574
- lifetime_collector:: lifetimes_in_bounds ( self . resolver , bounds)
1575
- }
1576
- }
1577
- hir:: OpaqueTyOrigin :: AsyncFn ( ..) => {
1578
- unreachable ! ( "should be using `lower_async_fn_ret_ty`" )
1583
+ } else {
1584
+ // in fn return position, like the `fn test<'a>() -> impl Debug + 'a`
1585
+ // example, we only need to duplicate lifetimes that appear in the
1586
+ // bounds, since those are the only ones that are captured by the opaque.
1587
+ lifetime_collector:: lifetimes_in_bounds ( self . resolver , bounds)
1579
1588
}
1580
1589
}
1581
- } ;
1590
+ hir:: OpaqueTyOrigin :: AsyncFn ( ..) => {
1591
+ unreachable ! ( "should be using `lower_async_fn_ret_ty`" )
1592
+ }
1593
+ }
1594
+ } ;
1582
1595
debug ! ( ?captured_lifetimes_to_duplicate) ;
1583
1596
1584
1597
self . lower_opaque_inner (
@@ -1588,7 +1601,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1588
1601
captured_lifetimes_to_duplicate,
1589
1602
span,
1590
1603
opaque_ty_span,
1591
- precise_capturing_args,
1592
1604
|this| this. lower_param_bounds ( bounds, itctx) ,
1593
1605
)
1594
1606
}
@@ -1601,7 +1613,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1601
1613
captured_lifetimes_to_duplicate : FxIndexSet < Lifetime > ,
1602
1614
span : Span ,
1603
1615
opaque_ty_span : Span ,
1604
- precise_capturing_args : Option < ( & [ PreciseCapturingArg ] , Span ) > ,
1605
1616
lower_item_bounds : impl FnOnce ( & mut Self ) -> & ' hir [ hir:: GenericBound < ' hir > ] ,
1606
1617
) -> hir:: TyKind < ' hir > {
1607
1618
let opaque_ty_def_id = self . create_def (
@@ -1688,18 +1699,8 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1688
1699
// Install the remapping from old to new (if any). This makes sure that
1689
1700
// any lifetimes that would have resolved to the def-id of captured
1690
1701
// lifetimes are remapped to the new *synthetic* lifetimes of the opaque.
1691
- let ( bounds, precise_capturing_args) =
1692
- this. with_remapping ( captured_to_synthesized_mapping, |this| {
1693
- (
1694
- lower_item_bounds ( this) ,
1695
- precise_capturing_args. map ( |( precise_capturing, span) | {
1696
- (
1697
- this. lower_precise_capturing_args ( precise_capturing) ,
1698
- this. lower_span ( span) ,
1699
- )
1700
- } ) ,
1701
- )
1702
- } ) ;
1702
+ let bounds = this
1703
+ . with_remapping ( captured_to_synthesized_mapping, |this| lower_item_bounds ( this) ) ;
1703
1704
1704
1705
let generic_params =
1705
1706
this. arena . alloc_from_iter ( synthesized_lifetime_definitions. iter ( ) . map (
@@ -1744,7 +1745,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1744
1745
origin,
1745
1746
lifetime_mapping,
1746
1747
in_trait,
1747
- precise_capturing_args,
1748
1748
} ;
1749
1749
1750
1750
// Generate an `type Foo = impl Trait;` declaration.
@@ -1955,7 +1955,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1955
1955
captured_lifetimes,
1956
1956
span,
1957
1957
opaque_ty_span,
1958
- None ,
1959
1958
|this| {
1960
1959
let bound = this. lower_coroutine_fn_output_type_to_bound (
1961
1960
output,
@@ -2038,6 +2037,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
2038
2037
GenericBound :: Outlives ( lifetime) => {
2039
2038
hir:: GenericBound :: Outlives ( self . lower_lifetime ( lifetime) )
2040
2039
}
2040
+ GenericBound :: Use ( args, span) => hir:: GenericBound :: Use (
2041
+ self . lower_precise_capturing_args ( args) ,
2042
+ self . lower_span ( * span) ,
2043
+ ) ,
2041
2044
}
2042
2045
}
2043
2046
0 commit comments