Skip to content

Commit cd3d8b3

Browse files
authored
Merge pull request swiftlang#37976 from mikeash/fix-protocol-conformance-KVO-5.5
[5.5][Runtime] Fix crash in protocol conformance checks on KVO artificial subclasses.
2 parents 4934207 + d41584d commit cd3d8b3

File tree

2 files changed

+18
-0
lines changed

2 files changed

+18
-0
lines changed

stdlib/public/runtime/ProtocolConformance.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,14 @@ static MetadataResponse getSuperclassForMaybeIncompleteMetadata(
169169
if (!classMetadata)
170170
return {_swift_class_getSuperclass(metadata), MetadataState::Complete};
171171

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+
172180
MetadataState metadataState;
173181
if (knownMetadataState)
174182
metadataState = *knownMetadataState;

test/Casting/Casts.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -954,4 +954,14 @@ CastsTests.test("Recursive AnyHashable") {
954954
expectEqual(s.x, p)
955955
}
956956

957+
#if _runtime(_ObjC)
958+
CastsTests.test("Artificial subclass protocol conformance") {
959+
class SwiftClass: NSObject {}
960+
let subclass: AnyClass = objc_allocateClassPair(SwiftClass.self,
961+
"ArtificialSwiftSubclass", 0)!
962+
objc_registerClassPair(subclass)
963+
expectFalse(subclass is P.Type)
964+
}
965+
#endif
966+
957967
runAllTests()

0 commit comments

Comments
 (0)