blob: 4761abd43dd21f914151690abeaac68333056396 [file] [log] [blame]
// RUN: %empty-directory(%t)
// RUN: %build-irgen-test-overlays
// RUN: %target-swift-frontend -sdk %S/Inputs -I %t -emit-ir %s | %FileCheck %s
// REQUIRES: CPU=x86_64
// REQUIRES: objc_interop
sil_stage canonical
import Builtin
import Swift
import gizmo
class X {
}
sil_vtable X {}
sil @_TFC8metatype1Xd : $@convention(method) (@owned X) -> @owned Builtin.NativeObject
sil @_TFC8metatype1XD : $@convention(method) (@owned X) -> ()
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %objc_class* @_TF8metatype22thick_to_objc_metatypeFT2xmMCS_1X_T_(%swift.type*)
sil @_TF8metatype22thick_to_objc_metatypeFT2xmMCS_1X_T_ : $@convention(thin) (@thick X.Type) -> @objc_metatype X.Type {
bb0(%0 : $@thick X.Type):
// CHECK: [[RESULT:%[0-9a-zA-Z_-]+]] = bitcast %swift.type* %0 to %objc_class*
%1 = thick_to_objc_metatype %0 : $@thick X.Type to $@objc_metatype X.Type
// CHECK-NEXT: ret %objc_class* [[RESULT]]
return %1 : $@objc_metatype X.Type
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %objc_class* @foreign_thick_to_objc(%swift.type*)
sil @foreign_thick_to_objc : $@convention(thin) (@thick Gizmo.Type) -> @objc_metatype Gizmo.Type {
bb0(%0 : $@thick Gizmo.Type):
// CHECK: call %objc_class* @swift_getObjCClassFromMetadata
%1 = thick_to_objc_metatype %0 : $@thick Gizmo.Type to $@objc_metatype Gizmo.Type
// CHECK: ret %objc_class*
return %1 : $@objc_metatype Gizmo.Type
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.type* @_TF8metatype22objc_to_thick_metatypeFT2xmMCS_1X_T_(%objc_class*)
sil @_TF8metatype22objc_to_thick_metatypeFT2xmMCS_1X_T_ : $@convention(thin) (@objc_metatype X.Type) -> @thick X.Type {
bb0(%0 : $@objc_metatype X.Type):
// CHECK: [[RESULT:%[0-9a-zA-Z_-]+]] = call %swift.type* @swift_getObjCClassMetadata(%objc_class* %0)
%1 = objc_to_thick_metatype %0 : $@objc_metatype X.Type to $@thick X.Type
// CHECK-NEXT: ret %swift.type* [[RESULT]]
return %1 : $@thick X.Type
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.type* @foreign_objc_to_thick(%objc_class*)
sil @foreign_objc_to_thick : $@convention(thin) (@objc_metatype Gizmo.Type) -> @thick Gizmo.Type {
bb0(%0 : $@objc_metatype Gizmo.Type):
// CHECK: [[RESULT:%[0-9a-zA-Z_-]+]] = call %swift.type* @swift_getObjCClassMetadata(%objc_class* %0)
%1 = objc_to_thick_metatype %0 : $@objc_metatype Gizmo.Type to $@thick Gizmo.Type
// CHECK-NEXT: ret %swift.type* [[RESULT]]
return %1 : $@thick Gizmo.Type
}
protocol CP: class {}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %objc_class* @archetype_objc_metatype(%swift.type* %T, i8** %T.CP)
// CHECK: call %objc_class* @swift_getObjCClassFromMetadata
sil @archetype_objc_metatype : $@convention(thin) <T: CP> () -> @objc_metatype T.Type {
entry:
%m = metatype $@objc_metatype T.Type
return %m : $@objc_metatype T.Type
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %objc_class* @existential_objc_metatype(%objc_object*) {{.*}} {
// CHECK: entry:
// CHECK-NEXT: [[METATYPE:%.*]] = call %objc_class* @swift_getObjCClassFromObject(%objc_object* %0) {{#[0-9]+}}
// CHECK-NEXT: ret %objc_class* [[METATYPE]]
// CHECK-NEXT: }
sil @existential_objc_metatype : $@convention(thin) (AnyObject) -> (@objc_metatype AnyObject.Type) {
bb0(%0 : $AnyObject):
%1 = existential_metatype $@objc_metatype AnyObject.Type, %0 : $AnyObject
return %1 : $@objc_metatype AnyObject.Type
}
public protocol ClassProto : AnyObject {
var other: ClassProto? { get }
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @drop_witness_table(%swift.type*, i8**)
// CHECK: call %objc_class* @swift_getObjCClassFromMetadata(%swift.type* %0)
// CHECK: ret void
sil @drop_witness_table : $@convention(thin) (@thick ClassProto.Type) -> () {
bb0(%0 : $@thick ClassProto.Type):
%1 = thick_to_objc_metatype %0 : $@thick ClassProto.Type to $@objc_metatype ClassProto.Type
%2 = tuple ()
return %2 : $()
}