> On Sep 27, 2016, at 5:06 PM, Jordan Rose <jordan_r...@apple.com> wrote: > > Great job thinking this all through (as usual), and I’ll be very happy to > have Optional and Array become Equatable. Here’s some of my thoughts on the > library evolution aspect of this: > > - Removing a conditional conformance isn’t allowed, obviously. > - Adding a conditional conformance is just like adding an unconditional > conformance—it needs availability info.
Right. The main wrinkle I see here is that, when you add a conditional conformance, you will effectively end up with overlapping conformances when running an old application against a new library. Do you want me to capture these cases in the proposal in a section on “Resilience” or “Library Evolution”, like I’ve tried to capture the effect on ABI Stability? (I think that makes sense) > - It would be nice™ if making a conditional conformance more general was > allowed. Since the plan doesn't allow overlapping conformances, I think this > is actually implementable: just don’t put the constraints in the symbol name. > I don’t know how to represent the backwards-deploying aspects of this right > now, so it probably makes sense to forbid it today, but I think it would be > nice if the implementation left the door open. Yeah. It’s a different set of witness tables that one would need to gather to use the conditional conformance in the newer version of the library vs. in an older version of a library. That’s okay if we leave the witness-table-gathering to the runtime, but not so great if we statically provide the witness tables. > On that note, what happens here? > > // Module Lib > public protocol Base {} > public protocol Sub: Base {} > public protocol Special: Sub {} > > public struct Impl<T> {} > extension Impl: Special where T: Special {} > > > // Module Client > import Lib > > extension Impl: Sub where T: Sub {} > > I think this gets rejected because Impl already has a conformance to Sub—the > extension in Client, despite being less specialized, shows up too late to > actually declare this conformance “better”. Is that correct? Correct. Impl has a conformance to ‘Sub’ in Lib; Client cannot declare a new one, because it overlaps. Had all of this code been in one module, it would be well-formed, because the implied conformance to ’Sub’ in the first extension would lose to the explicit conformance to Sub in the second (less-specialized) extension. - Doug
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution