55
66import StdlibUnittest
77
8- var types = TestSuite ( " VariadicGenericCaptures " )
8+ var captures = TestSuite ( " VariadicGenericCaptures " )
99
1010func hasMetadataPack< each T > ( _: repeat each T ) -> ( ) -> Any . Type {
1111 return { return ( repeat each T) . self }
1212}
1313
14- types . test ( " Metadata " ) {
14+ captures . test ( " Metadata " ) {
1515 expectEqual ( Void . self, hasMetadataPack ( ) ( ) )
1616 expectEqual ( ( Int, String, Bool) . self, hasMetadataPack ( 1 , " hi " , false ) ( ) )
1717}
@@ -20,7 +20,7 @@ func hasWitnessTablePack<each T: Sequence>(_: repeat each T) -> () -> Any.Type {
2020 return { return ( repeat ( each T) . Element) . self }
2121}
2222
23- types . test ( " WitnessTable " ) {
23+ captures . test ( " WitnessTable " ) {
2424 expectEqual ( Void . self, hasWitnessTablePack ( ) ( ) )
2525 expectEqual ( ( Int, String, Bool) . self, hasWitnessTablePack ( [ 1 ] , [ " hi " ] , [ false ] ) ( ) )
2626}
@@ -29,7 +29,7 @@ func hasWitnessTablePack2<each T: Sequence>(_: repeat each T) -> () -> Any.Type
2929 return { return ( repeat ( each T) . Element. Element) . self }
3030}
3131
32- types . test ( " WitnessTable2 " ) {
32+ captures . test ( " WitnessTable2 " ) {
3333 expectEqual ( Void . self, hasWitnessTablePack2 ( ) ( ) )
3434 expectEqual ( ( Int, String, Bool) . self, hasWitnessTablePack2 ( [ [ 1 ] ] , [ [ " hi " ] ] , [ [ false ] ] ) ( ) )
3535}
@@ -43,7 +43,7 @@ func lifetimeTest2() -> () -> Any.Type {
4343 return hasMetadataPack ( 3 , 1.0 )
4444}
4545
46- types . test ( " Lifetime " ) {
46+ captures . test ( " Lifetime " ) {
4747 let fn1 = lifetimeTest1 ( )
4848 let fn2 = lifetimeTest2 ( )
4949 expectEqual ( ( String, Set < Int > ) . self, fn1 ( ) )
@@ -71,7 +71,7 @@ func testNonEscapingCapture<each T: Hashable>(_ t: repeat each T) -> [AnyHashabl
7171 }
7272}
7373
74- types . test ( " CapturedValue " ) {
74+ captures . test ( " CapturedValue " ) {
7575 let fn1 = testEscapingCapture ( 1 , " hi " )
7676 let fn2 = testEscapingCapture ( 5.0 , false )
7777
@@ -82,4 +82,39 @@ types.test("CapturedValue") {
8282 expectEqual ( [ true , 7 ] , testNonEscapingCapture ( true , 7 ) )
8383}
8484
85+ captures. test ( " Leaks " ) {
86+ func callee< T> ( _: T ) { }
87+
88+ func takesEscapingClosure( _ fn: @escaping ( ) -> ( ) ) {
89+ fn ( )
90+ fn ( )
91+ fn ( )
92+ }
93+
94+ func takesNonEscapingClosure( _ fn: ( ) -> ( ) ) {
95+ fn ( )
96+ fn ( )
97+ fn ( )
98+ }
99+
100+ func formPackCaptures< each V > ( _ v: repeat each V ) {
101+ takesEscapingClosure { repeat callee( each v) }
102+ takesNonEscapingClosure { repeat callee( each v) }
103+ { repeat callee( each v) } ( )
104+ }
105+
106+ struct S {
107+ init < each V > ( _ v: repeat each V ) {
108+ takesEscapingClosure { repeat callee( each v) }
109+ takesNonEscapingClosure { repeat callee( each v) }
110+ { repeat callee( each v) } ( )
111+ }
112+ }
113+
114+ for _ in 0 ..< 10 {
115+ formPackCaptures ( LifetimeTracked ( 0 ) , LifetimeTracked ( 0 ) , LifetimeTracked ( 0 ) )
116+ callee ( S ( LifetimeTracked ( 1 ) , LifetimeTracked ( 1 ) , LifetimeTracked ( 1 ) ) )
117+ }
118+ }
119+
85120runAllTests ( )
0 commit comments