diff options
| author | Michael Goulet <michael@errs.io> | 2022-11-01 01:36:50 +0000 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2022-11-01 02:27:24 +0000 |
| commit | 32dae918a181e01b8ee01d256c1e54ddd6d0ea76 (patch) | |
| tree | a780e943d8c09cb882f3e1f3e781a5e451878c72 | |
| parent | a2037e3012ed6c59e91fadb693b35fd503cba117 (diff) | |
| download | rust-32dae918a181e01b8ee01d256c1e54ddd6d0ea76.tar.gz rust-32dae918a181e01b8ee01d256c1e54ddd6d0ea76.zip | |
Remap RPITIT substs properly
| -rw-r--r-- | compiler/rustc_trait_selection/src/traits/project.rs | 7 | ||||
| -rw-r--r-- | src/test/ui/impl-trait/in-trait/specialization-substs-remap.rs | 24 |
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(); +} |
