// RUN: %target-run-simple-swift | %FileCheck %s // REQUIRES: executable_test class A { func printA() { print("A", terminator: "") } } class B : A { override func printA() { print("B", terminator: "") } } func printA(_ v: A) { v.printA() } func printOpt(_ subprint: @escaping (T) -> ()) -> (T?) -> () { return { x in switch (x) { case .some(let y): print(".some(", terminator: ""); subprint(y); print(")", terminator: "") case .none: print(".none", terminator: "") } } } func test(_ v: A????, _ cast: (A????) -> B?) { printOpt(printOpt(printOpt(printOpt(printA))))(v) print(" as? B: ", terminator: "") printOpt(printA)(cast(v)) print("\n", terminator: "") } test(.some(.some(.some(.some(A())))), { $0 as? B }) test(.some(.some(.some(.some(B())))), { $0 as? B }) test(.some(.some(.some(.none))), { $0 as? B }) test(.some(.some(.none)), { $0 as? B }) test(.some(.none), { $0 as? B }) test(.none, { $0 as? B }) // CHECK: .some(.some(.some(.some(A)))) as? B: .none // CHECK: .some(.some(.some(.some(B)))) as? B: .some(B) // CHECK: .some(.some(.some(.none))) as? B: .none // CHECK: .some(.some(.none)) as? B: .none // CHECK: .some(.none) as? B: .none // CHECK: .none as? B: .none func test(_ v: A????, _ cast: (A????) -> B??) { printOpt(printOpt(printOpt(printOpt(printA))))(v) print(" as? B?: ", terminator: "") printOpt(printOpt(printA))(cast(v)) print("\n", terminator: "") } test(.some(.some(.some(.some(A())))), { $0 as? B? }) test(.some(.some(.some(.some(B())))), { $0 as? B? }) test(.some(.some(.some(.none))), { $0 as? B? }) test(.some(.some(.none)), { $0 as? B? }) test(.some(.none), { $0 as? B? }) test(.none, { $0 as? B? }) // CHECK: .some(.some(.some(.some(A)))) as? B?: .none // CHECK: .some(.some(.some(.some(B)))) as? B?: .some(.some(B)) // CHECK: .some(.some(.some(.none))) as? B?: .some(.none) // CHECK: .some(.some(.none)) as? B?: .none // CHECK: .some(.none) as? B?: .none // CHECK: .none as? B?: .none func test(_ v: A????, _ cast: (A????) -> B???) { printOpt(printOpt(printOpt(printOpt(printA))))(v) print(" as? B??: ", terminator: "") printOpt(printOpt(printOpt(printA)))(cast(v)) print("\n", terminator: "") } test(.some(.some(.some(.some(A())))), { $0 as? B?? }) test(.some(.some(.some(.some(B())))), { $0 as? B?? }) test(.some(.some(.some(.none))), { $0 as? B?? }) test(.some(.some(.none)), { $0 as? B?? }) test(.some(.none), { $0 as? B?? }) test(.none, { $0 as? B?? }) // CHECK: .some(.some(.some(.some(A)))) as? B??: .none // CHECK: .some(.some(.some(.some(B)))) as? B??: .some(.some(.some(B))) // CHECK: .some(.some(.some(.none))) as? B??: .some(.some(.none)) // CHECK: .some(.some(.none)) as? B??: .some(.none) // CHECK: .some(.none) as? B??: .none // CHECK: .none as? B??: .none class Foo : Equatable { } func ==(a : Foo, b : Foo) -> Bool { return a === b } var x_foo: Foo! = nil if x_foo == nil { print("x_foo is nil") } // CHECK: x_foo is nil if x_foo != nil { print("x_foo is not nil") } else { print("x_foo is nil") } // CHECK: x_foo is nil if nil == x_foo { print("x_foo is nil") } // CHECK: x_foo is nil if nil != x_foo { print("x_foo is not nil") } else { print("x_foo is nil") } // CHECK: x_foo is nil var y_foo: Foo? = nil if y_foo == nil { print("y_foo is nil") } // CHECK: y_foo is nil if y_foo != nil { print("y_foo is not nil") } else { print("y_foo is nil") } // CHECK: y_foo is nil if nil == y_foo { print("y_foo is nil") } // CHECK: y_foo is nil if nil != y_foo { print("y_foo is not nil") } else { print("y_foo is nil") } // CHECK: y_foo is nil var x : Int? = nil var y : Int?? = x var z : Int?? = nil switch y { case nil: print("y is nil") case .some(nil): print("y is .some(nil)") case .some(let v): print("y is .some(\(v))") } // CHECK: y is .some(nil) switch z { case nil: print("z is nil") case .some(nil): print("z is .some(nil)") case .some(let v): print("z is .some(\(v))") } // CHECK: z is nil // Validate nil equality comparisons with non-equatable optional types class C {} var c: C? = nil print(c == nil) // CHECK: true print(nil == c) // CHECK: true print(c != nil) // CHECK: false print(nil != c) // CHECK: false var c2: C? = C() print(c2 == nil) // CHECK: false print(nil == c2) // CHECK: false print(c2 != nil) // CHECK: true print(nil != c2) // CHECK: true var c3: C! = nil print(c3 == nil) // CHECK: true print(nil == c3) // CHECK: true print(c3 != nil) // CHECK: false print(nil != c3) // CHECK: false var c4: C! = C() print(c4 == nil) // CHECK: false print(nil == c4) // CHECK: false print(c4 != nil) // CHECK: true print(nil != c4) // CHECK: true