diff --git a/lib/Sema/TypeCheckConcurrency.cpp b/lib/Sema/TypeCheckConcurrency.cpp index 05977fb759a..b10f9505473 100644 --- a/lib/Sema/TypeCheckConcurrency.cpp +++ b/lib/Sema/TypeCheckConcurrency.cpp @@ -7942,7 +7942,7 @@ ConformanceIsolationRequest::evaluate(Evaluator &evaluator, ProtocolConformance return ActorIsolation::forNonisolated(false); // If we are inferring isolated conformances and the conforming type is - // isolated to a global actor, + // isolated to a global actor, use the conforming type's isolation. auto nominal = dc->getSelfNominalTypeDecl(); if (ctx.LangOpts.hasFeature(Feature::InferIsolatedConformances) && nominal) { diff --git a/lib/Serialization/Deserialization.cpp b/lib/Serialization/Deserialization.cpp index 9ef86d0c701..911a654d323 100644 --- a/lib/Serialization/Deserialization.cpp +++ b/lib/Serialization/Deserialization.cpp @@ -1058,8 +1058,11 @@ ProtocolConformanceDeserializer::readNormalProtocolConformance( auto globalActorType = globalActorTypeOrError.get(); TypeExpr *globalActorTypeExpr = nullptr; - if (globalActorType) + if (globalActorType) { globalActorTypeExpr = TypeExpr::createImplicit(globalActorType, ctx); + rawOptions |= + static_cast(ProtocolConformanceFlags::GlobalActorIsolated); + } auto conformance = ctx.getNormalConformance( conformingType, proto, SourceLoc(), dc, diff --git a/test/Serialization/Inputs/def_isolated_conformance.swift b/test/Serialization/Inputs/def_isolated_conformance.swift index a339a12a777..f908f1eac16 100644 --- a/test/Serialization/Inputs/def_isolated_conformance.swift +++ b/test/Serialization/Inputs/def_isolated_conformance.swift @@ -8,3 +8,8 @@ public class MyClass { } extension MyClass: @MainActor MyProtocol { @MainActor public func f() { } } + +public protocol OtherProtocol { +} + +extension MyClass: OtherProtocol { } diff --git a/test/Serialization/isolated_conformance.swift b/test/Serialization/isolated_conformance.swift index 064bdf03345..d7e7701313c 100644 --- a/test/Serialization/isolated_conformance.swift +++ b/test/Serialization/isolated_conformance.swift @@ -1,5 +1,5 @@ // RUN: %empty-directory(%t) -// RUN: %target-swift-frontend -emit-module -target %target-swift-5.1-abi-triple -swift-version 6 -o %t/def_isolated_conformance.swiftmodule %S/Inputs/def_isolated_conformance.swift +// RUN: %target-swift-frontend -emit-module -target %target-swift-5.1-abi-triple -swift-version 6 -o %t/def_isolated_conformance.swiftmodule %S/Inputs/def_isolated_conformance.swift -default-isolation=MainActor // RUN: %target-swift-frontend -typecheck -verify -target %target-swift-5.1-abi-triple -swift-version 6 %s -I %t @@ -8,8 +8,11 @@ import def_isolated_conformance func acceptMyProtocol(_: some MyProtocol) { } +func acceptOtherProtocol(_: some MyProtocol) { } nonisolated func f(mc: MyClass) { acceptMyProtocol(mc) // expected-error@-1{{main actor-isolated conformance of 'MyClass' to 'MyProtocol' cannot be used in nonisolated context}} + acceptOtherProtocol(mc) + // expected-error@-1{{main actor-isolated conformance of 'MyClass' to 'MyProtocol' cannot be used in nonisolated context}} }