// RUN: %target-swift-emit-silgen %s -verify -swift-version 5 | %FileCheck %s protocol P { var p: P { get set } var q: P? { get set } func p(_: P) func q(_: P) } struct S : P { var p: P var q: P? func p(_: P) {} func q(_: P) {} } class Base : P { var p: P var q: P? func p(_: P) {} func q(_: P) {} init(_ p: P) { self.p = p } } class Derived : Base { } func genericOverload(_: T) {} func genericOverload(_: T?) {} func genericOptional(_: T?) {} func genericNoOptional(_: T) {} // CHECK-LABEL: sil hidden [ossa] @$s7ranking22propertyVersusFunctionyyAA1P_p_xtAaCRzlF func propertyVersusFunction(_ p: P, _ t: T) { // CHECK: witness_method $@opened("{{.*}}") P, #P.p!getter let _ = p.p // CHECK: witness_method $@opened("{{.*}}") P, #P.p!getter let _: P = p.p // CHECK: function_ref @$s7ranking22propertyVersusFunctionyyAA1P_p_xtAaCRzlFyAaC_pcAaC_pcfu_ : $@convention(thin) (@in_guaranteed P) -> @owned @callee_guaranteed (@in_guaranteed P) -> () let _: (P) -> () = p.p // CHECK: witness_method $@opened("{{.*}}") P, #P.p!getter let _: P? = p.p // CHECK: witness_method $@opened("{{.*}}") P, #P.p!getter let _: Any = p.p // CHECK: witness_method $@opened("{{.*}}") P, #P.p!getter let _: Any? = p.p // CHECK: witness_method $@opened("{{.*}}") P, #P.p!getter // CHECK: function_ref @$s7ranking15genericOverloadyyxlF genericOverload(p.p) // CHECK: witness_method $@opened("{{.*}}") P, #P.q!getter // CHECK: function_ref @$s7ranking15genericOverloadyyxSglF genericOverload(p.q) // CHECK: witness_method $@opened("{{.*}}") P, #P.p!getter // CHECK: function_ref @$s7ranking15genericOptionalyyxSglF genericOptional(p.p) // CHECK: witness_method $@opened("{{.*}}") P, #P.q!getter // CHECK: function_ref @$s7ranking15genericOptionalyyxSglF genericOptional(p.q) // CHECK: witness_method $@opened("{{.*}}") P, #P.p!getter // CHECK: function_ref @$s7ranking17genericNoOptionalyyxlF genericNoOptional(p.p) // CHECK: witness_method $@opened("{{.*}}") P, #P.q!getter // CHECK: function_ref @$s7ranking17genericNoOptionalyyxlF genericNoOptional(p.q) // CHECK: witness_method $T, #P.p!getter let _ = t.p // CHECK: witness_method $T, #P.p!getter let _: P = t.p // CHECK: function_ref @$s7ranking22propertyVersusFunctionyyAA1P_p_xtAaCRzlFyAaC_pcxcfu1_ : $@convention(thin) <τ_0_0 where τ_0_0 : P> (@in_guaranteed τ_0_0) -> @owned @callee_guaranteed (@in_guaranteed P) -> () let _: (P) -> () = t.p // CHECK: witness_method $T, #P.p!getter let _: P? = t.p // CHECK: witness_method $T, #P.p!getter let _: Any = t.p // CHECK: witness_method $T, #P.p!getter let _: Any? = t.p // CHECK: witness_method $T, #P.p!getter // CHECK: function_ref @$s7ranking15genericOverloadyyxlF genericOverload(t.p) // CHECK: witness_method $T, #P.q!getter // CHECK: function_ref @$s7ranking15genericOverloadyyxSglF genericOverload(t.q) // CHECK: witness_method $T, #P.p!getter // CHECK: function_ref @$s7ranking15genericOptionalyyxSglF genericOptional(t.p) // CHECK: witness_method $T, #P.q!getter // CHECK: function_ref @$s7ranking15genericOptionalyyxSglF genericOptional(t.q) // CHECK: witness_method $T, #P.p!getter // CHECK: function_ref @$s7ranking17genericNoOptionalyyxlF genericNoOptional(t.p) // CHECK: witness_method $T, #P.q!getter // CHECK: function_ref @$s7ranking17genericNoOptionalyyxlF genericNoOptional(t.q) } extension P { func propertyVersusFunction() { // CHECK: witness_method $Self, #P.p!getter let _ = self.p // CHECK: witness_method $Self, #P.p!getter let _: P = self.p // CHECK: function_ref @$s7ranking1PPAAE22propertyVersusFunctionyyFyAaB_pcxcfu_ : $@convention(thin) <τ_0_0 where τ_0_0 : P> (@in_guaranteed τ_0_0) -> @owned @callee_guaranteed (@in_guaranteed P) -> () let _: (P) -> () = self.p // CHECK: witness_method $Self, #P.p!getter let _: P? = self.p // CHECK: witness_method $Self, #P.p!getter let _: Any = self.p // CHECK: witness_method $Self, #P.p!getter let _: Any? = self.p // CHECK: witness_method $Self, #P.p!getter // CHECK: function_ref @$s7ranking15genericOverloadyyxlF genericOverload(self.p) // CHECK: witness_method $Self, #P.q!getter // CHECK: function_ref @$s7ranking15genericOverloadyyxSglF genericOverload(self.q) // CHECK: witness_method $Self, #P.p!getter // CHECK: function_ref @$s7ranking15genericOptionalyyxSglF genericOptional(self.p) // CHECK: witness_method $Self, #P.q!getter // CHECK: function_ref @$s7ranking15genericOptionalyyxSglF genericOptional(self.q) // CHECK: witness_method $Self, #P.p!getter // CHECK: function_ref @$s7ranking17genericNoOptionalyyxlF genericNoOptional(self.p) // CHECK: witness_method $Self, #P.q!getter // CHECK: function_ref @$s7ranking17genericNoOptionalyyxlF genericNoOptional(self.q) } } //-------------------------------------------------------------------- func f0(_ x: T) {} // FIXME: Lookup breaks if these come after f1! class A { init() {} }; class B : A { override init() { super.init() } } func f1(_ a: A) -> A { return a } func f1(_ b: B) -> B { return b } func testDerived(b: B) { // CHECK-LABEL: sil hidden [ossa] @$s7ranking11testDerived1byAA1BC_tF // CHECK: function_ref @$s7ranking2f1yAA1BCADF // CHECK: function_ref @$s7ranking2f0yyxlF f0(f1(b)) // CHECK: end sil function '$s7ranking11testDerived1byAA1BC_tF' } protocol X { var foo: Int { get } var bar: Int { get } func baz() -> Int subscript(foo: String) -> Int { get } } class Y { var foo: Int = 0 func baz() -> Int { return foo } subscript(foo: String) -> Int { return 0 } } extension Y { var bar: Int { return foo } } protocol Z : Y { var foo: Int { get } var bar: Int { get } func baz() -> Int subscript(foo: String) -> Int { get } } class GenericClass { var foo: T init(_ foo: T) { self.foo = foo } func baz() -> T { return foo } } extension GenericClass { var bar: T { return foo } subscript(foo: String) -> Int { return 0 } } // Make sure we favour the class implementation over the protocol requirement. // CHECK-LABEL: sil hidden [ossa] @$s7ranking32testGenericPropertyProtocolClassyyxAA1YCRbzAA1XRzlF func testGenericPropertyProtocolClass(_ t: T) { _ = t.foo // CHECK: class_method {{%.*}} : $Y, #Y.foo!getter _ = t.bar // CHECK: function_ref @$s7ranking1YC3barSivg _ = t.baz() // CHECK: class_method {{%.*}} : $Y, #Y.baz _ = t[""] // CHECK: class_method {{%.*}} : $Y, #Y.subscript!getter } // CHECK-LABEL: sil hidden [ossa] @$s7ranking36testExistentialPropertyProtocolClassyyAA1X_AA1YCXcF func testExistentialPropertyProtocolClass(_ t: X & Y) { _ = t.foo // CHECK: class_method {{%.*}} : $Y, #Y.foo!getter _ = t.bar // CHECK: function_ref @$s7ranking1YC3barSivg _ = t.baz() // CHECK: class_method {{%.*}} : $Y, #Y.baz _ = t[""] // CHECK: class_method {{%.*}} : $Y, #Y.subscript!getter } // CHECK-LABEL: sil hidden [ossa] @$s7ranking46testGenericPropertySubclassConstrainedProtocolyyxAA1ZRzlF func testGenericPropertySubclassConstrainedProtocol(_ t: T) { _ = t.foo // CHECK: class_method {{%.*}} : $Y, #Y.foo!getter _ = t.bar // CHECK: function_ref @$s7ranking1YC3barSivg _ = t.baz() // CHECK: class_method {{%.*}} : $Y, #Y.baz _ = t[""] // CHECK: class_method {{%.*}} : $Y, #Y.subscript!getter } // CHECK-LABEL: sil hidden [ossa] @$s7ranking50testExistentialPropertySubclassConstrainedProtocolyyAA1Z_pF func testExistentialPropertySubclassConstrainedProtocol(_ t: Z) { _ = t.foo // CHECK: class_method {{%.*}} : $Y, #Y.foo!getter _ = t.bar // CHECK: function_ref @$s7ranking1YC3barSivg _ = t.baz() // CHECK: class_method {{%.*}} : $Y, #Y.baz _ = t[""] // CHECK: class_method {{%.*}} : $Y, #Y.subscript!getter } // CHECK-LABEL: sil hidden [ossa] @$s7ranking43testExistentialPropertyProtocolGenericClassyyAA1X_AA0fG0CySiGXcF func testExistentialPropertyProtocolGenericClass(_ t: GenericClass & X) { _ = t.foo // CHECK: class_method {{%.*}} : $GenericClass, #GenericClass.foo!getter _ = t.bar // CHECK: function_ref @$s7ranking12GenericClassC3barxvg _ = t.baz() // CHECK: class_method {{%.*}} : $GenericClass, #GenericClass.baz _ = t[""] // CHECK: function_ref @$s7ranking12GenericClassCySiSScig } // CHECK-LABEL: sil hidden [ossa] @$s7ranking43testExistentialPropertyProtocolGenericClassyyAA1X_AA0fG0CySSGXcF func testExistentialPropertyProtocolGenericClass(_ t: GenericClass & X) { _ = t.foo // CHECK: class_method {{%.*}} : $GenericClass, #GenericClass.foo!getter _ = t.bar // CHECK: function_ref @$s7ranking12GenericClassC3barxvg _ = t.baz() // CHECK: class_method {{%.*}} : $GenericClass, #GenericClass.baz _ = t[""] // CHECK: function_ref @$s7ranking12GenericClassCySiSScig } extension X where Self : Y { // CHECK-LABEL: sil hidden [ossa] @$s7ranking1XPA2A1YCRbzrlE32testGenericPropertyProtocolClassyyxF func testGenericPropertyProtocolClass(_ x: Self) { _ = self.foo // CHECK: class_method {{%.*}} : $Y, #Y.foo!getter _ = self.bar // CHECK: function_ref @$s7ranking1YC3barSivg _ = self.baz() // CHECK: class_method {{%.*}} : $Y, #Y.baz _ = self[""] // CHECK: class_method {{%.*}} : $Y, #Y.subscript!getter } } extension X where Self : GenericClass { // CHECK-LABEL: sil hidden [ossa] @$s7ranking1XPA2A12GenericClassCySiGRbzrlE04testb16PropertyProtocolbC0yyxF func testGenericPropertyProtocolGenericClass(_ x: Self) { _ = self.foo // CHECK: class_method {{%.*}} : $GenericClass, #GenericClass.foo!getter _ = self.bar // CHECK: function_ref @$s7ranking12GenericClassC3barxvg _ = self.baz() // CHECK: class_method {{%.*}} : $GenericClass, #GenericClass.baz _ = self[""] // CHECK: function_ref @$s7ranking12GenericClassCySiSScig } } extension X where Self : GenericClass { // CHECK-LABEL: sil hidden [ossa] @$s7ranking1XPA2A12GenericClassCySSGRbzrlE04testb16PropertyProtocolbC0yyxF func testGenericPropertyProtocolGenericClass(_ x: Self) { _ = self.foo // CHECK: class_method {{%.*}} : $GenericClass, #GenericClass.foo!getter _ = self.bar // CHECK: function_ref @$s7ranking12GenericClassC3barxvg _ = self.baz() // CHECK: class_method {{%.*}} : $GenericClass, #GenericClass.baz _ = self[""] // CHECK: function_ref @$s7ranking12GenericClassCySiSScig } } //-------------------------------------------------------------------- // Pointer conversions //-------------------------------------------------------------------- struct UnsafePointerStruct { // CHECK-LABEL: sil hidden [ossa] @$s7ranking19UnsafePointerStructVyACSPyxGSgclufC : $@convention(method) (Optional>, @thin UnsafePointerStruct.Type) -> UnsafePointerStruct init(_ from: UnsafePointer) {} init(_ from: UnsafePointer?) { // CHECK: function_ref @$s7ranking19UnsafePointerStructVyACSPyxGclufC : $@convention(method) <τ_0_0> (UnsafePointer<τ_0_0>, @thin UnsafePointerStruct.Type) -> UnsafePointerStruct self.init(from!) } } // CHECK-LABEL: sil hidden [ossa] @$s7ranking22useUnsafePointerStructyySPyxGlF : $@convention(thin) (UnsafePointer) -> () func useUnsafePointerStruct(_ ptr: UnsafePointer) { // CHECK: function_ref @$s7ranking19UnsafePointerStructVyACSPyxGclufC : $@convention(method) <τ_0_0> (UnsafePointer<τ_0_0>, @thin UnsafePointerStruct.Type) -> UnsafePointerStruct let _: UnsafePointerStruct = UnsafePointerStruct(ptr) }