| // RUN: %target-swift-frontend -emit-silgen %s | %FileCheck %s |
| |
| class C { |
| init(x: Int) {} |
| |
| required init(required: Double) {} |
| } |
| |
| class D { |
| required init(required: Double) {} |
| } |
| |
| protocol P { |
| init(proto: String) |
| } |
| |
| extension P { |
| init(protoExt: Float) { |
| self.init(proto: "") |
| } |
| } |
| |
| // CHECK-LABEL: sil hidden @_TF18partial_apply_init24class_init_partial_apply |
| func class_init_partial_apply(c: C.Type) { |
| // Partial applications at the static metatype use the direct (_TTd) thunk. |
| // CHECK: function_ref @_TTdFC18partial_apply_init1CC |
| let xC: (Int) -> C = C.init |
| // CHECK: function_ref @_TTdFC18partial_apply_init1CC |
| let requiredC: (Double) -> C = C.init |
| |
| // Partial applications to a dynamic metatype must be dynamically dispatched and use |
| // the normal thunk. |
| // CHECK: function_ref @_TFC18partial_apply_init1CC |
| let requiredM: (Double) -> C = c.init |
| } |
| |
| // CHECK-LABEL: sil shared [thunk] @_TTdFC18partial_apply_init1CC |
| // CHECK: function_ref @_TFC18partial_apply_init1CC |
| // CHECK-LABEL: sil shared [thunk] @_TTdFC18partial_apply_init1CC |
| // CHECK: function_ref @_TFC18partial_apply_init1CC |
| // CHECK-LABEL: sil shared [thunk] @_TFC18partial_apply_init1CC |
| // CHECK: class_method %0 : $@thick C.Type, #C.init!allocator.1 |
| |
| // CHECK-LABEL: sil hidden @_TF18partial_apply_init28archetype_init_partial_apply |
| func archetype_init_partial_apply<T: C where T: P>(t: T.Type) { |
| // Archetype initializations are always dynamic, whether applied to the type or a metatype. |
| // CHECK: function_ref @_TFC18partial_apply_init1CC |
| let requiredT: (Double) -> T = T.init |
| // CHECK: function_ref @_TFP18partial_apply_init1PC |
| let protoT: (String) -> T = T.init |
| // CHECK: function_ref @_TFE18partial_apply_initPS_1PC |
| let protoExtT: (Float) -> T = T.init |
| |
| // CHECK: function_ref @_TFC18partial_apply_init1CC |
| let requiredM: (Double) -> T = t.init |
| // CHECK: function_ref @_TFP18partial_apply_init1PC |
| let protoM: (String) -> T = t.init |
| // CHECK: function_ref @_TFE18partial_apply_initPS_1PC |
| let protoExtM: (Float) -> T = t.init |
| } |
| |
| // CHECK-LABEL: sil shared [thunk] @_TFP18partial_apply_init1PC |
| // CHECK: witness_method $Self, #P.init!allocator.1 |
| // CHECK-LABEL: sil shared [thunk] @_TFE18partial_apply_initPS_1PC |
| // CHECK: function_ref @_TFE18partial_apply_initPS_1PC |
| |