// 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")