[swift-dev] Generic protocol conformance bug
Ryan Lovelett
swift-dev at ryan.lovelett.me
Mon May 23 11:30:56 CDT 2016
Ugh. Can you un-send an email. I was wrong. See it happened AGAIN. 😂
On Mon, May 23, 2016, at 12:16 PM, Ryan Lovelett via swift-dev wrote:
> I think I've discovered a few bugs/inconsistencies with generic protocol
> conformance. I'm mostly concerned with if these have been seen/reported
> before. I'm pretty sure they are all bugs but I could be wrong (I've
> been wrong before, it _will_ happen again 😀).
>
> All of the (possible?) bugs can be seen in this Gist [1]. I'll provide
> some commentary on what I think is the bug/inconsistency.
>
> `example_1.swift`: I expected this not to compile. The `Optional`
> extension does not conform to the protocol. It returns a `String` when I
> would have expected the returned type to be _required_ to have been
> `Wrapped` (e.g., `Int`).
>
> `example_2.swift`: I expected this also not compile. The function
> signature is wrong. The protocol requires a function `bar(qux:)` but
> allows the signature `bar(q:)` to conform.
>
> `example_3.swift`: This one is probably the only "correct" one. This one
> fails to compile with the error I would have expected from
> `example_2.swift`.
>
> All of this is from the "Trunk Development (master)" dated May 9th
> currently available on Swift.org [2].
>
> # example_1.swift
>
> public protocol Foo {
> associatedtype Bar = Self
> func bar(qux: String) -> Bar
> }
>
> extension Int: Foo {
> public func bar(qux: String) -> Int {
> return self
> }
> }
>
> extension Optional where Wrapped: Foo, Wrapped == Wrapped.Bar {
> public func bar(qux: String) -> String {
> return #function
> }
> }
>
> let result = 3.bar(qux: "metasyntactic")
> print(result) // 3
>
> let optional = Optional.some(3).bar(qux: "metasyntactic")
> print(optional) // bar(qux:)
>
> # example_2.swift
>
> public protocol Foo {
> associatedtype Bar = Self
> func bar(qux: String) -> Bar
> }
>
> extension Int: Foo {
> public func bar(qux: String) -> Int {
> return self
> }
> }
>
> extension Optional where Wrapped: Foo, Wrapped == Wrapped.Bar {
> public func bar(q: String) -> Wrapped? {
> return self
> }
> }
>
> let result = 3.bar(qux: "metasyntactic")
> print(result) // 3
>
> let optional = Optional.some(3).bar(q: "metasyntactic")
> print(optional) // Optional(3)
>
> # example_3.swift
>
> public protocol Foo {
> associatedtype Bar = Self
> func bar(qux: String) -> Bar
> }
>
> extension Int: Foo {
> public func bar(q: String) -> Int {
> return self
> }
> }
>
> extension Optional where Wrapped: Foo, Wrapped == Wrapped.Bar {
> public func bar(q: String) -> Wrapped? {
> return self
> }
> }
>
> let result = 3.bar(q: "metasyntactic")
> print(result)
>
> let optional = Optional.some(3).bar(q: "metasyntactic")
> print(optional)
>
> [1] https://gist.github.com/RLovelett/8b7c5eb8976554ca359707445a9c86f0
> [2] https://swift.org/download/#snapshots
> _______________________________________________
> swift-dev mailing list
> swift-dev at swift.org
> https://lists.swift.org/mailman/listinfo/swift-dev
More information about the swift-dev
mailing list