@@ -533,9 +533,9 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
533
533
534
534
/// Get the previously recorded `to` local def id given the `from` local def id, obtained using
535
535
/// `generics_def_id_map` field.
536
- fn get_remapped_def_id ( & self , mut local_def_id : LocalDefId ) -> LocalDefId {
536
+ fn get_remapped_def_id ( & self , local_def_id : LocalDefId ) -> LocalDefId {
537
537
// `generics_def_id_map` is a stack of mappings. As we go deeper in impl traits nesting we
538
- // push new mappings so we need to try first the latest mappings, hence `iter().rev()`.
538
+ // push new mappings, so we first need to get the latest (innermost) mappings, hence `iter().rev()`.
539
539
//
540
540
// Consider:
541
541
//
@@ -545,18 +545,13 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
545
545
//
546
546
// `[[fn#'b -> impl_trait#'b], [fn#'b -> impl_sized#'b]]`
547
547
//
548
- // for the opaque type generated on `impl Sized + 'b`, We want the result to be:
549
- // impl_sized#'b, so iterating forward is the wrong thing to do.
550
- for map in self . generics_def_id_map . iter ( ) . rev ( ) {
551
- if let Some ( r) = map. get ( & local_def_id) {
552
- debug ! ( "def_id_remapper: remapping from `{local_def_id:?}` to `{r:?}`" ) ;
553
- local_def_id = * r;
554
- } else {
555
- debug ! ( "def_id_remapper: no remapping for `{local_def_id:?}` found in map" ) ;
556
- }
557
- }
558
-
559
- local_def_id
548
+ // for the opaque type generated on `impl Sized + 'b`, we want the result to be: impl_sized#'b.
549
+ // So, if we were trying to find first from the start (outermost) would give the wrong result, impl_trait#'b.
550
+ self . generics_def_id_map
551
+ . iter ( )
552
+ . rev ( )
553
+ . find_map ( |map| map. get ( & local_def_id) . map ( |local_def_id| * local_def_id) )
554
+ . unwrap_or ( local_def_id)
560
555
}
561
556
562
557
/// Freshen the `LoweringContext` and ready it to lower a nested item.
@@ -1615,7 +1610,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1615
1610
1616
1611
LifetimeRes :: Fresh { param, binder : _ } => {
1617
1612
debug_assert_eq ! ( lifetime. ident. name, kw:: UnderscoreLifetime ) ;
1618
- if let Some ( old_def_id) = self . opt_local_def_id ( param) && remapping. get ( & old_def_id) . is_none ( ) {
1613
+ if let Some ( old_def_id) = self . orig_opt_local_def_id ( param) && remapping. get ( & old_def_id) . is_none ( ) {
1619
1614
let node_id = self . next_node_id ( ) ;
1620
1615
1621
1616
let new_def_id = self . create_def (
@@ -1884,7 +1879,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1884
1879
let extra_lifetime_params = self . resolver . take_extra_lifetime_params ( opaque_ty_node_id) ;
1885
1880
debug ! ( ?extra_lifetime_params) ;
1886
1881
for ( ident, outer_node_id, outer_res) in extra_lifetime_params {
1887
- let outer_def_id = self . local_def_id ( outer_node_id) ;
1882
+ let outer_def_id = self . orig_local_def_id ( outer_node_id) ;
1888
1883
let inner_node_id = self . next_node_id ( ) ;
1889
1884
1890
1885
// Add a definition for the in scope lifetime def.
0 commit comments