mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
95 lines
1.6 KiB
Swift
95 lines
1.6 KiB
Swift
// RUN: %target-run-simple-swift | %FileCheck %s
|
|
// REQUIRES: executable_test
|
|
|
|
func localFunc(_ x: Int) -> Int {
|
|
func addToX(_ y: Int) -> Int {
|
|
return x + y
|
|
}
|
|
return addToX(1)
|
|
}
|
|
|
|
func localFunc2(_ x: Int) -> (_ y: Int) -> Int {
|
|
func addToX(_ y: Int) -> Int {
|
|
return x + y
|
|
}
|
|
return addToX
|
|
}
|
|
|
|
// FIXME global vars
|
|
func test() {
|
|
// CHECK: 3
|
|
print(localFunc(2))
|
|
// CHECK: 5
|
|
print(localFunc2(2)(3))
|
|
|
|
var lf = localFunc
|
|
// CHECK: 8
|
|
print(lf(7))
|
|
|
|
var lf2 = localFunc2
|
|
var lf2_ = lf2(5)
|
|
// CHECK: 13
|
|
print(lf2_(8))
|
|
}
|
|
|
|
test()
|
|
|
|
// <rdar://problem/19776288>
|
|
func map<T>(_ fn: (T) -> ()) {
|
|
print("Void overload")
|
|
}
|
|
|
|
func map<T,U>(_ fn: (T) -> U) {
|
|
print("Non-void overload")
|
|
}
|
|
|
|
map({()})
|
|
// CHECK: Void overload
|
|
|
|
map({(x: Int) -> Int in x})
|
|
// CHECK: Non-void overload
|
|
|
|
// This used to assert in runtime assert builds.
|
|
protocol Initializable {
|
|
init()
|
|
}
|
|
|
|
func f2<T: Initializable>(_ x: T) -> T? { return nil }
|
|
|
|
func c<T: Initializable>(_ x: T) {
|
|
|
|
({
|
|
guard var b = f2(x) else { print("success") ; return }
|
|
let c = { b = T() }
|
|
_ = (b, c)
|
|
})()
|
|
|
|
}
|
|
extension Bool : Initializable {
|
|
init() {
|
|
self = true
|
|
}
|
|
}
|
|
// CHECK: success
|
|
c(true)
|
|
|
|
|
|
func f() -> Bool? { return nil }
|
|
|
|
// CHECK: success
|
|
({
|
|
guard var b = f() else { print("success") ; return }
|
|
let c = { b = true }
|
|
_ = (b, c)
|
|
})()
|
|
|
|
// This used to crash at one point in optimized mode because we had the wrong
|
|
// memory effects on swift_getFunctionTypeMetadata.
|
|
func crash() {
|
|
let f: (Int, Int, Int, Int) -> Int = { _, _, _, _ in 21 }
|
|
let fs = [f, f]
|
|
// CHECK: fs: [(Function), (Function)]
|
|
print("fs: \(fs)")
|
|
}
|
|
crash()
|