Combining hashes

Supporting either/or protocol requirements by providing default implementations based on the presence/absence of "direct" implementations for other requirements sounds like an intriguing idea. It needs to be explored further: For example, in the case of Hashable, what would extension Hashable where Self.implements(hashValue) mean, exactly? When is an implementation of hashValue not good enough for implements? Default implementations aren't currently marked as such.

I'd love to find out where this discussion takes us; however, it should be pitched in a new topic.

Would @available attributes not work in the usual case? As I explained above, the only reason Hashable evolution needs special compiler support is because it can be synthesized by the compiler. There are only a few protocols like that, and I really don't think we should bend over backwards to make it easier to evolve these. The need to replace a requirement in a synthesized protocol is an extremely rare thing.