@@ -252,35 +252,52 @@ return (copy ref_result)[2]
252
252
253
253
/// MARK: closures
254
254
255
- // FIXME: (1) Closure capture lists need to support the short-hand [copy t] and produce explicit copies.
256
- // We also need a better error message for when this is missed for closure captures.
257
- // (2) Escaping closures need to be recursively checked by the PerformanceDiagnostics.
258
- // We might just need to widen the propagation of [manual_ownership]?
259
- // (3) Autoclosures have no ability to annotate captures. Is that OK?
260
-
261
255
@_manualOwnership
262
256
func closure_basic( _ t: Triangle ) -> ( ) -> Triangle {
263
- return { return t } // expected-error {{ownership of 't' is demanded by a closure}}
257
+ return { // expected-error {{ownership of 't' is demanded by a closure}}
258
+ return t // expected-error {{ownership of 't' is demanded and cannot not be consumed}}
259
+ }
260
+ }
261
+ @_manualOwnership
262
+ func closure_basic_almost_fixed_1( _ t: Triangle ) -> ( ) -> Triangle {
263
+ // FIXME: Closure capture lists need to support the short-hand [copy t] that makes the
264
+ // closure capture parameter @owned, rather than @guaranteed. Only can work for Copyable types!
265
+ return { [ x = copy t] in
266
+ return x // expected-error {{ownership of 'x' is demanded and cannot not be consumed}}
267
+ }
264
268
}
269
+
270
+ @_manualOwnership
271
+ func closure_basic_almost_fixed_2( _ t: Triangle ) -> ( ) -> Triangle {
272
+ return { // expected-error {{ownership of 't' is demanded by a closure}}
273
+ return copy t
274
+ }
275
+ }
276
+
265
277
@_manualOwnership
266
278
func closure_basic_fixed( _ t: Triangle ) -> ( ) -> Triangle {
267
- return { [ t = copy t] in return t }
279
+ return { [ x = copy t] in
280
+ return copy x
281
+ }
268
282
}
269
283
270
284
@_manualOwnership
271
285
func closure_copies_in_body( _ t: Triangle ) -> ( ) -> Triangle {
272
- return { [ t = copy t] in
273
- eat ( t) // FIXME: missing required copies
274
- eat ( t)
275
- return t }
286
+ return { [ x = copy t] in
287
+ eat ( x) // expected-error {{ownership of 'x' is demanded and cannot not be consumed}}
288
+ use ( x)
289
+ eat ( x) // expected-error {{ownership of 'x' is demanded and cannot not be consumed}}
290
+ return x // expected-error {{ownership of 'x' is demanded and cannot not be consumed}}
291
+ }
276
292
}
277
293
278
294
@_manualOwnership
279
295
func closure_copies_in_body_noescape( _ t: Triangle ) -> Triangle {
280
- let f = { [ t = copy t] in
281
- eat ( t) // FIXME: missing required copies
282
- eat ( t)
283
- return t
296
+ let f = { [ x = copy t] in
297
+ eat ( x) // expected-error {{ownership of 'x' is demanded and cannot not be consumed}}
298
+ use ( x)
299
+ eat ( x) // expected-error {{ownership of 'x' is demanded and cannot not be consumed}}
300
+ return x // expected-error {{ownership of 'x' is demanded and cannot not be consumed}}
284
301
}
285
302
return f ( )
286
303
}
@@ -296,7 +313,32 @@ func try_to_assert(_ n: Int, _ names: [String]) {
296
313
297
314
@_manualOwnership
298
315
func copy_in_autoclosure( _ t: Triangle ) {
299
- simple_assert ( consumingFunc ( t) ) // FIXME: missing required copies
316
+ simple_assert ( consumingFunc ( t) ) // expected-error {{ownership of 't' is demanded and cannot not be consumed}}
317
+ }
318
+ @_manualOwnership
319
+ func copy_in_autoclosure_fixed( _ t: Triangle ) {
320
+ simple_assert ( consumingFunc ( copy t) )
321
+ }
322
+
323
+ @_manualOwnership
324
+ func nested_closures( _ t: Triangle ) -> ( ) -> ( ( ) -> Triangle ) {
325
+ return { // expected-error {{ownership of 't' is demanded by a closure}}
326
+ { eat ( t) } ( ) // expected-error {{ownership of 't' is demanded and cannot not be consumed}}
327
+ return { // expected-error {{ownership of 't' is demanded by a closure}}
328
+ simple_assert ( consumingFunc ( t) ) // expected-error {{ownership of 't' is demanded and cannot not be consumed}}
329
+ return t // expected-error {{ownership of 't' is demanded and cannot not be consumed}}
330
+ }
331
+ }
332
+ }
333
+ @_manualOwnership
334
+ func nested_closures_fixed( _ t: Triangle ) -> ( ) -> ( ( ) -> Triangle ) {
335
+ return { [ a = copy t] in
336
+ { eat ( copy a) } ( )
337
+ return { [ b = copy a] in
338
+ simple_assert ( consumingFunc ( copy b) )
339
+ return copy b
340
+ }
341
+ }
300
342
}
301
343
302
344
/// MARK: generics
0 commit comments