@@ -208,22 +208,6 @@ bool TypeBase::allowsOwnership() {
208208 return getCanonicalType ().isAnyClassReferenceType ();
209209}
210210
211- void TypeBase::getExistentialTypeProtocols (
212- SmallVectorImpl<ProtocolDecl*> &protocols) {
213- getCanonicalType ().getExistentialTypeProtocols (protocols);
214- }
215-
216- void CanType::getExistentialTypeProtocols (
217- SmallVectorImpl<ProtocolDecl*> &protocols) {
218- // FIXME: Remove this completely
219- auto layout = getExistentialLayout ();
220- assert (!layout.superclass && " Subclass existentials not fully supported yet" );
221- assert ((!layout.requiresClass || layout.requiresClassImplied ) &&
222- " Explicit AnyObject should not appear yet" );
223- for (auto proto : layout.getProtocols ())
224- protocols.push_back (proto->getDecl ());
225- }
226-
227211ExistentialLayout::ExistentialLayout (ProtocolType *type) {
228212 assert (type->isCanonical ());
229213
@@ -2637,7 +2621,7 @@ void ArchetypeType::populateNestedTypes() const {
26372621 ProtocolType::visitAllProtocols (getConformsTo (),
26382622 [&](ProtocolDecl *proto) -> bool {
26392623 // Objective-C protocols don't have type members.
2640- if (proto->hasClangNode ()) return false ;
2624+ if (proto->isObjC ()) return false ;
26412625
26422626 for (auto member : proto->getMembers ()) {
26432627 if (auto assocType = dyn_cast<AssociatedTypeDecl>(member)) {
@@ -3977,7 +3961,6 @@ static bool doesOpaqueClassUseNativeReferenceCounting(const ASTContext &ctx) {
39773961
39783962static bool usesNativeReferenceCounting (ClassDecl *theClass,
39793963 ResilienceExpansion resilience) {
3980- // NOTE: if you change this, change irgen::getReferenceCountingForClass.
39813964 // TODO: Resilience? there might be some legal avenue of changing this.
39823965 while (Type supertype = theClass->getSuperclass ()) {
39833966 theClass = supertype->getClassOrBoundGenericClass ();
@@ -3987,8 +3970,6 @@ static bool usesNativeReferenceCounting(ClassDecl *theClass,
39873970}
39883971
39893972bool TypeBase::usesNativeReferenceCounting (ResilienceExpansion resilience) {
3990- assert (allowsOwnership ());
3991-
39923973 CanType type = getCanonicalType ();
39933974 switch (type->getKind ()) {
39943975#define SUGARED_TYPE (id, parent ) case TypeKind::id:
@@ -4011,24 +3992,34 @@ bool TypeBase::usesNativeReferenceCounting(ResilienceExpansion resilience) {
40113992 return ::usesNativeReferenceCounting (
40123993 cast<BoundGenericClassType>(type)->getDecl (),
40133994 resilience);
3995+ case TypeKind::UnboundGeneric:
3996+ return ::usesNativeReferenceCounting (
3997+ cast<ClassDecl>(cast<UnboundGenericType>(type)->getDecl ()),
3998+ resilience);
40143999
40154000 case TypeKind::DynamicSelf:
40164001 return cast<DynamicSelfType>(type).getSelfType ()
40174002 ->usesNativeReferenceCounting (resilience);
40184003
40194004 case TypeKind::Archetype: {
40204005 auto archetype = cast<ArchetypeType>(type);
4021- assert (archetype->requiresClass ());
4006+ auto layout = archetype->getLayoutConstraint ();
4007+ assert (archetype->requiresClass () ||
4008+ (layout && layout->isRefCounted ()));
40224009 if (auto supertype = archetype->getSuperclass ())
40234010 return supertype->usesNativeReferenceCounting (resilience);
40244011 return ::doesOpaqueClassUseNativeReferenceCounting (type->getASTContext ());
40254012 }
40264013
40274014 case TypeKind::Protocol:
4028- case TypeKind::ProtocolComposition:
4015+ case TypeKind::ProtocolComposition: {
4016+ auto layout = getExistentialLayout ();
4017+ assert (layout.requiresClass && " Opaque existentials don't use refcounting" );
4018+ if (layout.superclass )
4019+ return layout.superclass ->usesNativeReferenceCounting (resilience);
40294020 return ::doesOpaqueClassUseNativeReferenceCounting (type->getASTContext ());
4021+ }
40304022
4031- case TypeKind::UnboundGeneric:
40324023 case TypeKind::Function:
40334024 case TypeKind::GenericFunction:
40344025 case TypeKind::SILFunction:
0 commit comments