From b323f587fcd978deff5b922e60dcc4bcd208f2ab Mon Sep 17 00:00:00 2001 From: Oli Scherer Date: Mon, 19 Jun 2023 12:42:59 +0000 Subject: [PATCH] Handle weak type aliases by immediately resolving them to their aliased type --- compiler/rustc_ty_utils/src/opaque_types.rs | 23 +++++++++++-------- ...s-impl-trait-declaration-too-subtle.stderr | 5 ---- .../unnameable_type.stderr | 5 ---- 3 files changed, 14 insertions(+), 19 deletions(-) diff --git a/compiler/rustc_ty_utils/src/opaque_types.rs b/compiler/rustc_ty_utils/src/opaque_types.rs index b8dfff0b8ab..351c703cba1 100644 --- a/compiler/rustc_ty_utils/src/opaque_types.rs +++ b/compiler/rustc_ty_utils/src/opaque_types.rs @@ -107,6 +107,12 @@ impl<'tcx> TypeVisitor> for OpaqueTypeCollector<'tcx> { } } } + ty::Alias(ty::Weak, alias_ty) if alias_ty.def_id.is_local() => { + self.tcx + .type_of(alias_ty.def_id) + .subst(self.tcx, alias_ty.substs) + .visit_with(self)?; + } ty::Alias(ty::Projection, alias_ty) => { // This avoids having to do normalization of `Self::AssocTy` by only // supporting the case of a method defining opaque types from assoc types @@ -136,24 +142,23 @@ impl<'tcx> TypeVisitor> for OpaqueTypeCollector<'tcx> { ty::InternalSubsts::identity_for_item(self.tcx, parent), ); - if !check_substs_compatible(self.tcx, assoc, impl_substs) { + if check_substs_compatible(self.tcx, assoc, impl_substs) { + return self + .tcx + .type_of(assoc.def_id) + .subst(self.tcx, impl_substs) + .visit_with(self); + } else { self.tcx.sess.delay_span_bug( self.tcx.def_span(assoc.def_id), "item had incorrect substs", ); - return ControlFlow::Continue(()); } - - return self - .tcx - .type_of(assoc.def_id) - .subst(self.tcx, impl_substs) - .visit_with(self); } } } } - _ => {} + _ => trace!(kind=?t.kind()), } ControlFlow::Continue(()) } diff --git a/tests/ui/impl-trait/recursive-type-alias-impl-trait-declaration-too-subtle.stderr b/tests/ui/impl-trait/recursive-type-alias-impl-trait-declaration-too-subtle.stderr index 3e1981f096c..fe765271bd2 100644 --- a/tests/ui/impl-trait/recursive-type-alias-impl-trait-declaration-too-subtle.stderr +++ b/tests/ui/impl-trait/recursive-type-alias-impl-trait-declaration-too-subtle.stderr @@ -20,11 +20,6 @@ LL | fn eq(&self, _other: &(Foo, i32)) -> bool { | = note: expected signature `fn(&a::Bar, &(a::Bar, i32)) -> _` found signature `fn(&a::Bar, &(a::Foo, i32)) -> _` -note: this item must have the opaque type in its signature in order to be able to register hidden types - --> $DIR/recursive-type-alias-impl-trait-declaration-too-subtle.rs:10:12 - | -LL | fn eq(&self, _other: &(Foo, i32)) -> bool { - | ^^ error: unconstrained opaque type --> $DIR/recursive-type-alias-impl-trait-declaration-too-subtle.rs:18:16 diff --git a/tests/ui/type-alias-impl-trait/unnameable_type.stderr b/tests/ui/type-alias-impl-trait/unnameable_type.stderr index c609ace919e..e9032433494 100644 --- a/tests/ui/type-alias-impl-trait/unnameable_type.stderr +++ b/tests/ui/type-alias-impl-trait/unnameable_type.stderr @@ -25,11 +25,6 @@ LL | fn dont_define_this(_private: Private) {} | ^^^^^^^ = note: expected signature `fn(Private)` found signature `fn(MyPrivate)` -note: this item must have the opaque type in its signature in order to be able to register hidden types - --> $DIR/unnameable_type.rs:20:8 - | -LL | fn dont_define_this(_private: MyPrivate) {} - | ^^^^^^^^^^^^^^^^ error: aborting due to 2 previous errors