// RUN: %target-typecheck-verify-swift -swift-version 4 // https://github.com/apple/swift/issues/49968 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 { 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: T) { _ = t.foo _ = t.bar } func testExistentialPropertyProtocolClass(_ t: X & Y) { _ = t.foo _ = t.bar } func testGenericPropertySubclassConstrainedProtocol(_ t: T) { _ = t.foo _ = t.bar } func testExistentialPropertySubclassConstrainedProtocol(_ t: Z) { _ = t.foo _ = t.bar } func testExistentialPropertyProtocolGenericClass(_ t: GenericClass & X) { _ = t.foo _ = t.bar } func testExistentialPropertyProtocolGenericClass(_ t: GenericClass & X) { _ = t.foo _ = t.bar } extension X where Self : Y { func testGenericPropertyProtocolClass(_ x: Self) { _ = self.foo _ = self.bar } } extension X where Self : GenericClass { func testGenericPropertyProtocolGenericClass(_ x: Self) { _ = self.foo _ = self.bar } } extension X where Self : GenericClass { func testGenericPropertyProtocolGenericClass(_ x: Self) { _ = self.foo _ = self.bar } }