So, you would have the compiler generate a version of each function for each set of associated types? In other words:
myFunc(x: SomeProtocol) -> SomeReturn
would translate to:
myFunc<ConformingType, AssociatedType1, AssociatedType2, etc.>(x: ConformingType) -> SomeReturn
and be broken down with Swift's generic-function parser/AST/SIL system further.
But what happens with:
myFunc2(x: SomeProtocol, y: SomeProtocol) -> SomeReturn
Remember that the actual conforming types don't have to be the same!
myFunc2<ConformingType1, ConformingType2, AssociatedType1-1, AssociatedType1-2, etc. AssociatedType2-1, AssociatedType2-2, etc.>(x: ConformingType1, y: ConformingType2) -> SomeReturn
Yikes.
(And imagine more parameters. And/or the return type has parts dependent on SomeProtocol.)
And the way we currently have it, where all the parameters have to have the same conforming type, that means we know that all the corresponding associated types are the same, and we can do various combinations with them. How's that supposed to work when corresponding associated types could differ? Hope they don't? Use Any? Just crash at run-time?
(Oh yeah, if the return type does depend on SomeProtocol, how do we determine which version to use? And how to write that out in code?)
Or do we just crash at runtime whenever all mentions of SomeProtocol don't resolve to the same conforming type?