[swift-dev] New warning message while switching on an enum
Robert Widmann
devteam.codafi at gmail.com
Tue May 9 15:54:47 CDT 2017
Is there a catch-all to query for such casts (sorry, I'm away from my computer at the moment).
~Robert Widmann
2017/05/09 16:40、Jordan Rose <jordan_rose at apple.com> のメッセージ:
> I think any bridging conversion or upcast would count.
>
> enum Foo {
> case foo(NSFileManager)
> case bar(NSString)
> case baz(Int)
> }
> func test(x: Foo) {
> switch x {
> case .foo(let obj as NSObject):
> print("totally legal")
> case .bar(let obj as String):
> print("also cool")
> case .baz(let obj as Any):
> print("I'm not sure why, but sure")
> }
> }
>
> Jordan
>
>> On May 9, 2017, at 11:29, Robert Widmann <devteam.codafi at gmail.com> wrote:
>>
>> Right. I guess I should have asked: Are there any other kinds of patterns we consider exhaustive that have this structure?
>>
>> ~Robert Widmann
>>
>>> On May 9, 2017, at 2:23 PM, Jordan Rose <jordan_rose at apple.com> wrote:
>>>
>>> "as NSError" isn't a tautology, though―the original type is 'Error'. Additionally, the presence or absence of a warning shouldn't affect exhaustiveness analysis, which is currently an error when you get it wrong. Warnings are things you can build with and fix later.
>>>
>>> Jordan
>>>
>>>
>>>> On May 9, 2017, at 11:22, Robert Widmann <devteam.codafi at gmail.com> wrote:
>>>>
>>>> We’ll warn if that kind of cast is a tautology, right? That leaves only the dynamic casts, which can’t be assumed exhaustive.
>>>>
>>>> ~Robert Widmann
>>>>
>>>>> On May 9, 2017, at 2:13 PM, Jordan Rose <jordan_rose at apple.com> wrote:
>>>>>
>>>>> It's neither a variable binding nor an expression pattern, right? It has to be compared against the original type to know whether it's exhaustive or not. (Consider "let error as NSError" in a catch clause, which should be considered exhaustive.)
>>>>>
>>>>> Jordan
>>>>>
>>>>>> On May 9, 2017, at 11:12, Robert Widmann <devteam.codafi at gmail.com> wrote:
>>>>>>
>>>>>> It’s mine, yep. It looks like it’s classifying the cast in the first pattern as a variable binding instead of an expression pattern. I’ll push a fix later.
>>>>>>
>>>>>> Thanks!
>>>>>>
>>>>>>> On May 9, 2017, at 1:52 PM, Jordan Rose <jordan_rose at apple.com> wrote:
>>>>>>>
>>>>>>> That looks like a bug to me, since of course the first pattern won't always match. I suspect this is Robert's work on trying to make the exhaustive checks better, https://github.com/apple/swift/pull/8908. Thanks for catching this!
>>>>>>>
>>>>>>> Jordan
>>>>>>>
>>>>>>>
>>>>>>>> On May 9, 2017, at 07:09, Pushkar N Kulkarni via swift-dev <swift-dev at swift.org> wrote:
>>>>>>>>
>>>>>>>> Hi there,
>>>>>>>>
>>>>>>>> I see a new warning message for switch statements on enums, like this one:
>>>>>>>>
>>>>>>>> enum Test {
>>>>>>>> case one(Any)
>>>>>>>> case two
>>>>>>>> }
>>>>>>>>
>>>>>>>> let x: Test = .one("One")
>>>>>>>> switch x {
>>>>>>>> case .one(let s as String): print(s)
>>>>>>>> case .one: break
>>>>>>>> case .two: break
>>>>>>>> }
>>>>>>>>
>>>>>>>> enum.swift:9:10: warning: case is already handled by previous patterns; consider removing it
>>>>>>>> case .one: break
>>>>>>>>
>>>>>>>>
>>>>>>>> I do not see this warning with the 04-24 dev snapshot.
>>>>>>>>
>>>>>>>> The warning goes away with the use of the wildcard pattern in the second case:
>>>>>>>>
>>>>>>>> switch x {
>>>>>>>> case .one(let s as String): print(s)
>>>>>>>> case .one(_): break
>>>>>>>> case .two: break
>>>>>>>> }
>>>>>>>>
>>>>>>>>
>>>>>>>> I am wondering if this change is intentional, though it does make sense to me. Can someone please point me to the related commit?
>>>>>>>>
>>>>>>>> Thanks in advance!
>>>>>>>>
>>>>>>>> Pushkar N Kulkarni,
>>>>>>>> IBM Runtimes
>>>>>>>>
>>>>>>>> Simplicity is prerequisite for reliability - Edsger W. Dijkstra
>>>>>>>>
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> swift-dev mailing list
>>>>>>>> swift-dev at swift.org
>>>>>>>> https://lists.swift.org/mailman/listinfo/swift-dev
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-dev/attachments/20170509/29227e8a/attachment.html>
More information about the swift-dev
mailing list