Skip to content

Commit dad3ace

Browse files
committed
[test] Add some extra variants in capture_order.swift
The existing tests we have here I'm hoping to reject in Sema, add equivalent variants that use local functions which will continue to be caught in SILGen.
1 parent 8c1e0c8 commit dad3ace

File tree

1 file changed

+129
-8
lines changed

1 file changed

+129
-8
lines changed

test/SILGen/capture_order.swift

Lines changed: 129 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -224,14 +224,6 @@ func forward_declared_let_captures() {
224224
// expected-note@-3 {{captured value declared here}}
225225
}
226226

227-
do {
228-
func bad_local_f() -> Any { bad }
229-
// expected-error@-1 {{closure captures 'bad' before it is declared}}
230-
// expected-note@-2 {{captured here}}
231-
let bad = bad_local_f()
232-
// expected-note@-1 {{captured value declared here}}
233-
}
234-
235227
do {
236228
let bad = global_fwd { bad }
237229
// expected-error@-1 {{closure captures 'bad' before it is declared}}
@@ -320,6 +312,135 @@ func forward_declared_let_captures() {
320312
}
321313
}
322314

315+
func forward_declared_let_captures_local_fn() {
316+
do {
317+
func bad_local_f() -> Any { bad }
318+
// expected-error@-1 {{closure captures 'bad' before it is declared}}
319+
// expected-note@-2 {{captured here}}
320+
let bad = bad_local_f()
321+
// expected-note@-1 {{captured value declared here}}
322+
}
323+
324+
do {
325+
func fwd(_ i: () -> Any) -> Any { i() }
326+
func badFn() -> Any {
327+
// expected-error@-1 {{closure captures 'bad' before it is declared}}
328+
fwd { bad }
329+
// expected-note@-1 {{captured here}}
330+
}
331+
let bad = badFn()
332+
// expected-note@-1 {{captured value declared here}}
333+
}
334+
335+
do {
336+
func badFn() -> Any {
337+
// expected-error@-1 {{closure captures 'bad' before it is declared}}
338+
global_gen_fwd { bad }
339+
// expected-note@-1 {{captured here}}
340+
}
341+
let bad = badFn()
342+
// expected-note@-1 {{captured value declared here}}
343+
}
344+
345+
do {
346+
func badFn() -> Any {
347+
// expected-error@-1 {{closure captures 'bad' before it is declared}}
348+
E.static_gen_fwd { bad }
349+
// expected-note@-1 {{captured here}}
350+
}
351+
let bad = badFn()
352+
// expected-note@-1 {{captured value declared here}}
353+
}
354+
355+
do {
356+
func badFn() -> Any {
357+
// expected-error@-1 {{closure captures 'badNested' before it is declared}}
358+
global_fwd { { [badNested] in badNested }() }
359+
// expected-note@-1 {{captured here}}
360+
}
361+
let badNested = badFn()
362+
// expected-note@-1 {{captured value declared here}}
363+
}
364+
365+
do {
366+
func badFn() -> Any? {
367+
// expected-error@-1 {{closure captures 'badOpt' before it is declared}}
368+
{ () -> Any? in badOpt }()
369+
// expected-note@-1 {{captured here}}
370+
}
371+
let badOpt = badFn()
372+
// expected-note@-1 {{captured value declared here}}
373+
}
374+
375+
do {
376+
func badFn() -> (Any, Any) {
377+
// expected-error@-1 {{closure captures 'badTup' before it is declared}}
378+
{ (badTup.0, badTup.1) }()
379+
// expected-note@-1 {{captured here}}
380+
}
381+
let badTup = badFn()
382+
// expected-note@-1 {{captured value declared here}}
383+
}
384+
385+
do {
386+
func badFn() -> (Int, Any) {
387+
// expected-error@-1 {{closure captures 'badTup' before it is declared}}
388+
{ (badTup.0, badTup.1) }()
389+
// expected-note@-1 {{captured here}}
390+
}
391+
let badTup = badFn()
392+
// expected-note@-1 {{captured value declared here}}
393+
}
394+
395+
do {
396+
func badFn() -> (Any, Any) {
397+
// expected-error@-1 {{closure captures 'badTup3' before it is declared}}
398+
// expected-error@-2 {{closure captures 'badTup4' before it is declared}}
399+
{ (badTup4, badTup3) }()
400+
// expected-note@-1 2{{captured here}}
401+
}
402+
let (badTup3, badTup4) = badFn()
403+
// expected-note@-1 2{{captured value declared here}}
404+
}
405+
406+
do {
407+
struct S { var p: Any }
408+
func badFn() -> S {
409+
// expected-error@-1 {{closure captures 'badStruct' before it is declared}}
410+
{ S(p: badStruct.p) }()
411+
// expected-note@-1 {{captured here}}
412+
}
413+
let badStruct = badFn()
414+
// expected-note@-1 {{captured value declared here}}
415+
}
416+
417+
do {
418+
enum EE {
419+
case boring
420+
case weird(Any)
421+
case strange(Any)
422+
}
423+
424+
func badFn() -> EE {
425+
// expected-error@-1 {{closure captures 'badEnum' before it is declared}}
426+
{ .weird(EE.strange(badEnum)) }()
427+
// expected-note@-1 {{captured here}}
428+
}
429+
let badEnum = badFn()
430+
// expected-note@-1 {{captured value declared here}}
431+
}
432+
433+
do {
434+
func badFn() -> any P {
435+
// expected-error@-1 {{closure captures 'badproto' before it is declared}}
436+
global_fwd_p { badproto }
437+
// expected-note@-1 {{captured here}}
438+
}
439+
let badproto = badFn()
440+
// expected-note@-1 {{captured value declared here}}
441+
}
442+
}
443+
323444
// FIXME: should/could these be diagnosed instead of accepted?
324445
func forward_declared_local_lazy_captures() {
325446
// runtime stack overflow, maybe UB?

0 commit comments

Comments
 (0)