// RUN: %target-swift-frontend -emit-silgen -enable-sil-ownership %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 @_T018partial_apply_init06class_c1_a1_B0{{[_0-9a-zA-Z]*}}F func class_init_partial_apply(c: C.Type) { // Partial applications at the static metatype use the direct (_TTd) thunk. // CHECK: function_ref @_T018partial_apply_init1CC{{[_0-9a-zA-Z]*}}fCTcTd let xC: (Int) -> C = C.init // CHECK: function_ref @_T018partial_apply_init1CC{{[_0-9a-zA-Z]*}}fCTcTd let requiredC: (Double) -> C = C.init // Partial applications to a dynamic metatype must be dynamically dispatched and use // the normal thunk. // CHECK: function_ref @_T018partial_apply_init1CC{{[_0-9a-zA-Z]*}}fC let requiredM: (Double) -> C = c.init } // CHECK-LABEL: sil shared [thunk] @_T018partial_apply_init1CC{{[_0-9a-zA-Z]*}}fCTcTd // CHECK: function_ref @_T018partial_apply_init1CC{{[_0-9a-zA-Z]*}}fC // CHECK-LABEL: sil shared [thunk] @_T018partial_apply_init1CC{{[_0-9a-zA-Z]*}}fCTcTd // CHECK: function_ref @_T018partial_apply_init1CC{{[_0-9a-zA-Z]*}}fC // CHECK-LABEL: sil shared [thunk] @_T018partial_apply_init1CC{{[_0-9a-zA-Z]*}}fC // CHECK: class_method %0 : $@thick C.Type, #C.init!allocator.1 // CHECK-LABEL: sil hidden @_T018partial_apply_init010archetype_c1_a1_B0{{[_0-9a-zA-Z]*}}F func archetype_init_partial_apply(t: T.Type) { // Archetype initializations are always dynamic, whether applied to the type or a metatype. // CHECK: function_ref @_T018partial_apply_init1CC{{[_0-9a-zA-Z]*}}fC let requiredT: (Double) -> T = T.init // CHECK: function_ref @_T018partial_apply_init1PP{{[_0-9a-zA-Z]*}}fC let protoT: (String) -> T = T.init // CHECK: function_ref @_T018partial_apply_init1PPAAE{{[_0-9a-zA-Z]*}}fC let protoExtT: (Float) -> T = T.init // CHECK: function_ref @_T018partial_apply_init1CC{{[_0-9a-zA-Z]*}}fC let requiredM: (Double) -> T = t.init // CHECK: function_ref @_T018partial_apply_init1PP{{[_0-9a-zA-Z]*}}fC let protoM: (String) -> T = t.init // CHECK: function_ref @_T018partial_apply_init1PPAAE{{[_0-9a-zA-Z]*}}fC let protoExtM: (Float) -> T = t.init } // CHECK-LABEL: sil shared [thunk] @_T018partial_apply_init1PP{{[_0-9a-zA-Z]*}}fC // CHECK: witness_method $Self, #P.init!allocator.1 // CHECK-LABEL: sil shared [thunk] @_T018partial_apply_init1PPAAE{{[_0-9a-zA-Z]*}}fC // CHECK: function_ref @_T018partial_apply_init1PPAAE{{[_0-9a-zA-Z]*}}fC