Evidence in favor of Slava's analysis: if you remove `func f()` from P itself, 
leaving it in the extensions only, then you get "T is Int" from both calls.


> On Dec 8, 2017, at 12:12 PM, Slava Pestov via swift-users 
> <swift-users@swift.org> wrote:
> 
> Hi Jens,
> 
> I think the problem is that overload ranking always prefers a protocol 
> requirement to a protocol extension member, because usually you want the 
> dynamic dispatch through the requirement instead of calling the default 
> implementation. But it appears that this heuristic does not take into account 
> the fact that the protocol extension member could be more constrained than 
> the requirement.
> 
> Please file a bug, but it is unclear what the desired behavior actually is 
> here. Perhaps it should just diagnose an ambiguity.
> 
> Slava
> 
>> On Dec 8, 2017, at 6:25 AM, Jens Persson via swift-users 
>> <swift-users@swift.org> wrote:
>> 
>> Hi all!
>> 
>> Can someone please explain the rationale behind the last line printing
>> "T is unknown"
>> rather than (what I would expect):
>> "T is Int"
>> in the following program?
>> 
>> 
>> protocol P {
>>    associatedtype T
>>    func f() // *
>> }
>> extension P {
>>    func f() { print("T is unknown") }
>> }
>> extension P where T == Int {
>>    func f() { print("T is Int") }
>> }
>> 
>> struct X<T> : P {}
>> 
>> struct Y<U> where U: P, U.T == Int {
>>    // NOTE: The compiler/type-checker knows that U.T == Int here so ...
>>    typealias T = U.T
>>    var a: U
>>    func g() { a.f() } // ... how/why could this print anything but "T is 
>> Int"?
>> }
>> 
>> let x = X<Int>()
>> x.f() // Prints "T is Int", no matter if * is commented out or not.
>> 
>> let y = Y(a: X<Int>())
>> y.g() // Prints "T is unknown" unless * is commented out. Why?
>> 
>> 
>> IMHO this looks like the compiler simply ignores that struct Y<U> has the 
>> constraint  U.T == Int.
>> How else to explain this behavior?
>> /Jens
>> 
>> _______________________________________________
>> swift-users mailing list
>> swift-users@swift.org
>> https://lists.swift.org/mailman/listinfo/swift-users
> 
> _______________________________________________
> swift-users mailing list
> swift-users@swift.org
> https://lists.swift.org/mailman/listinfo/swift-users

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

Reply via email to