mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Add a test for an extremely confusing behavior of switches for ExpressibleByNilLiteral-conforming types. From the looks of the expression tree, one would hope that `case nil` would match such types. Instead, the subject value is up-converted to an optional and compared to `nil` directly with ~=.
31 lines
653 B
Swift
31 lines
653 B
Swift
// RUN: %target-typecheck-verify-swift
|
|
|
|
enum Hey {
|
|
case listen
|
|
}
|
|
|
|
func test() {
|
|
switch Hey.listen {
|
|
case nil: // expected-warning {{type 'Hey' is not optional, value can never be nil}}
|
|
break
|
|
default:
|
|
break
|
|
}
|
|
}
|
|
|
|
struct Nilable: ExpressibleByNilLiteral {
|
|
init(nilLiteral: ()) {}
|
|
}
|
|
|
|
func testNil() {
|
|
// N.B. A deeply confusing case as no conversion is performed on the `nil`
|
|
// literal. Instead, the match subject is converted to `Nilable?` and compared
|
|
// using ~=.
|
|
switch Nilable(nilLiteral: ()) {
|
|
case nil: // expected-warning {{type 'Nilable' is not optional, value can never be nil}}
|
|
break
|
|
default:
|
|
break
|
|
}
|
|
}
|