blob: 0586a3f51d0cea90d9694885a18ea7172bd6ab27 [file] [log] [blame]
// RUN: %target-swift-emit-silgen -verify %s
// RUN: %target-swift-emit-sil %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 })
}