File tree Expand file tree Collapse file tree 2 files changed +18
-0
lines changed Expand file tree Collapse file tree 2 files changed +18
-0
lines changed Original file line number Diff line number Diff line change @@ -169,6 +169,14 @@ static MetadataResponse getSuperclassForMaybeIncompleteMetadata(
169
169
if (!classMetadata)
170
170
return {_swift_class_getSuperclass (metadata), MetadataState::Complete};
171
171
172
+ #if SWIFT_OBJC_INTEROP
173
+ // Artificial subclasses are not valid type metadata and
174
+ // tryGetCompleteMetadataNonblocking will crash on them. However, they're
175
+ // always fully set up, so we can just skip it and fetch the Subclass field.
176
+ if (classMetadata->isTypeMetadata () && classMetadata->isArtificialSubclass ())
177
+ return {classMetadata->Superclass , MetadataState::Complete};
178
+ #endif
179
+
172
180
MetadataState metadataState;
173
181
if (knownMetadataState)
174
182
metadataState = *knownMetadataState;
Original file line number Diff line number Diff line change @@ -983,6 +983,16 @@ CastsTests.test("Do not overuse __SwiftValue") {
983
983
}
984
984
#endif
985
985
986
+ #if _runtime(_ObjC)
987
+ CastsTests . test ( " Artificial subclass protocol conformance " ) {
988
+ class SwiftClass : NSObject { }
989
+ let subclass : AnyClass = objc_allocateClassPair ( SwiftClass . self,
990
+ " ArtificialSwiftSubclass " , 0 ) !
991
+ objc_registerClassPair ( subclass)
992
+ expectFalse ( subclass is P . Type )
993
+ }
994
+ #endif
995
+
986
996
CastsTests . test ( " Do not overuse __SwiftValue (non-ObjC) " ) {
987
997
struct Bar { }
988
998
// This should succeed because this is what __SwiftValue boxing is for
You can’t perform that action at this time.
0 commit comments