mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
290 lines
11 KiB
Swift
290 lines
11 KiB
Swift
// 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
|
|
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<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
|
|
_ = 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 : Z>(_ 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<Int> & X) {
|
|
_ = t.foo // CHECK: class_method {{%.*}} : $GenericClass<Int>, #GenericClass.foo!getter
|
|
_ = 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
|
|
_ = 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
|
|
_ = 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<Int> {
|
|
// CHECK-LABEL: sil hidden [ossa] @$s7ranking1XPA2A12GenericClassCySiGRbzrlE04testb16PropertyProtocolbC0yyxF
|
|
func testGenericPropertyProtocolGenericClass(_ x: Self) {
|
|
_ = self.foo // CHECK: class_method {{%.*}} : $GenericClass<Int>, #GenericClass.foo!getter
|
|
_ = 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
|
|
_ = 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)
|
|
}
|