Potential bug in protocol extensions

This fragment compiles fine:

protocol P {
    func instanceReq(_ v: String) -> Int
    func instanceReq(_ v: String?) -> Int?
    static func staticReq(_ v: String) -> Int
    static func staticReq(_ v: String?) -> Int?
}

struct S: P {
    func instanceReq(_ v: String) -> Int { 0 }
    func instanceReq(_ v: String?) -> Int? { instanceReq("") }          // ✅
    func instanceNotReq(_ v: String) -> Int { 0 }
    func instanceNotReq(_ v: String?) -> Int? { instanceNotReq("") }    // ✅
    static func staticReq(_ v: String) -> Int { 0 }
    static func staticReq(_ v: String?) -> Int? { staticReq("") }       // ✅
    static func staticNotReq(_ v: String) -> Int { 0 }
    static func staticNotReq(_ v: String?) -> Int? { staticNotReq("") } // ✅
}

it also compiles fine if S is a class or an enum. However it gives an error if it is a protocol extension:

extension P {
    func instanceReq(_ v: String) -> Int { 0 }
    func instanceReq(_ v: String?) -> Int? { instanceReq("") }          // ❌ Ambiguous use
    func instanceNotReq(_ v: String) -> Int { 0 }
    func instanceNotReq(_ v: String?) -> Int? { instanceNotReq("") }    // ❌ Ambiguous use
    static func staticReq(_ v: String) -> Int { 0 }
    static func staticReq(_ v: String?) -> Int? { staticReq("") }       // ✅
    static func staticNotReq(_ v: String) -> Int { 0 }
    static func staticNotReq(_ v: String?) -> Int? { staticNotReq("") } // ✅
}

is this a bug?

1 Like