blob: 4006e8811d27381550eb2fe98436e23677d2525a [file] [log] [blame]
// RUN: %target-typecheck-verify-swift -swift-version 4
protocol X {
var foo: Int { get }
var bar: Int { get }
}
class Y {
var foo: Int = 0
}
extension Y {
var bar: Int { return foo }
}
protocol Z : Y {
var foo: Int { get }
var bar: Int { get }
}
class GenericClass<T> {
var foo: T
init(_ foo: T) { self.foo = foo }
}
extension GenericClass {
var bar: T { return foo }
}
// Make sure we keep all of the following cases unambiguous to retain source compatibility with Swift 4.1.
func testGenericPropertyProtocolClass<T : X & Y>(_ t: T) {
_ = t.foo
_ = t.bar
}
func testExistentialPropertyProtocolClass(_ t: X & Y) {
_ = t.foo
_ = t.bar
}
func testGenericPropertySubclassConstrainedProtocol<T : Z>(_ t: T) {
_ = t.foo
_ = t.bar
}
func testExistentialPropertySubclassConstrainedProtocol(_ t: Z) {
_ = t.foo
_ = t.bar
}
func testExistentialPropertyProtocolGenericClass(_ t: GenericClass<Int> & X) {
_ = t.foo
_ = t.bar
}
func testExistentialPropertyProtocolGenericClass(_ t: GenericClass<String> & X) {
_ = t.foo
_ = t.bar
}
extension X where Self : Y {
func testGenericPropertyProtocolClass(_ x: Self) {
_ = self.foo
_ = self.bar
}
}
extension X where Self : GenericClass<Int> {
func testGenericPropertyProtocolGenericClass(_ x: Self) {
_ = self.foo
_ = self.bar
}
}
extension X where Self : GenericClass<String> {
func testGenericPropertyProtocolGenericClass(_ x: Self) {
_ = self.foo
_ = self.bar
}
}