blob: fb8e35b16b1e77c69e93adcb806fe164e7df9f39 [file] [log] [blame]
// 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")