about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2022-11-01 01:36:50 +0000
committerMichael Goulet <michael@errs.io>2022-11-01 02:27:24 +0000
commit32dae918a181e01b8ee01d256c1e54ddd6d0ea76 (patch)
treea780e943d8c09cb882f3e1f3e781a5e451878c72
parenta2037e3012ed6c59e91fadb693b35fd503cba117 (diff)
downloadrust-32dae918a181e01b8ee01d256c1e54ddd6d0ea76.tar.gz
rust-32dae918a181e01b8ee01d256c1e54ddd6d0ea76.zip
Remap RPITIT substs properly
-rw-r--r--compiler/rustc_trait_selection/src/traits/project.rs7
-rw-r--r--src/test/ui/impl-trait/in-trait/specialization-substs-remap.rs24
2 files changed, 31 insertions, 0 deletions
diff --git a/compiler/rustc_trait_selection/src/traits/project.rs b/compiler/rustc_trait_selection/src/traits/project.rs
index ad216e5502d..474ae22e3d5 100644
--- a/compiler/rustc_trait_selection/src/traits/project.rs
+++ b/compiler/rustc_trait_selection/src/traits/project.rs
@@ -2260,6 +2260,13 @@ fn confirm_impl_trait_in_trait_candidate<'tcx>(
     // since `data.substs` are the impl substs.
     let impl_fn_substs =
         obligation.predicate.substs.rebase_onto(tcx, tcx.parent(trait_fn_def_id), data.substs);
+    let impl_fn_substs = translate_substs(
+        selcx.infcx(),
+        obligation.param_env,
+        data.impl_def_id,
+        impl_fn_substs,
+        leaf_def.defining_node,
+    );
 
     if !check_substs_compatible(tcx, &leaf_def.item, impl_fn_substs) {
         let err = tcx.ty_error_with_message(
diff --git a/src/test/ui/impl-trait/in-trait/specialization-substs-remap.rs b/src/test/ui/impl-trait/in-trait/specialization-substs-remap.rs
new file mode 100644
index 00000000000..c9ee877db8e
--- /dev/null
+++ b/src/test/ui/impl-trait/in-trait/specialization-substs-remap.rs
@@ -0,0 +1,24 @@
+// check-pass
+
+#![feature(specialization)]
+#![feature(return_position_impl_trait_in_trait)]
+#![allow(incomplete_features)]
+
+trait Foo {
+    fn bar(&self) -> impl Sized;
+}
+
+impl<U> Foo for U
+where
+    U: Copy,
+{
+    fn bar(&self) -> U {
+        *self
+    }
+}
+
+impl Foo for i32 {}
+
+fn main() {
+    let _: i32 = 1i32.bar();
+}