| // RUN: %target-swift-frontend -emit-silgen -enable-sil-ownership -verify %s |
| // RUN: %target-swift-frontend -emit-sil -enable-sil-ownership %s | %FileCheck --check-prefix=AFTER-MANDATORY-PASSES %s |
| |
| // ensure escape analysis killed the box allocations used for delayed Self |
| // return buffers |
| // AFTER-MANDATORY-PASSES-NOT: alloc_box |
| |
| extension Error { |
| mutating func covariantReturn(_: Int) -> Self { return self } |
| mutating func covariantOptionalReturn(_: Int) -> Self? { return self } |
| mutating func covariantReturnOrThrow(_: Int) throws -> Self { return self } |
| mutating func covariantClosureArgAndReturn(_: (Self) -> Int) -> Self { return self } |
| } |
| |
| protocol MutatingWithCovariantReturn { |
| mutating func covariantReturn(_: Int) -> Self |
| mutating func covariantOptionalReturn(_: Int) -> Self? |
| mutating func covariantReturnOrThrow(_: Int) throws -> Self |
| mutating func covariantClosureArgAndReturn(_: (Self) -> Int) -> Self |
| } |
| |
| protocol ClassConstrainedRefinement: MutatingWithCovariantReturn, AnyObject {} |
| |
| func int() -> Int { return 0 } |
| func intThrows() throws -> Int { return 0 } |
| |
| func foo(x: inout MutatingWithCovariantReturn, y: inout ClassConstrainedRefinement, z: inout Error) throws { |
| _ = x.covariantReturn(int()) |
| _ = x.covariantReturn(try intThrows()) |
| _ = x.covariantReturn(try! intThrows()) |
| |
| _ = x.covariantOptionalReturn(int()) |
| _ = x.covariantOptionalReturn(try intThrows()) |
| _ = x.covariantOptionalReturn(try! intThrows()) |
| |
| _ = try x.covariantReturnOrThrow(int()) |
| _ = try x.covariantReturnOrThrow(try intThrows()) |
| _ = try x.covariantReturnOrThrow(try! intThrows()) |
| |
| _ = x.covariantClosureArgAndReturn({ _ in 0 }) |
| |
| |
| _ = y.covariantReturn(int()) |
| _ = y.covariantReturn(try intThrows()) |
| _ = y.covariantReturn(try! intThrows()) |
| |
| _ = y.covariantOptionalReturn(int()) |
| _ = y.covariantOptionalReturn(try intThrows()) |
| _ = y.covariantOptionalReturn(try! intThrows()) |
| |
| _ = try y.covariantReturnOrThrow(int()) |
| _ = try y.covariantReturnOrThrow(try intThrows()) |
| _ = try y.covariantReturnOrThrow(try! intThrows()) |
| |
| // FIXME: the dynamic self capture here has to happen after existential |
| // opening as well. |
| //_ = y.covariantClosureArgAndReturn({ _ in 0 }) |
| |
| |
| _ = z.covariantReturn(int()) |
| _ = z.covariantReturn(try intThrows()) |
| _ = z.covariantReturn(try! intThrows()) |
| |
| _ = z.covariantOptionalReturn(int()) |
| _ = z.covariantOptionalReturn(try intThrows()) |
| _ = z.covariantOptionalReturn(try! intThrows()) |
| |
| _ = try z.covariantReturnOrThrow(int()) |
| _ = try z.covariantReturnOrThrow(try intThrows()) |
| _ = try z.covariantReturnOrThrow(try! intThrows()) |
| |
| _ = z.covariantClosureArgAndReturn({ _ in 0 }) |
| } |