@@ -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?
324445func forward_declared_local_lazy_captures( ) {
325446 // runtime stack overflow, maybe UB?
0 commit comments