Skip to content

Commit b1c62e5

Browse files
committed
typechecker regression test for actor key paths
1 parent 7530105 commit b1c62e5

File tree

1 file changed

+90
-0
lines changed

1 file changed

+90
-0
lines changed
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
// RUN: %target-typecheck-verify-swift -enable-experimental-concurrency
2+
// REQUIRES: concurrency
3+
4+
class Box {
5+
let size : Int = 0
6+
}
7+
8+
actor Door {
9+
let immutable : Int = 0
10+
let letBox : Box? = nil
11+
let letDict : [Int : Box] = [:]
12+
let immutableNeighbor : Door? = nil
13+
14+
15+
var mutableNeighbor : Door? = nil
16+
var varDict : [Int : Box] = [:]
17+
var mutable : Int = 0
18+
var varBox : Box = Box()
19+
var getOnlyInt : Int {
20+
get { 0 }
21+
}
22+
23+
@actorIndependent(unsafe) var unsafeIndependent : Int = 0
24+
25+
@MainActor var globActor_mutable : Int = 0
26+
@MainActor let globActor_immutable : Int = 0
27+
28+
@MainActor(unsafe) var unsafeGlobActor_mutable : Int = 0
29+
@MainActor(unsafe) let unsafeGlobActor_immutable : Int = 0
30+
31+
subscript(byIndex: Int) -> Int { 0 }
32+
33+
@MainActor subscript(byName: String) -> Int { 0 }
34+
35+
@actorIndependent subscript(byIEEE754: Double) -> Int { 0 }
36+
}
37+
38+
func attemptAccess<T, V>(_ t : T, _ f : (T) -> V) -> V {
39+
return f(t)
40+
}
41+
42+
func tryKeyPathsMisc(d : Door) {
43+
// as a func
44+
_ = attemptAccess(d, \Door.mutable) // expected-error {{cannot form key path to actor-isolated property 'mutable'}}
45+
_ = attemptAccess(d, \Door.immutable)
46+
_ = attemptAccess(d, \Door.immutableNeighbor?.immutableNeighbor)
47+
48+
// in combination with other key paths
49+
50+
_ = (\Door.letBox).appending(path: // expected-warning {{cannot form key path that accesses non-concurrent-value type 'Box?'}}
51+
\Box?.?.size)
52+
53+
_ = (\Door.varBox).appending(path: // expected-error {{cannot form key path to actor-isolated property 'varBox'}}
54+
\Box.size)
55+
56+
}
57+
58+
func tryKeyPathsFromAsync() async {
59+
_ = \Door.unsafeGlobActor_immutable
60+
_ = \Door.unsafeGlobActor_mutable // expected-error{{cannot form key path to actor-isolated property 'unsafeGlobActor_mutable'}}
61+
}
62+
63+
func tryNonConcurrentValue() {
64+
_ = \Door.letDict[0] // expected-warning {{cannot form key path that accesses non-concurrent-value type '[Int : Box]'}}
65+
_ = \Door.varDict[0] // expected-error {{cannot form key path to actor-isolated property 'varDict'}}
66+
_ = \Door.letBox!.size // expected-warning {{cannot form key path that accesses non-concurrent-value type 'Box?'}}
67+
}
68+
69+
func tryKeypaths() {
70+
_ = \Door.unsafeGlobActor_immutable
71+
_ = \Door.unsafeGlobActor_mutable
72+
73+
_ = \Door.immutable
74+
_ = \Door.unsafeIndependent
75+
_ = \Door.globActor_immutable
76+
_ = \Door.[4.2]
77+
_ = \Door.immutableNeighbor?.immutableNeighbor?.immutableNeighbor
78+
79+
_ = \Door.varBox // expected-error{{cannot form key path to actor-isolated property 'varBox'}}
80+
_ = \Door.mutable // expected-error{{cannot form key path to actor-isolated property 'mutable'}}
81+
_ = \Door.getOnlyInt // expected-error{{cannot form key path to actor-isolated property 'getOnlyInt'}}
82+
_ = \Door.mutableNeighbor?.mutableNeighbor?.mutableNeighbor // expected-error 3 {{cannot form key path to actor-isolated property 'mutableNeighbor'}}
83+
84+
let _ : PartialKeyPath<Door> = \.mutable // expected-error{{cannot form key path to actor-isolated property 'mutable'}}
85+
let _ : AnyKeyPath = \Door.mutable // expected-error{{cannot form key path to actor-isolated property 'mutable'}}
86+
87+
_ = \Door.globActor_mutable // expected-error{{cannot form key path to actor-isolated property 'globActor_mutable'}}
88+
_ = \Door.[0] // expected-error{{cannot form key path to actor-isolated subscript 'subscript(_:)'}}
89+
_ = \Door.["hello"] // expected-error{{cannot form key path to actor-isolated subscript 'subscript(_:)'}}
90+
}

0 commit comments

Comments
 (0)