about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMatthias Krüger <matthias.krueger@famsik.de>2022-08-10 07:21:38 +0200
committerGitHub <noreply@github.com>2022-08-10 07:21:38 +0200
commit636f0c71cbb629aa3047c523842b4318117461a7 (patch)
tree7bc8a485be65a699df1386eb5a117224381854d2
parent354b831c32f71e212d0c2e430f2a2664c9957964 (diff)
parent750a04ea7fabd46b6156e32b1e910a06daf8c33c (diff)
downloadrust-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.rs15
-rw-r--r--src/test/ui/impl-trait/issue-100187.rs12
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() {}