| // 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() |
| } |