> On Nov 30, 2016, at 5:02 PM, Jordan Rose via swift-dev <swift-dev@swift.org> 
> wrote:
> 
>> 
>> On Nov 27, 2016, at 16:32, David Sweeris via swift-dev <swift-dev@swift.org 
>> <mailto:swift-dev@swift.org>> wrote:
>> 
>>> 
>>> On Nov 26, 2016, at 5:25 PM, Robert Widmann via swift-dev 
>>> <swift-dev@swift.org <mailto:swift-dev@swift.org>> wrote:
>>> 
>>> Hello all,
>>> 
>>> I’ve seen and been a part of a number of conversations recently where talk 
>>> of planning for “resilient enums”, or even just authors that ship 
>>> frameworks that will eventually offer a binary option that export 
>>> enum-based APIs.  The consensus seems to be that the only safe way to deal 
>>> with this situation is to always cover a `switch` statement with a default, 
>>> regardless of whether the totality checker thinks you’ve covered all cases. 
>>>  Currently, the compiler warns when this is the case, as in stdlib
>>> 
>>> extension ProcessTerminationStatus {
>>>   var isSwiftTrap: Bool {
>>>     switch self {
>>>     case .exit(_):
>>>       return false
>>>     case .signal(let signal):
>>>       return CInt(signal) == SIGILL || CInt(signal) == SIGTRAP
>>>     default:
>>>       // This default case is needed for standard library builds where
>>>       // resilience is enabled
>>>       return false
>>>     }
>>>   }
>>> }
>>> 
>>> I think this warning doesn’t actually serve a purpose and I’d like to 
>>> remove it, or at the very least curb it.  Currently, I see three paths 
>>> forward:
>>> 
>>> 1) Do nothing.
>>> 2) Completely remove the diagnostic
>>> 3) Only emit the diagnostic when the case-tree is switching over enum(s) 
>>> declared inside the current module.
>> 
>> Has the “resilient enum” thing been finalized, or is this kind of code just 
>> a preventative measure?
>> 
>> Also, if “resilience” is a compiler flag, there's a fourth option: Disable 
>> the warning on builds that have “resilience” enabled.
> 
> This issue isn't really specific to resilience. If you depend on some 
> third-party library through the Swift package manager, that library should be 
> free to add new cases to enums in new releases without that being a 
> source-breaking change. On the other hand, maybe you do want to know when new 
> cases are added, so you can go update your switch statements as the author of 
> the client.
> 
> There hasn't been any formal proposal for open vs. closed enums yet. Today 
> all Swift enums are treated as closed, while imported C enums are sometimes 
> treated as closed (switch) and sometimes as open (init(rawValue:) always 
> succeeding). The Library Evolution document 
> <http://jrose-apple.github.io/swift-library-evolution/#enums> describes how 
> we want enums to behave in a resilient library, but doesn't discuss 
> non-resilient source packages.
> 
> I'd lean towards (3) as the right answer for now, but it would also be great 
> to start the ball rolling on designing a "closed" annotation for enums that 
> makes sense for both source and binary distribution.
> 
> Jordan
> 

Idle thought: this discussion makes me think we might want a tristate for the 
different behaviours inside and outside the resilience domain:

* closed: inside and outside are exhaustive; always warn on dead defaults
* open: inside and outside are inexhaustive; never warn on dead defaults
* “default”: inside is exhaustive, outside is inexhaustive; warn inside, but 
not outside
(the hypothetical 4th state seems incoherent to me)

Basically the default behaviour is that I know what my enum is and would like 
the safety benefits of exhaustive matching, but I don’t want the evolution 
hazard of letting others exhaustively match. However I may also want the 
ability to be able to make certain enums act in-exhaustive even in my own code. 
This may be too niche to care about, though. Certainly this mode can be added 
later in a backwards compatible way.


> _______________________________________________
> swift-dev mailing list
> swift-dev@swift.org <mailto:swift-dev@swift.org>
> https://lists.swift.org/mailman/listinfo/swift-dev 
> <https://lists.swift.org/mailman/listinfo/swift-dev>
_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to