diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2022-08-10 07:21:38 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-08-10 07:21:38 +0200 |
| commit | 636f0c71cbb629aa3047c523842b4318117461a7 (patch) | |
| tree | 7bc8a485be65a699df1386eb5a117224381854d2 | |
| parent | 354b831c32f71e212d0c2e430f2a2664c9957964 (diff) | |
| parent | 750a04ea7fabd46b6156e32b1e910a06daf8c33c (diff) | |
| download | rust-636f0c71cbb629aa3047c523842b4318117461a7.tar.gz rust-636f0c71cbb629aa3047c523842b4318117461a7.zip | |
Rollup merge of #100340 - spastorino:fix-100187, r=compiler-errors
Iterate generics_def_id_map in reverse order to fix P-critical issue Closes #100187 Fixes a `P-critical` beta regression.
| -rw-r--r-- | compiler/rustc_ast_lowering/src/lib.rs | 15 | ||||
| -rw-r--r-- | src/test/ui/impl-trait/issue-100187.rs | 12 |
2 files changed, 26 insertions, 1 deletions
diff --git a/compiler/rustc_ast_lowering/src/lib.rs b/compiler/rustc_ast_lowering/src/lib.rs index 0562f7b88a3..38d30d0ffde 100644 --- a/compiler/rustc_ast_lowering/src/lib.rs +++ b/compiler/rustc_ast_lowering/src/lib.rs @@ -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; diff --git a/src/test/ui/impl-trait/issue-100187.rs b/src/test/ui/impl-trait/issue-100187.rs new file mode 100644 index 00000000000..fc541c69629 --- /dev/null +++ b/src/test/ui/impl-trait/issue-100187.rs @@ -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() {} |
