@@ -540,9 +540,9 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
540540
541541 /// Get the previously recorded `to` local def id given the `from` local def id, obtained using
542542 /// `generics_def_id_map` field.
543- fn get_remapped_def_id ( & self , mut local_def_id : LocalDefId ) -> LocalDefId {
543+ fn get_remapped_def_id ( & self , local_def_id : LocalDefId ) -> LocalDefId {
544544 // `generics_def_id_map` is a stack of mappings. As we go deeper in impl traits nesting we
545- // push new mappings so we need to try first the latest mappings, hence `iter().rev()`.
545+ // push new mappings, so we first need to get the latest (innermost) mappings, hence `iter().rev()`.
546546 //
547547 // Consider:
548548 //
@@ -552,18 +552,13 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
552552 //
553553 // `[[fn#'b -> impl_trait#'b], [fn#'b -> impl_sized#'b]]`
554554 //
555- // for the opaque type generated on `impl Sized + 'b`, We want the result to be:
556- // impl_sized#'b, so iterating forward is the wrong thing to do.
557- for map in self . generics_def_id_map . iter ( ) . rev ( ) {
558- if let Some ( r) = map. get ( & local_def_id) {
559- debug ! ( "def_id_remapper: remapping from `{local_def_id:?}` to `{r:?}`" ) ;
560- local_def_id = * r;
561- } else {
562- debug ! ( "def_id_remapper: no remapping for `{local_def_id:?}` found in map" ) ;
563- }
564- }
565-
566- local_def_id
555+ // for the opaque type generated on `impl Sized + 'b`, we want the result to be: impl_sized#'b.
556+ // So, if we were trying to find first from the start (outermost) would give the wrong result, impl_trait#'b.
557+ self . generics_def_id_map
558+ . iter ( )
559+ . rev ( )
560+ . find_map ( |map| map. get ( & local_def_id) . map ( |local_def_id| * local_def_id) )
561+ . unwrap_or ( local_def_id)
567562 }
568563
569564 /// Freshen the `LoweringContext` and ready it to lower a nested item.
@@ -1641,7 +1636,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
16411636
16421637 LifetimeRes :: Fresh { param, binder : _ } => {
16431638 debug_assert_eq ! ( lifetime. ident. name, kw:: UnderscoreLifetime ) ;
1644- if let Some ( old_def_id) = self . opt_local_def_id ( param) && remapping. get ( & old_def_id) . is_none ( ) {
1639+ if let Some ( old_def_id) = self . orig_opt_local_def_id ( param) && remapping. get ( & old_def_id) . is_none ( ) {
16451640 let node_id = self . next_node_id ( ) ;
16461641
16471642 let new_def_id = self . create_def (
@@ -1886,7 +1881,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
18861881 let extra_lifetime_params = self . resolver . take_extra_lifetime_params ( opaque_ty_node_id) ;
18871882 debug ! ( ?extra_lifetime_params) ;
18881883 for ( ident, outer_node_id, outer_res) in extra_lifetime_params {
1889- let outer_def_id = self . local_def_id ( outer_node_id) ;
1884+ let outer_def_id = self . orig_local_def_id ( outer_node_id) ;
18901885 let inner_node_id = self . next_node_id ( ) ;
18911886
18921887 // Add a definition for the in scope lifetime def.
0 commit comments