Files
swift-mirror/test/expr/cast/nil_value_to_optional.swift
Robert Widmann 9bb914a3a5 [SR-3523] Coercions that implicitly look through IUOs should not propagate
Force unwrapping the expression and propagating that type down to the
rest of the tree causes crashes when we go to request a different set
of protocols than we were expecting from it later.  Make this
transformation local to the apply instead.
2017-01-03 19:03:24 -07:00

32 lines
901 B
Swift

// RUN: %target-typecheck-verify-swift
var t = true
var f = false
func markUsed<T>(_ t: T) {}
markUsed(t != nil) // expected-warning {{comparing non-optional value of type 'Bool' to nil always returns true}}
markUsed(f != nil) // expected-warning {{comparing non-optional value of type 'Bool' to nil always returns true}}
class C : Equatable {}
func == (lhs: C, rhs: C) -> Bool {
return true
}
func test(_ c: C) {
if c == nil {} // expected-warning {{comparing non-optional value of type 'C' to nil always returns false}}
}
class D {}
var d = D()
var dopt: D? = nil
var diuopt: D! = nil
_ = d! // expected-error {{cannot force unwrap value of non-optional type 'D'}}
_ = dopt == nil
_ = diuopt == nil
_ = diuopt is ExpressibleByNilLiteral // expected-warning {{'is' test is always true}}
// expected-warning@-1 {{conditional cast from 'D!' to 'ExpressibleByNilLiteral' always succeeds}}