| // RUN: %target-swift-frontend -module-name main -typecheck -verify -swift-version 3 %s |
| // RUN: %target-swift-frontend -module-name main -typecheck -verify -swift-version 4 %s |
| |
| // Some convenient test points to escape closures to |
| var x: (Int) -> Int = { $0 } |
| var y: (inout Int, Int) -> Void = { $0 = $1 } |
| var z: (Int, Int, Int) throws -> Int = { $2 } |
| |
| func escapeX(_ xx: (Int) -> Int, _ value: Int) { // expected-note* {{non-escaping}} |
| x = xx // expected-error{{non-escaping parameter}} |
| withoutActuallyEscaping(xx) { escapableXX in |
| x = xx // expected-error{{non-escaping parameter}} |
| x = escapableXX |
| x = xx // expected-error{{non-escaping parameter}} |
| |
| _ = x(value) |
| _ = xx(value) |
| _ = escapableXX(value) |
| } |
| withoutActuallyEscaping(xx, do: { escapableXX in |
| x = escapableXX |
| }) |
| Swift.withoutActuallyEscaping(xx) { escapableXX in |
| x = escapableXX |
| } |
| Swift.withoutActuallyEscaping(xx, do: { escapableXX in |
| x = escapableXX |
| }) |
| x = xx // expected-error{{non-escaping parameter}} |
| } |
| |
| func escapeY(_ yy: (inout Int, Int) -> Void, _ value: inout Int) { // expected-note{{non-escaping}} |
| y = yy // expected-error{{non-escaping parameter}} |
| withoutActuallyEscaping(yy) { escapableYY in |
| y = escapableYY |
| |
| y(&value, value) |
| yy(&value, value) |
| escapableYY(&value, value) |
| } |
| } |
| |
| func escapeZ(_ zz: (Int, Int, Int) throws -> Int) { // expected-note{{non-escaping}} |
| z = zz // expected-error{{non-escaping parameter}} |
| withoutActuallyEscaping(zz) { escapableZZ in |
| z = escapableZZ |
| } |
| } |
| |
| func returnThroughWAE(_ xx: (Int) -> Int, _ value: Int) -> Int { |
| return withoutActuallyEscaping(xx) { escapableXX in |
| x = escapableXX |
| return x(value) |
| } |
| } |
| |
| func rethrowThroughWAE(_ zz: (Int, Int, Int) throws -> Int, _ value: Int) throws { |
| try withoutActuallyEscaping(zz) { escapableZZ in |
| _ = try zz(value, value, value) |
| _ = try escapableZZ(value, value, value) |
| } |
| } |
| |
| let _: ((Int) -> Int, (@escaping (Int) -> Int) -> ()) -> () |
| = withoutActuallyEscaping(_:do:) // expected-error{{}} |
| |