blob: 66aaf460e4ad8462d6ba7c8f47709616338b1b54 [file] [log] [blame]
// RUN: %target-swift-frontend -emit-silgen %s | FileCheck %s
// RUN: %target-swift-frontend -emit-silgen -suppress-argument-labels-in-types %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