blob: c732f2aac5af148f1b08246f7af94df99612239b [file] [log] [blame]
// RUN: %target-swift-frontend -emit-silgen %s | FileCheck %s
protocol Fooable: class {
func foo()
static func bar()
init()
}
class Foo: Fooable {
func foo() { }
// CHECK-LABEL: sil hidden [transparent] [thunk] @_TTWC15witnesses_class3FooS_7FooableS_FS1_3foo
// CHECK-NOT: function_ref
// CHECK: class_method
class func bar() {}
// CHECK-LABEL: sil hidden [transparent] [thunk] @_TTWC15witnesses_class3FooS_7FooableS_ZFS1_3bar
// CHECK-NOT: function_ref
// CHECK: class_method
required init() {}
// CHECK-LABEL: sil hidden [transparent] [thunk] @_TTWC15witnesses_class3FooS_7FooableS_FS1_C
// CHECK-NOT: function_ref
// CHECK: class_method
}
// CHECK-LABEL: sil hidden @_TF15witnesses_class3gen
// CHECK: bb0([[SELF:%.*]] : $T)
// CHECK: [[METHOD:%.*]] = witness_method $T
// CHECK-NOT: strong_retain [[SELF]]
// CHECK: apply [[METHOD]]<T>([[SELF]])
// CHECK: strong_release [[SELF]]
// CHECK-NOT: strong_release [[SELF]]
// CHECK: return
func gen<T: Fooable>(_ foo: T) {
foo.foo()
}
// CHECK-LABEL: sil hidden @_TF15witnesses_class2exFPS_7Fooable_T_
// CHECK: bb0([[SELF:%[0-0]+]] : $Fooable):
// CHECK: [[SELF_PROJ:%.*]] = open_existential_ref [[SELF]]
// CHECK: [[METHOD:%.*]] = witness_method $[[OPENED:@opened(.*) Fooable]],
// CHECK-NOT: strong_retain [[SELF_PROJ]] : $
// CHECK: apply [[METHOD]]<[[OPENED]]>([[SELF_PROJ]])
// CHECK: strong_release [[SELF]]
// CHECK-NOT: strong_release [[SELF]]
// CHECK: return
func ex(_ foo: Fooable) {
foo.foo()
}