blob: ea7bf2354e0df539ad26a6d167e9f61094071eff [file] [log] [blame]
// RUN: %target-swift-frontend -O -primary-file %s -emit-sil | %FileCheck %s
// Test opened types
protocol P {
func foo()
}
// CHECK-LABEL: sil {{.*}} @{{.*}}test_open_existential
// CHECK: [[E:%[0-9]+]] = open_existential_addr immutable_access %0
// CHECK: [[W:%[0-9]+]] = witness_method $@opened{{.*}} [[E]] {{.*}} // type-defs: [[E]]
// CHECK: apply [[W]]<@opened{{.*}} // type-defs: [[E]]
// CHECK: return
@inline(__always)
func test_open_existential(p: P) {
p.foo()
}
// Check if after inlining (= cloning) everything is still okay.
// CHECK-LABEL: sil {{.*}} @{{.*}}call_open_existential
// CHECK: [[E:%[0-9]+]] = open_existential_addr immutable_access %0
// CHECK: [[W:%[0-9]+]] = witness_method $@opened{{.*}} [[E]] {{.*}} // type-defs: [[E]]
// CHECK: apply [[W]]<@opened{{.*}} // type-defs: [[E]]
// CHECK: return
func call_open_existential(p: P) {
test_open_existential(p: p)
}
// Test dynamic self
func idfunc<T>(_ t: T) -> T {
return t
}
final class X {
// CHECK-LABEL: sil {{.*}} @{{.*}}test_dynself
// CHECK: bb0(%0 : $@thick X.Type):
// CHECK: apply %{{[0-9]+}}<@dynamic_self X>({{.*}} // type-defs: %0
// CHECK: return
@inline(__always)
class func test_dynself() -> Self {
return idfunc(self.init())
}
// Check if after inlining (= cloning) everything is still okay.
// CHECK-LABEL: sil {{.*}} @{{.*}}call_dynself
// CHECK: bb0(%0 : $@thick X.Type):
// CHECK: apply %{{[0-9]+}}<@dynamic_self X>({{.*}} // type-defs: %0
// CHECK: return
class func call_dynself() -> Self {
return test_dynself()
}
required init() { }
}