blob: 47a896a9884b886b0f3204d4feab1f42013c9b58 [file] [log] [blame]
// RUN: %target-swift-frontend %s -enable-objc-interop -emit-ir | %FileCheck %s -DINT=i%target-ptrsize -check-prefix CHECK -check-prefix CHECK-%target-import-type
// REQUIRES: CPU=i386 || CPU=x86_64
// TODO: missing `-enable-objc-interop` results in an assertion
import Swift
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @archetype_metatype_cast
// CHECK: %0 = call %swift.type* @swift_dynamicCastMetatype(%swift.type* %T, %swift.type* %U)
// CHECK: %1 = icmp ne %swift.type* %0, null
sil @archetype_metatype_cast : $@convention(thin) <T, U> () -> () {
entry:
%0 = metatype $@thick T.Type
checked_cast_br %0 : $@thick T.Type to $@thick U.Type, yes, no
yes(%1 : $@thick U.Type):
br end
no:
br end
end:
return undef : $()
}
protocol P {}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @existential_archetype_metatype_cast(%swift.type*, i8**, %swift.type* %T)
// CHECK: [[T0:%.*]] = call %swift.type* @swift_dynamicCastMetatype(%swift.type* %0, %swift.type* %T)
// CHECK: [[T1:%.*]] = icmp ne %swift.type* [[T0]], null
sil @existential_archetype_metatype_cast : $@convention(thin) <T> (@thick P.Type) -> () {
entry(%0 : $@thick P.Type):
checked_cast_br %0 : $@thick P.Type to $@thick T.Type, yes, no
yes(%1 : $@thick T.Type):
br end
no:
br end
end:
return undef : $()
}
class SomeClass {}
sil_vtable SomeClass {}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %objc_object* @metatype_object_conversion(%objc_class*) {{.*}} {
// CHECK: %1 = bitcast %objc_class* %0 to %objc_object*
// CHECK: ret %objc_object* %1
// CHECK: }
sil @metatype_object_conversion : $@convention(thin) (@objc_metatype SomeClass.Type) -> @owned AnyObject {
entry(%m : $@objc_metatype SomeClass.Type):
%o = objc_metatype_to_object %m : $@objc_metatype SomeClass.Type to $AnyObject
return %o : $AnyObject
}
protocol SomeClassProtocol : class {}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %objc_object* @existential_metatype_object_conversion(%objc_class*, i8**) {{.*}} {
// CHECK: [[T0:%.*]] = bitcast %objc_class* %0 to %objc_object*
// CHECK: ret %objc_object* [[T0]]
// CHECK: }
sil @existential_metatype_object_conversion : $@convention(thin) (@objc_metatype SomeClassProtocol.Type) -> @owned AnyObject {
entry(%m : $@objc_metatype SomeClassProtocol.Type):
%o = objc_existential_metatype_to_object %m : $@objc_metatype SomeClassProtocol.Type to $AnyObject
return %o : $AnyObject
}
class OtherClass : SomeClass {}
sil_vtable OtherClass {}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @value_metatype_cast(%T14metatype_casts9SomeClassC*)
// CHECK: [[T0:%.*]] = bitcast %T14metatype_casts9SomeClassC* %0 to %swift.type**
// CHECK: [[T1:%.*]] = load %swift.type*, %swift.type** [[T0]]
// CHECK-DIRECT: [[T2:%.*]] = icmp eq %swift.type* [[T1]], {{.*}} @"$s14metatype_casts10OtherClassCMf"
// CHECK-INDIRECT:[[T2:%.*]] = icmp eq %objc_class*
sil @value_metatype_cast : $@convention(thin) (SomeClass) -> () {
entry(%0 : $SomeClass):
%1 = value_metatype $@thick SomeClass.Type, %0 : $SomeClass
checked_cast_br [exact] %1 : $@thick SomeClass.Type to $@thick OtherClass.Type, yes, no
yes(%2 : $@thick OtherClass.Type):
br end
no:
br end
end:
return undef : $()
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.type* @checked_cast_to_anyobject_type
// CHECK: [[T0:%.*]] = bitcast %swift.type* %0 to i8*
// CHECK: [[CAST:%.*]] = call { i8* } @dynamic_cast_existential_0_class_unconditional(i8* [[T0]], %swift.type* %0)
// CHECK: [[RESULT0:%.*]] = extractvalue { i8* } [[CAST]], 0
// CHECK: [[RESULT:%.*]] = bitcast i8* [[RESULT0]] to %swift.type*
// CHECK: ret %swift.type* [[RESULT]]
sil @checked_cast_to_anyobject_type : $@convention(thin) (@thick Any.Type) -> @thick AnyObject.Type {
entry(%0 : $@thick Any.Type):
%2 = unconditional_checked_cast %0 : $@thick Any.Type to $@thick AnyObject.Type
return %2 : $@thick AnyObject.Type
}
// Trivial case -- we know the source is a class metatype, so there's nothing
// to check.
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.type* @checked_cast_class_to_anyobject_type
// CHECK: [[TMP:%.*]] = call swiftcc %swift.metadata_response @"$s14metatype_casts9SomeClassCMa"([[INT]] 0)
// CHECK: [[METATYPE:%.*]] = extractvalue %swift.metadata_response [[TMP]], 0
// CHECK: ret %swift.type* [[METATYPE]]
sil @checked_cast_class_to_anyobject_type : $@convention(thin) () -> @thick AnyObject.Type {
entry:
%1 = metatype $@thick SomeClass.Type
%2 = unconditional_checked_cast %1 : $@thick SomeClass.Type to $@thick AnyObject.Type
return %2 : $@thick AnyObject.Type
}