blob: d78acc321555717ff9119bf63815f5bb0a0a943a [file] [log] [blame]
// 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>(_: T) {}
func genericOverload<T>(_: T?) {}
func genericOptional<T>(_: T?) {}
func genericNoOptional<T>(_: T) {}
// CHECK-LABEL: sil hidden [ossa] @$s7ranking22propertyVersusFunctionyyAA1P_p_xtAaCRzlF
func propertyVersusFunction<T : P>(_ p: P, _ t: T) {
// CHECK: witness_method $@opened("{{.*}}") P, #P.p!getter.1
let _ = p.p
// CHECK: witness_method $@opened("{{.*}}") P, #P.p!getter.1
let _: P = p.p
// CHECK: function_ref @$s7ranking1PP1pyyAaB_pFTc
let _: (P) -> () = p.p
// CHECK: witness_method $@opened("{{.*}}") P, #P.p!getter.1
let _: P? = p.p
// CHECK: witness_method $@opened("{{.*}}") P, #P.p!getter.1
let _: Any = p.p
// CHECK: witness_method $@opened("{{.*}}") P, #P.p!getter.1
let _: Any? = p.p
// CHECK: witness_method $@opened("{{.*}}") P, #P.p!getter.1
// CHECK: function_ref @$s7ranking15genericOverloadyyxlF
genericOverload(p.p)
// CHECK: witness_method $@opened("{{.*}}") P, #P.q!getter.1
// CHECK: function_ref @$s7ranking15genericOverloadyyxSglF
genericOverload(p.q)
// CHECK: witness_method $@opened("{{.*}}") P, #P.p!getter.1
// CHECK: function_ref @$s7ranking15genericOptionalyyxSglF
genericOptional(p.p)
// CHECK: witness_method $@opened("{{.*}}") P, #P.q!getter.1
// CHECK: function_ref @$s7ranking15genericOptionalyyxSglF
genericOptional(p.q)
// CHECK: witness_method $@opened("{{.*}}") P, #P.p!getter.1
// CHECK: function_ref @$s7ranking17genericNoOptionalyyxlF
genericNoOptional(p.p)
// CHECK: witness_method $@opened("{{.*}}") P, #P.q!getter.1
// CHECK: function_ref @$s7ranking17genericNoOptionalyyxlF
genericNoOptional(p.q)
// CHECK: witness_method $T, #P.p!getter.1
let _ = t.p
// CHECK: witness_method $T, #P.p!getter.1
let _: P = t.p
// CHECK: function_ref @$s7ranking1PP1pyyAaB_pFTc
let _: (P) -> () = t.p
// CHECK: witness_method $T, #P.p!getter.1
let _: P? = t.p
// CHECK: witness_method $T, #P.p!getter.1
let _: Any = t.p
// CHECK: witness_method $T, #P.p!getter.1
let _: Any? = t.p
// CHECK: witness_method $T, #P.p!getter.1
// CHECK: function_ref @$s7ranking15genericOverloadyyxlF
genericOverload(t.p)
// CHECK: witness_method $T, #P.q!getter.1
// CHECK: function_ref @$s7ranking15genericOverloadyyxSglF
genericOverload(t.q)
// CHECK: witness_method $T, #P.p!getter.1
// CHECK: function_ref @$s7ranking15genericOptionalyyxSglF
genericOptional(t.p)
// CHECK: witness_method $T, #P.q!getter.1
// CHECK: function_ref @$s7ranking15genericOptionalyyxSglF
genericOptional(t.q)
// CHECK: witness_method $T, #P.p!getter.1
// CHECK: function_ref @$s7ranking17genericNoOptionalyyxlF
genericNoOptional(t.p)
// CHECK: witness_method $T, #P.q!getter.1
// CHECK: function_ref @$s7ranking17genericNoOptionalyyxlF
genericNoOptional(t.q)
}
extension P {
func propertyVersusFunction() {
// CHECK: witness_method $Self, #P.p!getter.1
let _ = self.p
// CHECK: witness_method $Self, #P.p!getter.1
let _: P = self.p
// CHECK: function_ref @$s7ranking1PP1pyyAaB_pFTc
let _: (P) -> () = self.p
// CHECK: witness_method $Self, #P.p!getter.1
let _: P? = self.p
// CHECK: witness_method $Self, #P.p!getter.1
let _: Any = self.p
// CHECK: witness_method $Self, #P.p!getter.1
let _: Any? = self.p
// CHECK: witness_method $Self, #P.p!getter.1
// CHECK: function_ref @$s7ranking15genericOverloadyyxlF
genericOverload(self.p)
// CHECK: witness_method $Self, #P.q!getter.1
// CHECK: function_ref @$s7ranking15genericOverloadyyxSglF
genericOverload(self.q)
// CHECK: witness_method $Self, #P.p!getter.1
// CHECK: function_ref @$s7ranking15genericOptionalyyxSglF
genericOptional(self.p)
// CHECK: witness_method $Self, #P.q!getter.1
// CHECK: function_ref @$s7ranking15genericOptionalyyxSglF
genericOptional(self.q)
// CHECK: witness_method $Self, #P.p!getter.1
// CHECK: function_ref @$s7ranking17genericNoOptionalyyxlF
genericNoOptional(self.p)
// CHECK: witness_method $Self, #P.q!getter.1
// CHECK: function_ref @$s7ranking17genericNoOptionalyyxlF
genericNoOptional(self.q)
}
}
//--------------------------------------------------------------------
func f0<T>(_ 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<T> {
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 : X & Y>(_ t: T) {
_ = t.foo // CHECK: class_method {{%.*}} : $Y, #Y.foo!getter.1
_ = t.bar // CHECK: function_ref @$s7ranking1YC3barSivg
_ = t.baz() // CHECK: class_method {{%.*}} : $Y, #Y.baz
_ = t[""] // CHECK: class_method {{%.*}} : $Y, #Y.subscript!getter.1
}
// CHECK-LABEL: sil hidden [ossa] @$s7ranking36testExistentialPropertyProtocolClassyyAA1X_AA1YCXcF
func testExistentialPropertyProtocolClass(_ t: X & Y) {
_ = t.foo // CHECK: class_method {{%.*}} : $Y, #Y.foo!getter.1
_ = t.bar // CHECK: function_ref @$s7ranking1YC3barSivg
_ = t.baz() // CHECK: class_method {{%.*}} : $Y, #Y.baz
_ = t[""] // CHECK: class_method {{%.*}} : $Y, #Y.subscript!getter.1
}
// CHECK-LABEL: sil hidden [ossa] @$s7ranking46testGenericPropertySubclassConstrainedProtocolyyxAA1ZRzlF
func testGenericPropertySubclassConstrainedProtocol<T : Z>(_ t: T) {
_ = t.foo // CHECK: class_method {{%.*}} : $Y, #Y.foo!getter.1
_ = t.bar // CHECK: function_ref @$s7ranking1YC3barSivg
_ = t.baz() // CHECK: class_method {{%.*}} : $Y, #Y.baz
_ = t[""] // CHECK: class_method {{%.*}} : $Y, #Y.subscript!getter.1
}
// CHECK-LABEL: sil hidden [ossa] @$s7ranking50testExistentialPropertySubclassConstrainedProtocolyyAA1Z_pF
func testExistentialPropertySubclassConstrainedProtocol(_ t: Z) {
_ = t.foo // CHECK: class_method {{%.*}} : $Y, #Y.foo!getter.1
_ = t.bar // CHECK: function_ref @$s7ranking1YC3barSivg
_ = t.baz() // CHECK: class_method {{%.*}} : $Y, #Y.baz
_ = t[""] // CHECK: class_method {{%.*}} : $Y, #Y.subscript!getter.1
}
// CHECK-LABEL: sil hidden [ossa] @$s7ranking43testExistentialPropertyProtocolGenericClassyyAA1X_AA0fG0CySiGXcF
func testExistentialPropertyProtocolGenericClass(_ t: GenericClass<Int> & X) {
_ = t.foo // CHECK: class_method {{%.*}} : $GenericClass<Int>, #GenericClass.foo!getter.1
_ = t.bar // CHECK: function_ref @$s7ranking12GenericClassC3barxvg
_ = t.baz() // CHECK: class_method {{%.*}} : $GenericClass<Int>, #GenericClass.baz
_ = t[""] // CHECK: function_ref @$s7ranking12GenericClassCySiSScig
}
// CHECK-LABEL: sil hidden [ossa] @$s7ranking43testExistentialPropertyProtocolGenericClassyyAA1X_AA0fG0CySSGXcF
func testExistentialPropertyProtocolGenericClass(_ t: GenericClass<String> & X) {
_ = t.foo // CHECK: class_method {{%.*}} : $GenericClass<String>, #GenericClass.foo!getter.1
_ = t.bar // CHECK: function_ref @$s7ranking12GenericClassC3barxvg
_ = t.baz() // CHECK: class_method {{%.*}} : $GenericClass<String>, #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.1
_ = self.bar // CHECK: function_ref @$s7ranking1YC3barSivg
_ = self.baz() // CHECK: class_method {{%.*}} : $Y, #Y.baz
_ = self[""] // CHECK: class_method {{%.*}} : $Y, #Y.subscript!getter.1
}
}
extension X where Self : GenericClass<Int> {
// CHECK-LABEL: sil hidden [ossa] @$s7ranking1XPA2A12GenericClassCySiGRbzrlE04testb16PropertyProtocolbC0yyxF
func testGenericPropertyProtocolGenericClass(_ x: Self) {
_ = self.foo // CHECK: class_method {{%.*}} : $GenericClass<Int>, #GenericClass.foo!getter.1
_ = self.bar // CHECK: function_ref @$s7ranking12GenericClassC3barxvg
_ = self.baz() // CHECK: class_method {{%.*}} : $GenericClass<Int>, #GenericClass.baz
_ = self[""] // CHECK: function_ref @$s7ranking12GenericClassCySiSScig
}
}
extension X where Self : GenericClass<String> {
// CHECK-LABEL: sil hidden [ossa] @$s7ranking1XPA2A12GenericClassCySSGRbzrlE04testb16PropertyProtocolbC0yyxF
func testGenericPropertyProtocolGenericClass(_ x: Self) {
_ = self.foo // CHECK: class_method {{%.*}} : $GenericClass<String>, #GenericClass.foo!getter.1
_ = self.bar // CHECK: function_ref @$s7ranking12GenericClassC3barxvg
_ = self.baz() // CHECK: class_method {{%.*}} : $GenericClass<String>, #GenericClass.baz
_ = self[""] // CHECK: function_ref @$s7ranking12GenericClassCySiSScig
}
}
//--------------------------------------------------------------------
// Pointer conversions
//--------------------------------------------------------------------
struct UnsafePointerStruct {
// CHECK-LABEL: sil hidden [ossa] @$s7ranking19UnsafePointerStructVyACSPyxGSgclufC : $@convention(method) <U> (Optional<UnsafePointer<U>>, @thin UnsafePointerStruct.Type) -> UnsafePointerStruct
init<U>(_ from: UnsafePointer<U>) {}
init<U>(_ from: UnsafePointer<U>?) {
// 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) <U> (UnsafePointer<U>) -> ()
func useUnsafePointerStruct<U>(_ ptr: UnsafePointer<U>) {
// CHECK: function_ref @$s7ranking19UnsafePointerStructVyACSPyxGclufC : $@convention(method) <τ_0_0> (UnsafePointer<τ_0_0>, @thin UnsafePointerStruct.Type) -> UnsafePointerStruct
let _: UnsafePointerStruct = UnsafePointerStruct(ptr)
}