@@ -614,12 +614,19 @@ bool swift::_conformsToProtocolInContext(
614614 const OpaqueValue *value,
615615 const Metadata *type,
616616 ProtocolDescriptorRef protocol,
617- const WitnessTable **conformance) {
617+ const WitnessTable **conformance,
618+ bool prohibitIsolatedConformances) {
618619
619620 ConformanceExecutionContext context;
620621 if (!_conformsToProtocol (value, type, protocol, conformance, &context))
621622 return false ;
622623
624+ // If we aren't allowed to use isolated conformances and we ended up with
625+ // one, fail.
626+ if (prohibitIsolatedConformances &&
627+ context.globalActorIsolationType )
628+ return false ;
629+
623630 if (!swift_isInConformanceExecutionContext (type, &context))
624631 return false ;
625632
@@ -631,7 +638,8 @@ bool swift::_conformsToProtocolInContext(
631638static bool _conformsToProtocols (const OpaqueValue *value,
632639 const Metadata *type,
633640 const ExistentialTypeMetadata *existentialType,
634- const WitnessTable **conformances) {
641+ const WitnessTable **conformances,
642+ bool prohibitIsolatedConformances) {
635643 if (auto *superclass = existentialType->getSuperclassConstraint ()) {
636644 if (!swift_dynamicCastMetatype (type, superclass))
637645 return false ;
@@ -644,7 +652,7 @@ static bool _conformsToProtocols(const OpaqueValue *value,
644652
645653 for (auto protocol : existentialType->getProtocols ()) {
646654 if (!_conformsToProtocolInContext (
647- value, type, protocol, conformances))
655+ value, type, protocol, conformances, prohibitIsolatedConformances ))
648656 return false ;
649657 if (conformances != nullptr && protocol.needsWitnessTable ()) {
650658 assert (*conformances != nullptr );
@@ -1050,9 +1058,10 @@ swift_dynamicCastMetatypeImpl(const Metadata *sourceType,
10501058}
10511059
10521060static const Metadata *
1053- swift_dynamicCastMetatypeUnconditionalImpl (const Metadata *sourceType,
1054- const Metadata *targetType,
1055- const char *file, unsigned line, unsigned column) {
1061+ swift_dynamicCastMetatypeUnconditionalImpl (
1062+ const Metadata *sourceType,
1063+ const Metadata *targetType,
1064+ const char *file, unsigned line, unsigned column) {
10561065 auto origSourceType = sourceType;
10571066
10581067 // Identical types always succeed
@@ -1138,7 +1147,8 @@ swift_dynamicCastMetatypeUnconditionalImpl(const Metadata *sourceType,
11381147
11391148 case MetadataKind::Existential: {
11401149 auto targetTypeAsExistential = static_cast <const ExistentialTypeMetadata *>(targetType);
1141- if (_conformsToProtocols (nullptr , sourceType, targetTypeAsExistential, nullptr ))
1150+ if (_conformsToProtocols (nullptr , sourceType, targetTypeAsExistential,
1151+ nullptr , /* prohibitIsolatedConformances=*/ false ))
11421152 return origSourceType;
11431153 swift_dynamicCastFailure (sourceType, targetType);
11441154 }
0 commit comments