// RUN: %target-typecheck-verify-swift func makeIncrementor(amount: Int) -> () -> Int { func incrementor() -> Int { currentTotal += amount // expected-error{{cannot capture 'currentTotal' before it is declared}} return currentTotal // note: redundant diagnostic suppressed } var currentTotal = 0 // expected-note{{'currentTotal' declared here}} currentTotal = 1; _ = currentTotal return incrementor } func pingpong() { func ping() -> Int { return pong() } func pong() -> Int { return ping() } _ = ping() } func transitiveForwardCapture() { func ping() -> Int { return pong() // expected-error{{cannot capture 'pong', which would use 'x' before it is declared}} } _ = ping() var x = 1 // expected-note{{'x' declared here}} func pong() -> Int { // expected-note{{'pong', declared here, captures 'x'}} x += 1 return ping() } } func transitiveForwardCapture2() { func ping() -> Int { _ = pong() // expected-error{{cannot capture 'pong', which would use 'x' before it is declared}} } _ = ping() var x = 1 // expected-note{{'x' declared here}} func pong() -> Int { // expected-note{{'pong', declared here, captures 'pung'}} _ = pung() } func pung() -> Int { // expected-note{{'pung', declared here, captures 'x'}} x += 1 return ping() } } func transitiveForwardCapture3() { var y = 2 func ping() -> Int { _ = pong() // expected-error{{cannot capture 'pong', which would use 'x' before it is declared}} } _ = ping() var x = 1 // expected-note{{'x' declared here}} func pung() -> Int { // expected-note{{'pung', declared here, captures 'x'}} x += 1 return ping() } func pong() -> Int { // expected-note{{'pong', declared here, captures 'pung'}} y += 2 _ = pung() } } func outOfOrderEnum() { func f() -> Suit { return .Club } enum Suit { case Club case Diamond case Heart case Spade } } func captureInClosure() { let x = { (i: Int) in currentTotal += i // expected-error{{cannot capture 'currentTotal' before it is declared}} } var currentTotal = 0 // expected-note{{'currentTotal' declared here}} _ = x currentTotal += 1 } class X { func foo() { } } func captureLists(x: X) { { [unowned x] in x.foo() }(); let _: Void = { [unowned x] in x.foo() }() let _: Void = { [weak x] in x?.foo() }() }