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

Reply via email to