1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
// RUN: %target-swift-frontend -sil-verify-all %s -module-name test -emit-sil -o - -verify | %FileCheck %s --enable-var-scope
// Constructor calls are dispatched dynamically for open classes, even if
// the constructor itself is not "open".
open class OpenClass {
// CHECK-LABEL: sil @$s4test9OpenClassC1xACSi_tcfC
// CHECK: [[M:%[0-9]+]] = class_method %1 : $@thick OpenClass.Type, #OpenClass.init!allocator
// CHECK: apply [[M]]
// CHECK: return
public convenience init(x: Int) {
self.init(x: x, y: 27)
}
public init(x: Int, y: Int) {
}
}
// Static dispatch for not-open class (we are compiling with -wmo).
public class PublicClass {
// CHECK-LABEL: sil @$s4test11PublicClassC1xACSi_tcfC
// CHECK: [[M:%[0-9]+]] = function_ref @$s4test11PublicClassC1x1yACSi_SitcfC
// CHECK: apply [[M]]
// CHECK: return
public convenience init(x: Int) {
self.init(x: x, y: 27)
}
public init(x: Int, y: Int) {
}
}
public protocol Thrower {
func fail() throws
}
@_transparent public func callee<T : Thrower>(_ t: T) throws {
try t.fail()
}
public struct Concrete : Thrower {
public func fail() throws {}
}
// CHECK-LABEL: sil @$s4test6calleryyAA8ConcreteVKF : $@convention(thin) (Concrete) -> @error any Error
public func caller(_ c: Concrete) throws {
// CHECK: [[ARG:%.*]] = struct $Concrete ()
// CHECK: [[FN:%.*]] = function_ref @$s4test8ConcreteV4failyyKF : $@convention(method) (Concrete) -> @error any Error
// CHECK: try_apply [[FN]]([[ARG]]) : $@convention(method) (Concrete) -> @error any Error
try callee(c)
}
public struct File {
var alias: FileHandle = FileHandle()
}
public class FileHandle {
@_borrowed var file: File = File()
}
// CHECK-LABEL: sil @$s4test20access_borrowed_readyAA10FileHandleCADF : $@convention(thin) (@guaranteed FileHandle) -> @owned FileHandle {
public func access_borrowed_read(_ l: FileHandle) -> FileHandle {
// CHECK-NOT: begin_apply
// CHECK: return
return l.file.alias
}
|