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