blob: ed3be1efbca1245dc619da76fba1b5cb99c8ac44 [file] [log] [blame]
// 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<T>(_ 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