> On Jan 2, 2018, at 11:14 AM, Itai Ferber <ifer...@apple.com> wrote:
> 
> On 27 Dec 2017, at 12:41, Douglas Gregor via swift-dev wrote:
> 
> 
> 
> Sent from my iPhone
> 
> On Dec 27, 2017, at 11:05 AM, Karl Wagner <razie...@gmail.com 
> <mailto:razie...@gmail.com>> wrote:
> 
>> 
>> 
>>> On 22. Dec 2017, at 07:13, Ted Kremenek via swift-dev <swift-dev@swift.org 
>>> <mailto:swift-dev@swift.org>> wrote:
>>> 
>>> 
>>> 
>>>> On Dec 19, 2017, at 9:39 PM, Ted Kremenek via swift-dev 
>>>> <swift-dev@swift.org <mailto:swift-dev@swift.org>> wrote:
>>>> 
>>>> 
>>>> 
>>>> On Dec 19, 2017, at 8:57 PM, Douglas Gregor <dgre...@apple.com 
>>>> <mailto:dgre...@apple.com>> wrote:
>>>> 
>>>>> 
>>>>> 
>>>>> Sent from my iPhone
>>>>> 
>>>>> On Dec 19, 2017, at 8:31 PM, Ted Kremenek <kreme...@apple.com 
>>>>> <mailto:kreme...@apple.com>> wrote:
>>>>> 
>>>>>> 
>>>>>> 
>>>>>> On Dec 19, 2017, at 3:59 PM, Douglas Gregor <dgre...@apple.com 
>>>>>> <mailto:dgre...@apple.com>> wrote:
>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>>> On Dec 19, 2017, at 2:26 PM, Ted Kremenek via swift-dev 
>>>>>>>> <swift-dev@swift.org <mailto:swift-dev@swift.org>> wrote:
>>>>>>>> 
>>>>>>>> 
>>>>>>>> On Dec 18, 2017, 4:53 PM -0800, Douglas Gregor via swift-dev 
>>>>>>>> <swift-dev@swift.org <mailto:swift-dev@swift.org>>, wrote:
>>>>>>>>> Hi all,
>>>>>>>>> 
>>>>>>>>> A little while back, I added an error to the Swift 4.1 compiler that 
>>>>>>>>> complains if one tries to use conditional conformances, along with a 
>>>>>>>>> flag “-enable-experimental-conditional-conformances” to enable the 
>>>>>>>>> feature. We did this because we haven’t implemented the complete 
>>>>>>>>> proposal yet; specifically, we don’t yet handle dynamic casting that 
>>>>>>>>> involves conditional conformances, and won’t in Swift 4.1.
>>>>>>>>> 
>>>>>>>>> I’d like to take away the 
>>>>>>>>> "-enable-experimental-conditional-conformances” flag and always allow 
>>>>>>>>> conditional conformances in Swift 4.1, because the changes in the 
>>>>>>>>> standard library that make use of conditional conformances can force 
>>>>>>>>> users to change their code *to themselves use conditional 
>>>>>>>>> conformances*. Specifically, if they had code like this:
>>>>>>>>> 
>>>>>>>>> extension MutableSlice : P { }
>>>>>>>>> extension MutableBidirectionalSlice : P { }
>>>>>>>>> // …
>>>>>>>>> 
>>>>>>>>> they’ll get an error about overlapping conformances, and need to do 
>>>>>>>>> something like the following to fix the issue:
>>>>>>>>> 
>>>>>>>>> extension Slice: P where Base: MutableCollection { }
>>>>>>>>> 
>>>>>>>>> which is way more elegant, but would require passing 
>>>>>>>>> "-enable-experimental-conditional-conformances”. That seems… 
>>>>>>>>> unfortunate… given that we’re forcing them to use this feature.
>>>>>>>>> 
>>>>>>>>> My proposal is, specifically:
>>>>>>>>> 
>>>>>>>>> Allow conditional conformances to be used in Swift 4.1 (no flag 
>>>>>>>>> required)
>>>>>>>>> Drop the -enable-experimental-conditional-conformances flag entirely
>>>>>>>>> Add a runtime warning when an attempt to dynamic cast fails due to a 
>>>>>>>>> conditional conformance, so at least users know what’s going on
>>>>>>>>>  
>>>>>>>> 
>>>>>>>> The last bullet doesn’t feel right to me.  It sounds like we would 
>>>>>>>> ship a feature that we know only partially works, but issue a runtime 
>>>>>>>> warning in the case we know isn’t fully implemented?  I’m I 
>>>>>>>> interpretting that point correctly?
>>>>>>> 
>>>>>>> Yes, that’s correct. We will fail to match the conformance (i.e., 
>>>>>>> return “nil” from an “as?” cast), which might be correct and might be 
>>>>>>> wrong.
>>>>>>> 
>>>>>>>         - Doug
>>>>>> 
>>>>>> Hmm.  I’m concerned that a warning runtime would be to settle. Many 
>>>>>> people would possibly not even notice it.  It’s essentially an edge case 
>>>>>> in a feature that isn’t fully implemented and thus that part of the 
>>>>>> feature should not be used yet.
>>>>>> 
>>>>>> What do you think about making this a hard runtime error instead, 
>>>>>> similar to how we are approaching runtime issues for exclusivity 
>>>>>> checking?  That would be impossible to miss and would convey the optics 
>>>>>> that this runtime aspect of the feature is not yet supported and thus 
>>>>>> should not be used. 
>>>>> 
>>>>> I’d rather not make it a runtime error, because code that’s doing dynamic 
>>>>> casting to a protocol is generally already handling the “nil” case (“as?” 
>>>>> syntax), so aborting the program feels far too strong. 
>>>>> 
>>>>>   - Doug
>>>> 
>>>> For me I think the part I’m struggling with is that making it a warning 
>>>> conflates two things together: expected failure in the dynamic cast 
>>>> because the value you are casting doesn’t have that type or — in this case 
>>>> — failure because the cast can never succeed because it is not supported 
>>>> yet.  I feel like we would be silently swallowing an unsupported 
>>>> condition.  If that didn’t matter, why bother issuing a warning?  Clearly 
>>>> were trying to send some kind of message here about this not being 
>>>> supported.
>>> 
>>> Doug and I chatted a bit offline.
>>> 
>>> I’m now more on the side of thinking a warning is a reasonable approach.  
>>> I’m still concerned that it will be unnoticed by some developers, and I am 
>>> mixed on conflating failure the cast of “this doesn’t work at all for this 
>>> specific type because it has a conditional conformance” versus “this didn’t 
>>> work because the type didn’t conform to the protocol”.  That said, I think 
>>> the cases impacted here are likely very, very small — and a crash in the 
>>> program is probably excessive.
>>> _______________________________________________
>>> 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>
>> 
>> 
>> What about if we disabled conditional conformances for non-generic protocols 
>> (or keep that part behind the flag)? It seems a bit arbitrary, but IIRC, the 
>> standard library uses conditional conformances for things like Equatable and 
>> the various faces of Collection, which are not runtime-castable anyway.
> 
> This is a reasonable approach. To make it consistent, we would want to make 
> the Codable conformances of Array, Set, Dictionary, and Optional 
> unconditional again—otherwise, user code couldn’t have Codable conformances 
> for some types without adding the flag. 
> 
> I’m hesitant to do this because the unconditional conformances to Codable are 
> wrong, and fixing them is going to cause some (legitimate, necessary) source 
> breakage. It feels better overall to get that out of the way sooner... before 
> more wrong Codable conformances get layered on top. 
> 
>   - Doug
> 
> Just to be clear, what is the current impact of leaving those Codable 
> conformances conditional? Having casts like [1,2,3] as? Codable fail?
> 
Right. Those casts, which would have succeeded in Swift 4, will fail (with a 
runtime warning) in Swift 4.1.

> For what it’s worth, I’m not entirely certain how useful type-erased 
> Encodable and Decodable values are in practice (aside from the very 
> workarounds we used because conditional conformances weren’t ready yet)…
> 
The standard library had a bunch of clever trickery to deal with type-erased 
Encodable and Decodable… I suspect few others did the same thing.
> Can we try to get some metrics about whether people do this at all today and 
> for what purposes?
> 
Unfortunately, I don’t know of a good way to do that.
> I don’t feel too strongly either way (these conformances have been 
> unconditional so far, so we’re not regressing anything by not doing this for 
> Codable), but I do think it would be nice to have the actual conditional 
> conformances in place if we’re not breaking anyone.
> 
Yes, I agree. I especially want to get the source-breakage aspect out of the 
way.

        - Doug

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

Reply via email to