diff --git a/stdlib/public/BackDeployConcurrency/Actor.cpp b/stdlib/public/BackDeployConcurrency/Actor.cpp index 3db760534eb4b..a0c278cfdb25e 100644 --- a/stdlib/public/BackDeployConcurrency/Actor.cpp +++ b/stdlib/public/BackDeployConcurrency/Actor.cpp @@ -1712,8 +1712,10 @@ static bool isDefaultActorClass(const ClassMetadata *metadata) { assert(metadata->isTypeMetadata()); while (true) { // Trust the class descriptor if it says it's a default actor. - if (metadata->getDescription()->isDefaultActor()) + if (!metadata->isArtificialSubclass() && + metadata->getDescription()->isDefaultActor()) { return true; + } // Go to the superclass. metadata = metadata->Superclass; diff --git a/stdlib/public/Concurrency/Actor.cpp b/stdlib/public/Concurrency/Actor.cpp index 0df081f08b97e..e210fbb534bea 100644 --- a/stdlib/public/Concurrency/Actor.cpp +++ b/stdlib/public/Concurrency/Actor.cpp @@ -1775,7 +1775,8 @@ static bool isDefaultActorClass(const ClassMetadata *metadata) { assert(metadata->isTypeMetadata()); while (true) { // Trust the class descriptor if it says it's a default actor. - if (metadata->getDescription()->isDefaultActor()) { + if (!metadata->isArtificialSubclass() && + metadata->getDescription()->isDefaultActor()) { return true; } diff --git a/test/Concurrency/Runtime/actor_dynamic_subclass.swift b/test/Concurrency/Runtime/actor_dynamic_subclass.swift new file mode 100644 index 0000000000000..e1cbf96d68672 --- /dev/null +++ b/test/Concurrency/Runtime/actor_dynamic_subclass.swift @@ -0,0 +1,33 @@ +// RUN: %target-run-simple-swift(-Xfrontend -disable-availability-checking -parse-as-library) + +// REQUIRES: executable_test +// REQUIRES: concurrency +// REQUIRES: objc_interop + +// UNSUPPORTED: back_deployment_runtime +// UNSUPPORTED: use_os_stdlib + +// Make sure the concurrency runtime tolerates dynamically-subclassed actors. + +import ObjectiveC + +actor Foo: NSObject { + var x = 0 + + func doit() async { + x += 1 + try! await Task.sleep(nanoseconds: 1000) + x += 1 + } +} + +@main +enum Main { + static func main() async { + let FooSub = objc_allocateClassPair(Foo.self, "FooSub", 0) as! Foo.Type + objc_registerClassPair(FooSub) + let foosub = FooSub.init() + await foosub.doit() + } +} +