diff options
| author | Michael Goulet <michael@errs.io> | 2023-03-15 22:55:00 +0000 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2023-03-16 01:56:49 +0000 |
| commit | 0949da8f4e309ac5e5035250bd662dfdbd5c32b4 (patch) | |
| tree | d4143cf7115dc3a2667551d13f6b56a813052c2c /compiler/rustc_ty_utils/src | |
| parent | c5c43407603599f4ff2b217cc09be2cc5f39967d (diff) | |
| download | rust-0949da8f4e309ac5e5035250bd662dfdbd5c32b4.tar.gz rust-0949da8f4e309ac5e5035250bd662dfdbd5c32b4.zip | |
Install projection from RPITIT to default trait method opaque correctly
Diffstat (limited to 'compiler/rustc_ty_utils/src')
| -rw-r--r-- | compiler/rustc_ty_utils/src/ty.rs | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/compiler/rustc_ty_utils/src/ty.rs b/compiler/rustc_ty_utils/src/ty.rs index ad05b68f1b4..df4b8543ba6 100644 --- a/compiler/rustc_ty_utils/src/ty.rs +++ b/compiler/rustc_ty_utils/src/ty.rs @@ -268,8 +268,6 @@ impl<'tcx> TypeVisitor<TyCtxt<'tcx>> for ImplTraitInTraitFinder<'_, 'tcx> { fn visit_ty(&mut self, ty: Ty<'tcx>) -> std::ops::ControlFlow<Self::BreakTy> { if let ty::Alias(ty::Projection, alias_ty) = *ty.kind() - // FIXME(-Zlower-impl-trait-in-trait-to-assoc-ty) need to project to the opaque, could - // get it via type_of + subst. && self.tcx.is_impl_trait_in_trait(alias_ty.def_id) && self.tcx.impl_trait_in_trait_parent_fn(alias_ty.def_id) == self.fn_def_id && self.seen.insert(alias_ty.def_id) @@ -284,11 +282,24 @@ impl<'tcx> TypeVisitor<TyCtxt<'tcx>> for ImplTraitInTraitFinder<'_, 'tcx> { re } }); + + // If we're lowering to associated item, install the opaque type which is just + // the `type_of` of the trait's associated item. If we're using the old lowering + // strategy, then just reinterpret the associated type like an opaque :^) + let default_ty = if self.tcx.lower_impl_trait_in_trait_to_assoc_ty() { + self + .tcx + .type_of(alias_ty.def_id) + .subst(self.tcx, alias_ty.substs) + } else { + self.tcx.mk_alias(ty::Opaque, alias_ty) + }; + self.predicates.push( ty::Binder::bind_with_vars( ty::ProjectionPredicate { projection_ty: alias_ty, - term: self.tcx.mk_alias(ty::Opaque, alias_ty).into(), + term: default_ty.into(), }, self.bound_vars, ) |
