// RUN: %target-run-simple-swift foo | %FileCheck %s // REQUIRES: executable_test // REQUIRES: objc_interop import Foundation class SuperString : NSString { var len = Int() override init() { super.init() } init(_ len:Int) { super.init() self.len = len } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } required init(itemProviderData data: Data, typeIdentifier: String) throws { fatalError("don't call this initializer") } override var length: Int { return len } override func character(at n: Int) -> unichar { return unichar(0x30 + n) } override func substring(with r: NSRange) -> String { if (r.location == 0) { return SuperString(r.length) as String } return super.substring(with: r) } } // CHECK: 0123456789 print(SuperString(10)) // CHECK: 0123456789 print(NSString(string: SuperString(10) as String)) // CHECK: 012 print(SuperString(10).substring(with: NSRange(location: 0, length: 3))) // CHECK: 345 print(SuperString(10).substring(with: NSRange(location: 3, length: 3))) class X { var label: String init(_ label: String) { self.label = label print("Initializing \(label)"); } deinit { print("Destroying \(label)"); } } @requires_stored_property_inits class A : NSObject { var x1 = X("A.x1") var x2 = X("A.x2") override init() { print("Initializing A instance"); } deinit { print("Destroying A instance"); } } class B : A { var y1 = X("B.y1") var y2 = X("B.y2") override init() { super.init() print("Initializing B instance"); } deinit { print("Destroying B instance"); } } func testB() -> B { return B() } // CHECK: Initializing A.x1 // CHECK: Initializing A.x2 // CHECK: Initializing B.y1 // CHECK: Initializing B.y2 // CHECK: Initializing A instance // CHECK: Initializing B instance // CHECK: Destroying B instance // CHECK: Destroying A instance // CHECK: Destroying B.y1 // CHECK: Destroying B.y2 // CHECK: Destroying A.x1 // CHECK: Destroying A.x2 testB() // Propagating nil init out of a superclass initialization. class MyNSData : NSData { init?(base64EncodedString str: String) { super.init(base64Encoded:str, options:[]) print("MyNSData code should not be executed") } required init?(coder: NSCoder) { super.init(coder: coder) } } // CHECK-NOT: should not be executed if let myNSData = MyNSData(base64EncodedString:"\n\n\n") { print("NSData came back non-nil?") } else { // CHECK: nil MyNSData as expected print("nil MyNSData as expected") } // Propagating nil out of delegating initialization. extension NSData { convenience init?(myString str: String) { self.init(base64Encoded:str, options:[]) print("NSData code should not be executed") } } // CHECK-NOT: NSData code should not be executed var nsData : NSData! = NSData(myString:"\n\n\n") if nsData == nil { // CHECK: nil NSData as expected print("nil NSData as expected") }