Skip to content

Commit

Permalink
Rollup merge of #100340 - spastorino:fix-100187, r=compiler-errors
Browse files Browse the repository at this point in the history
Iterate generics_def_id_map in reverse order to fix P-critical issue

Closes #100187

Fixes a `P-critical` beta regression.
  • Loading branch information
matthiaskrgr committed Aug 10, 2022
2 parents 354b831 + 750a04e commit 636f0c7
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 1 deletion.
15 changes: 14 additions & 1 deletion compiler/rustc_ast_lowering/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,20 @@ impl ResolverAstLoweringExt for ResolverAstLowering {
}

fn get_remapped_def_id(&self, mut local_def_id: LocalDefId) -> LocalDefId {
for map in &self.generics_def_id_map {
// `generics_def_id_map` is a stack of mappings. As we go deeper in impl traits nesting we
// push new mappings so we need to try first the latest mappings, hence `iter().rev()`.
//
// Consider:
//
// `fn test<'a, 'b>() -> impl Trait<&'a u8, Ty = impl Sized + 'b> {}`
//
// We would end with a generics_def_id_map like:
//
// `[[fn#'b -> impl_trait#'b], [fn#'b -> impl_sized#'b]]`
//
// for the opaque type generated on `impl Sized + 'b`, We want the result to be:
// impl_sized#'b, so iterating forward is the wrong thing to do.
for map in self.generics_def_id_map.iter().rev() {
if let Some(r) = map.get(&local_def_id) {
debug!("def_id_remapper: remapping from `{local_def_id:?}` to `{r:?}`");
local_def_id = *r;
Expand Down
12 changes: 12 additions & 0 deletions src/test/ui/impl-trait/issue-100187.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// check-pass

trait Trait<T> {
type Ty;
}
impl Trait<&u8> for () {
type Ty = ();
}

fn test<'a, 'b>() -> impl Trait<&'a u8, Ty = impl Sized + 'b> {}

fn main() {}

0 comments on commit 636f0c7

Please sign in to comment.