99// REQUIRES: concurrency_runtime
1010// UNSUPPORTED: back_deployment_runtime
1111
12- // REQUIRES: gh76538
13-
1412import Swift
1513import _Concurrency
1614import Dispatch
@@ -128,6 +126,14 @@ class ClassNoOp: Probe {
128126
129127let tests = TestSuite ( " Isolated Deinit " )
130128
129+ // Dummy global variable to suppress stack propagation
130+ // TODO: Remove it after disabling allocation on stack for classes with isolated deinit
131+ var x : AnyObject ? = nil
132+ func preventAllocationOnStack( _ object: AnyObject ) {
133+ x = object
134+ x = nil
135+ }
136+
131137if #available( SwiftStdlib 5 . 1 , * ) {
132138 tests. test ( " class sync fast path " ) {
133139 let group = DispatchGroup ( )
@@ -136,7 +142,7 @@ if #available(SwiftStdlib 5.1, *) {
136142 // FIXME: isolated deinit should be clearing task locals
137143 await TL . $number. withValue ( 42 ) {
138144 await AnotherActor . shared. performTesting {
139- _ = ClassNoOp ( expectedNumber: 42 , group: group)
145+ preventAllocationOnStack ( ClassNoOp ( expectedNumber: 42 , group: group) )
140146 }
141147 }
142148 }
@@ -148,7 +154,7 @@ if #available(SwiftStdlib 5.1, *) {
148154 group. enter ( 1 )
149155 Task {
150156 TL . $number. withValue ( 99 ) {
151- _ = ClassNoOp ( expectedNumber: 0 , group: group)
157+ preventAllocationOnStack ( ClassNoOp ( expectedNumber: 0 , group: group) )
152158 }
153159 }
154160 group. wait ( )
@@ -162,7 +168,7 @@ if #available(SwiftStdlib 5.1, *) {
162168 TL . $number. withValue ( 99 ) {
163169 // Despite last release happening not on the actor itself,
164170 // this is still a fast path due to optimisation for deallocating actors.
165- _ = ActorNoOp ( expectedNumber: 99 , group: group)
171+ preventAllocationOnStack ( ActorNoOp ( expectedNumber: 99 , group: group) )
166172 }
167173 }
168174 group. wait ( )
@@ -174,7 +180,7 @@ if #available(SwiftStdlib 5.1, *) {
174180 Task {
175181 TL . $number. withValue ( 99 ) {
176182 // Using ProxyActor breaks optimization
177- _ = ProxyActor ( expectedNumber: 0 , group: group)
183+ preventAllocationOnStack ( ProxyActor ( expectedNumber: 0 , group: group) )
178184 }
179185 }
180186 group. wait ( )
@@ -184,8 +190,8 @@ if #available(SwiftStdlib 5.1, *) {
184190 let group = DispatchGroup ( )
185191 group. enter ( 2 )
186192 Task {
187- _ = ActorNoOp ( expectedNumber: 0 , group: group)
188- _ = ClassNoOp ( expectedNumber: 0 , group: group)
193+ preventAllocationOnStack ( ActorNoOp ( expectedNumber: 0 , group: group) )
194+ preventAllocationOnStack ( ClassNoOp ( expectedNumber: 0 , group: group) )
189195 }
190196 group. wait ( )
191197 }
0 commit comments