> On Feb 8, 2017, at 10:30 PM, Douglas Gregor <dgre...@apple.com> wrote:
> 
> 
>> On Feb 8, 2017, at 10:21 PM, Slava Pestov <spes...@apple.com> wrote:
>> 
>> Hah, Doug and I were just discussing this.
>> 
>> In Swift 3.1, we generalized where clauses to allow them to add requirements 
>> on outer generic parameters. However we did not remove the diagnostic 
>> prohibiting a where clause from being attached to a non-generic method. In 
>> theory this can be made to work; the only slightly tricky thing is we will 
>> get a GenericParamList with zero parameters but non-zero requirements, which 
>> would require shuffling some things around to avoid assertions.
>> 
>> This would be a good starter project for someone who wanted to learn more 
>> about the generics system.
>> 
>> As for index(of:) and the specific details of the stdlib that are involved 
>> here, I have no idea — I’m just talking about the bogus diagnostic itself.
> 
> Well, I think Brent is talking about doing this on a protocol requirement, 
> which is more interesting because not all conforming types would satisfy the 
> requirement…

Since there would be no way to invoke the requirement on such a type, could we 
leave the entry blank in the witness table or emit a fatalError() thunk or 
something?

Slava

> 
>       - Doug
> 
>> 
>> Slava
>> 
>>> On Feb 8, 2017, at 9:57 PM, Brent Royal-Gordon via swift-evolution 
>>> <swift-evolution@swift.org> wrote:
>>> 
>>> In an article on `Collection` today*, Ole Begemann points out that 
>>> `index(of:)`, along with other `Equatable`- and `Comparable`-constrained 
>>> `Collection` methods, cannot be overridden. Actually, it *can* be, but only 
>>> through a private mechanism—there's a `_customIndexOfEquatableElement(_:)` 
>>> method that's invisible in the generated interface. But that only proves 
>>> the need for a way to make methods like these overridable.
>>> 
>>> The problem is that the `index(of:)` method should only be offered when the 
>>> element is `Equatable`—otherwise it simply won't work. But there's no way 
>>> to specify this rule in current Swift. In theory, we could describe such a 
>>> requirement with something like this:
>>> 
>>>     func index(of element: Iterator.Element) -> Index? where 
>>> Iterator.Element: Equatable
>>> 
>>> But this is not permitted—you get an error indicating that `where` clauses 
>>> are only allowed on generic methods. Adding a spurious generic parameter 
>>> allows this code to compile, but with a deprecation warning indicating that 
>>> this is deprecated. I don't know if it would actually behave correctly, 
>>> however.
>>> 
>>> Is this a feature we should add? Is this the way to add it? Would it have 
>>> non-additive ABI impact? (The private `index(of:)` override would certainly 
>>> go away, but that's why it's private, I suppose.) I don't seem to remember 
>>> seeing something like this in the generics manifesto, so I thought it was 
>>> worth bringing up.
>>> 
>>> 
>>> 
>>> * https://oleb.net/blog/2017/02/sorted-array/
>>> 
>>> -- 
>>> Brent Royal-Gordon
>>> Architechies
>>> 
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution@swift.org
>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>> 
> 

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

Reply via email to