File: closures.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (94 lines) | stat: -rw-r--r-- 1,638 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// 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()