File: convenience_init_peer_delegation.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 (127 lines) | stat: -rw-r--r-- 4,382 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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// RUN: %empty-directory(%t)
// RUN: %target-clang -c %S/Inputs/convenience_init_peer_delegation.m -o %t/convenience_init_peer_delegation.objc.o -fmodules -fobjc-arc
// RUN: %target-build-swift -c -o %t/convenience_init_peer_delegation.swift.o -import-objc-header %S/Inputs/convenience_init_peer_delegation.h %s
// RUN: %target-swiftc_driver %t/convenience_init_peer_delegation.objc.o %t/convenience_init_peer_delegation.swift.o -o %t/main
// RUN: %target-codesign %t/main
// RUN: %target-run %t/main | %FileCheck %s

// REQUIRES: executable_test
// REQUIRES: objc_interop

extension Base {
  convenience init(swiftToDesignated: ()) {
    print("\(#function) \(type(of: self))")
    self.init()
  }

  convenience init(swiftToConvenience: ()) {
    print("\(#function) \(type(of: self))")
    self.init(conveniently: ())
  }

  convenience init(swiftToConvenienceFactory: ()) {
    print("\(#function) \(type(of: self))")
    self.init(convenientFactory: false)
  }

  convenience init(swiftToNormalFactory: ()) {
    // FIXME: This shouldn't be allowed, since the factory won't actually use
    // the dynamic Self type.
    print("\(#function) \(type(of: self))")
    self.init(normalFactory: false)
  }

  @objc convenience init(objcToDesignated: ()) {
    print("\(#function) \(type(of: self))")
    self.init()
  }
  @objc convenience init(objcToConvenience: ()) {
    print("\(#function) \(type(of: self))")
    self.init(conveniently: ())
  }
  @objc convenience init(objcToConvenienceFactory: ()) {
    print("\(#function) \(type(of: self))")
    self.init(convenientFactory: false)
  }
  @objc convenience init(objcToNormalFactory: ()) {
    // FIXME: This shouldn't be allowed, since the factory won't actually use
    // the dynamic Self type.
    print("\(#function) \(type(of: self))")
    self.init(normalFactory: false)
  }
}

/// Checks that `op` performs `base` allocations of Base and `sub` allocations
/// of Sub.
func check(base: Int = 0, sub: Int = 0,
           file: StaticString = #file, line: UInt = #line,
           op: () -> Void) {
  baseCounter = 0
  subCounter = 0
  op()
  precondition(baseCounter == base,
               "expected \(base) Base instances, got \(baseCounter)",
               file: file, line: line)
  precondition(subCounter == sub,
               "expected \(sub) Sub instances, got \(subCounter)",
               file: file, line: line)
}

// CHECK: START
print("START")

// Check that this whole setup works.
// CHECK-NEXT: init Base
check(base: 1) { _ = Base() }
// CHECK-NEXT: init Sub
check(sub: 1) { _ = Sub() }

// CHECK-NEXT: init(swiftToDesignated:) Sub
// CHECK-NEXT: init Sub
check(sub: 1) { _ = Sub(swiftToDesignated: ()) }
// CHECK-NEXT: init(swiftToConvenience:) Sub
// CHECK-NEXT: -[Base initConveniently]
// CHECK-NEXT: init Sub
check(sub: 1) { _ = Sub(swiftToConvenience: ()) }
// CHECK-NEXT: init(swiftToConvenienceFactory:) Sub
// CHECK-NEXT: +[Base baseWithConvenientFactory:]
// CHECK-NEXT: init Sub
check(sub: 1) { _ = Sub(swiftToConvenienceFactory: ()) }

// FIXME: This shouldn't be allowed in the first place; see the definition 
// above.
// CHECK-NEXT: init(swiftToNormalFactory:) Base
// CHECK-NEXT: +[Base baseWithNormalFactory:]
// CHECK-NEXT: init Base
check(base: 1) { _ = Base(swiftToNormalFactory: ()) }
// CHECK-NEXT: init(swiftToNormalFactory:) Sub
// CHECK-NEXT: +[Base baseWithNormalFactory:]
// CHECK-NEXT: init Base
check(base: 1) { _ = Sub(swiftToNormalFactory: ()) }

// CHECK-NEXT: init(objcToDesignated:) Sub
// CHECK-NEXT: init Sub
check(sub: 1) { _ = Sub(objcToDesignated: ()) }
// CHECK-NEXT: init(objcToConvenience:) Sub
// CHECK-NEXT: -[Base initConveniently]
// CHECK-NEXT: init Sub
check(sub: 1) { _ = Sub(objcToConvenience: ()) }
// CHECK-NEXT: init(objcToConvenienceFactory:) Sub
// CHECK-NEXT: +[Base baseWithConvenientFactory:]
// CHECK-NEXT: init Sub
check(sub: 2) { _ = Sub(objcToConvenienceFactory: ()) }

// FIXME: This shouldn't be allowed in the first place; see the definition 
// above.
// CHECK-NEXT: init(objcToNormalFactory:) Base
// CHECK-NEXT: +[Base baseWithNormalFactory:]
// CHECK-NEXT: init Base
check(base: 2) { _ = Base(objcToNormalFactory: ()) }
// CHECK-NEXT: init(objcToNormalFactory:) Sub
// CHECK-NEXT: +[Base baseWithNormalFactory:]
// CHECK-NEXT: init Base
check(base: 1, sub: 1) { _ = Sub(objcToNormalFactory: ()) }

// CHECK-NEXT: END
print("END")