8
8
// UNSUPPORTED: use_os_stdlib
9
9
// UNSUPPORTED: back_deployment_runtime
10
10
11
- class StringLike : CustomStringConvertible {
11
+ final class StringLike : Sendable , CustomStringConvertible {
12
12
let value : String
13
13
init ( _ value: String ) {
14
14
self . value = value
@@ -20,21 +20,21 @@ class StringLike: CustomStringConvertible {
20
20
@available ( macOS 9999 , iOS 9999 , watchOS 9999 , tvOS 9999 , * )
21
21
enum TL {
22
22
23
- @TaskLocal
24
- static var string : String = " <undefined> "
23
+ @TaskLocal ( default : " <undefined> " )
24
+ static var string
25
25
26
- @TaskLocal
27
- static var number : Int = 0
26
+ @TaskLocal ( default : 0 )
27
+ static var number
28
28
29
- @TaskLocal
30
- static var never : StringLike = . init ( " <never> " )
29
+ @TaskLocal ( default : StringLike ( " <never> " ) )
30
+ static var never
31
31
32
- @TaskLocal
33
- static var clazz : ClassTaskLocal ? = nil
32
+ @TaskLocal ( )
33
+ static var clazz : TaskLocal < ClassTaskLocal ? > . Access
34
34
}
35
35
36
36
@available ( macOS 9999 , iOS 9999 , watchOS 9999 , tvOS 9999 , * )
37
- final class ClassTaskLocal {
37
+ final class ClassTaskLocal : Sendable {
38
38
init ( ) {
39
39
print ( " clazz init \( ObjectIdentifier ( self ) ) " )
40
40
}
@@ -46,15 +46,15 @@ final class ClassTaskLocal {
46
46
47
47
@available ( macOS 9999 , iOS 9999 , watchOS 9999 , tvOS 9999 , * )
48
48
@discardableResult
49
- func printTaskLocal< V, Key > (
50
- _ key: Key ,
49
+ func printTaskLocal< V> (
50
+ _ key: TaskLocal < V > . Access ,
51
51
_ expected: V ? = nil ,
52
52
file: String = #file, line: UInt = #line
53
- ) -> V ? where Key : TaskLocal < V > {
54
- let value = key
55
- print ( " \( value) at \( file) : \( line) " )
53
+ ) -> V ? {
54
+ let value = key. get ( )
55
+ print ( " \( key ) ( \( value) ) at \( file) : \( line) " )
56
56
if let expected = expected {
57
- assert ( " \( expected) " == " \( value. wrappedValue ) " ,
57
+ assert ( " \( expected) " == " \( value) " ,
58
58
" Expected [ \( expected) ] but found: \( value) , at \( file) : \( line) " )
59
59
}
60
60
return expected
@@ -64,20 +64,20 @@ func printTaskLocal<V, Key>(
64
64
65
65
@available ( macOS 9999 , iOS 9999 , watchOS 9999 , tvOS 9999 , * )
66
66
func simple( ) async {
67
- printTaskLocal ( TL . $ number) // CHECK: TaskLocal<Int>(0)
68
- await TL . $ number. withValue ( 1 ) {
69
- printTaskLocal ( TL . $ number) // CHECK-NEXT: TaskLocal<Int>(1)
67
+ printTaskLocal ( TL . number) // CHECK: TaskLocal<Int>.Access (0)
68
+ await TL . number. withValue ( 1 ) {
69
+ printTaskLocal ( TL . number) // CHECK-NEXT: TaskLocal<Int>.Access (1)
70
70
}
71
71
}
72
72
73
73
@available ( macOS 9999 , iOS 9999 , watchOS 9999 , tvOS 9999 , * )
74
74
func simple_deinit( ) async {
75
- await TL . $ clazz. withValue ( ClassTaskLocal ( ) ) {
75
+ await TL . clazz. withValue ( ClassTaskLocal ( ) ) {
76
76
// CHECK: clazz init [[C:.*]]
77
- printTaskLocal ( TL . $ clazz) // CHECK: TaskLocal<Optional<ClassTaskLocal>>(Optional(main.ClassTaskLocal))
77
+ printTaskLocal ( TL . clazz) // CHECK: TaskLocal<Optional<ClassTaskLocal>>.Access (Optional(main.ClassTaskLocal))
78
78
}
79
79
// CHECK: clazz deinit [[C]]
80
- printTaskLocal ( TL . $ clazz) // CHECK: TaskLocal<Optional<ClassTaskLocal>>(nil)
80
+ printTaskLocal ( TL . clazz) // CHECK: TaskLocal<Optional<ClassTaskLocal>>.Access (nil)
81
81
}
82
82
83
83
struct Boom : Error {
@@ -86,7 +86,7 @@ struct Boom: Error {
86
86
@available ( macOS 9999 , iOS 9999 , watchOS 9999 , tvOS 9999 , * )
87
87
func simple_throw( ) async {
88
88
do {
89
- try await TL . $ clazz. withValue ( ClassTaskLocal ( ) ) {
89
+ try await TL . clazz. withValue ( ClassTaskLocal ( ) ) {
90
90
throw Boom ( value: " oh no! " )
91
91
}
92
92
} catch {
@@ -97,59 +97,59 @@ func simple_throw() async {
97
97
98
98
@available ( macOS 9999 , iOS 9999 , watchOS 9999 , tvOS 9999 , * )
99
99
func nested( ) async {
100
- printTaskLocal ( TL . $ string) // CHECK: TaskLocal<String>(<undefined>)
101
- await TL . $ string. withValue ( " hello " ) {
102
- printTaskLocal ( TL . $ number) // CHECK-NEXT: TaskLocal<Int>(0)
103
- printTaskLocal ( TL . $ string) // CHECK-NEXT: TaskLocal<String>(hello)
104
- await TL . $ number. withValue ( 2 ) {
105
- printTaskLocal ( TL . $ number) // CHECK-NEXT: TaskLocal<Int>(2)
106
- printTaskLocal ( TL . $ string, " hello " ) // CHECK: TaskLocal<String>(hello)
100
+ printTaskLocal ( TL . string) // CHECK: TaskLocal<String>.Access (<undefined>)
101
+ await TL . string. withValue ( " hello " ) {
102
+ printTaskLocal ( TL . number) // CHECK-NEXT: TaskLocal<Int>.Access (0)
103
+ printTaskLocal ( TL . string) // CHECK-NEXT: TaskLocal<String>.Access (hello)
104
+ await TL . number. withValue ( 2 ) {
105
+ printTaskLocal ( TL . number) // CHECK-NEXT: TaskLocal<Int>.Access (2)
106
+ printTaskLocal ( TL . string, " hello " ) // CHECK: TaskLocal<String>.Access (hello)
107
107
}
108
- printTaskLocal ( TL . $ number) // CHECK-NEXT: TaskLocal<Int>(0)
109
- printTaskLocal ( TL . $ string) // CHECK-NEXT: TaskLocal<String>(hello)
108
+ printTaskLocal ( TL . number) // CHECK-NEXT: TaskLocal<Int>.Access (0)
109
+ printTaskLocal ( TL . string) // CHECK-NEXT: TaskLocal<String>.Access (hello)
110
110
}
111
- printTaskLocal ( TL . $ number) // CHECK-NEXT: TaskLocal<Int>(0)
112
- printTaskLocal ( TL . $ string) // CHECK-NEXT: TaskLocal<String>(<undefined>)
111
+ printTaskLocal ( TL . number) // CHECK-NEXT: TaskLocal<Int>.Access (0)
112
+ printTaskLocal ( TL . string) // CHECK-NEXT: TaskLocal<String>.Access (<undefined>)
113
113
}
114
114
115
115
@available ( macOS 9999 , iOS 9999 , watchOS 9999 , tvOS 9999 , * )
116
116
func nested_allContribute( ) async {
117
- printTaskLocal ( TL . $ string) // CHECK: TaskLocal<String>(<undefined>)
118
- await TL . $ string. withValue ( " one " ) {
119
- printTaskLocal ( TL . $ string, " one " ) // CHECK-NEXT: TaskLocal<String>(one)
120
- await TL . $ string. withValue ( " two " ) {
121
- printTaskLocal ( TL . $ string, " two " ) // CHECK-NEXT: TaskLocal<String>(two)
122
- await TL . $ string. withValue ( " three " ) {
123
- printTaskLocal ( TL . $ string, " three " ) // CHECK-NEXT: TaskLocal<String>(three)
117
+ printTaskLocal ( TL . string) // CHECK: TaskLocal<String>.Access (<undefined>)
118
+ await TL . string. withValue ( " one " ) {
119
+ printTaskLocal ( TL . string, " one " ) // CHECK-NEXT: TaskLocal<String>.Access (one)
120
+ await TL . string. withValue ( " two " ) {
121
+ printTaskLocal ( TL . string, " two " ) // CHECK-NEXT: TaskLocal<String>.Access (two)
122
+ await TL . string. withValue ( " three " ) {
123
+ printTaskLocal ( TL . string, " three " ) // CHECK-NEXT: TaskLocal<String>.Access (three)
124
124
}
125
- printTaskLocal ( TL . $ string, " two " ) // CHECK-NEXT: TaskLocal<String>(two)
125
+ printTaskLocal ( TL . string, " two " ) // CHECK-NEXT: TaskLocal<String>.Access (two)
126
126
}
127
- printTaskLocal ( TL . $ string, " one " ) // CHECK-NEXT: TaskLocal<String>(one)
127
+ printTaskLocal ( TL . string, " one " ) // CHECK-NEXT: TaskLocal<String>.Access (one)
128
128
}
129
- printTaskLocal ( TL . $ string) // CHECK-NEXT: TaskLocal<String>(<undefined>)
129
+ printTaskLocal ( TL . string) // CHECK-NEXT: TaskLocal<String>.Access (<undefined>)
130
130
}
131
131
132
132
@available ( macOS 9999 , iOS 9999 , watchOS 9999 , tvOS 9999 , * )
133
133
func nested_3_onlyTopContributes( ) async {
134
- printTaskLocal ( TL . $ string) // CHECK: TaskLocal<String>(<undefined>)
135
- await TL . $ string. withValue ( " one " ) {
136
- printTaskLocal ( TL . $ string) // CHECK-NEXT: TaskLocal<String>(one)
137
- await TL . $ number. withValue ( 2 ) {
138
- printTaskLocal ( TL . $ string) // CHECK-NEXT: TaskLocal<String>(one)
139
- await TL . $ number. withValue ( 3 ) {
140
- printTaskLocal ( TL . $ string) // CHECK-NEXT: TaskLocal<String>(one)
134
+ printTaskLocal ( TL . string) // CHECK: TaskLocal<String>.Access (<undefined>)
135
+ await TL . string. withValue ( " one " ) {
136
+ printTaskLocal ( TL . string) // CHECK-NEXT: TaskLocal<String>.Access (one)
137
+ await TL . number. withValue ( 2 ) {
138
+ printTaskLocal ( TL . string) // CHECK-NEXT: TaskLocal<String>.Access (one)
139
+ await TL . number. withValue ( 3 ) {
140
+ printTaskLocal ( TL . string) // CHECK-NEXT: TaskLocal<String>.Access (one)
141
141
}
142
- printTaskLocal ( TL . $ string) // CHECK-NEXT: TaskLocal<String>(one)
142
+ printTaskLocal ( TL . string) // CHECK-NEXT: TaskLocal<String>.Access (one)
143
143
}
144
- printTaskLocal ( TL . $ string) // CHECK-NEXT: TaskLocal<String>(one)
144
+ printTaskLocal ( TL . string) // CHECK-NEXT: TaskLocal<String>.Access (one)
145
145
}
146
- printTaskLocal ( TL . $ string) // CHECK-NEXT: TaskLocal<String>(<undefined>)
146
+ printTaskLocal ( TL . string) // CHECK-NEXT: TaskLocal<String>.Access (<undefined>)
147
147
}
148
148
149
149
@available ( macOS 9999 , iOS 9999 , watchOS 9999 , tvOS 9999 , * )
150
150
func withLocal_body_mustNotEscape( ) async {
151
151
var something = " Nice "
152
- await TL . $ string. withValue ( " xxx " ) {
152
+ await TL . string. withValue ( " xxx " ) {
153
153
something = " very nice "
154
154
}
155
155
_ = something // silence not used warning
0 commit comments