Skip to content

Commit 5c5acac

Browse files
committed
[Concurrency] CaseIterable synthesized allCases must be nonisolated
1 parent d9fefc8 commit 5c5acac

File tree

4 files changed

+39
-0
lines changed

4 files changed

+39
-0
lines changed

lib/Sema/DerivedConformanceCaseIterable.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ static Type deriveCaseIterable_AllCases(DerivedConformance &derived) {
7979
}
8080

8181
ValueDecl *DerivedConformance::deriveCaseIterable(ValueDecl *requirement) {
82+
auto &C = requirement->getASTContext();
83+
8284
// Conformance can't be synthesized in an extension.
8385
if (checkAndDiagnoseDisallowedContext(requirement))
8486
return nullptr;
@@ -102,6 +104,9 @@ ValueDecl *DerivedConformance::deriveCaseIterable(ValueDecl *requirement) {
102104
SynthesizedIntroducer::Var, Context.Id_allCases, returnTy, returnTy,
103105
/*isStatic=*/true, /*isFinal=*/true);
104106

107+
propDecl->getAttrs().add(
108+
new (C) NonisolatedAttr(/*unsafe=*/false, /*implicit=*/true));
109+
105110
// Define the getter.
106111
auto *getterDecl = addGetterToReadOnlyDerivedProperty(propDecl, returnTy);
107112

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// RUN: %target-swift-frontend -disable-availability-checking %s -emit-sil -o /dev/null -verify -strict-concurrency=complete
2+
// RUN: %target-swift-frontend -disable-availability-checking %s -emit-sil -o /dev/null -verify -strict-concurrency=complete -enable-upcoming-feature RegionBasedIsolation
3+
4+
// REQUIRES: executable_test
5+
// REQUIRES: concurrency
6+
7+
import StdlibUnittest
8+
9+
var CaseIterableTests = TestSuite("CaseIterableTests")
10+
11+
CaseIterableTests.test("MainActor Isolated Enums") {
12+
@MainActor
13+
enum EnumMainActor: CaseIterable {
14+
case a, b
15+
}
16+
17+
expectEqual(EnumMainActor.allCases.count, 2)
18+
expectEqual(EnumMainActor.allCases, [.a, .b])
19+
}
20+
21+
runAllTests()
22+

test/SILGen/synthesized_conformance_enum.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ extension Enum: Codable where T: Codable {}
5656

5757
extension NoValues: CaseIterable {}
5858
// CHECK-LABEL: // static NoValues.allCases.getter
59+
// CHECK-NEXT: // Isolation: nonisolated
5960
// CHECK-NEXT: sil hidden [ossa] @$s28synthesized_conformance_enum8NoValuesO8allCasesSayACGvgZ : $@convention(method) (@thin NoValues.Type) -> @owned Array<NoValues> {
6061

6162
extension NoValues: Codable {}

test/stdlib/CaseIterableTests.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// RUN: %target-run-simple-swift %t
22
// REQUIRES: executable_test
3+
// REQUIRES: concurrency
34

45
import StdlibUnittest
56

@@ -16,4 +17,14 @@ CaseIterableTests.test("Simple Enums") {
1617
expectEqual(SimpleEnum.allCases, [.bar, .baz, .quux])
1718
}
1819

20+
CaseIterableTests.test("MainActor Isolated Enums") {
21+
@MainActor
22+
enum EnumMainActor: CaseIterable {
23+
case a, b
24+
}
25+
26+
expectEqual(EnumMainActor.allCases.count, 2)
27+
expectEqual(EnumMainActor.allCases, [.a, .b])
28+
}
29+
1930
runAllTests()

0 commit comments

Comments
 (0)