blob: 589838bdf29e87813ec210d24c987a4f169962d8 [file] [log] [blame]
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) %s -emit-ir | %FileCheck %s -DINT=i%target-ptrsize
// REQUIRES: objc_interop
sil_stage canonical
import Swift
import Foundation
import objc_generics
// CHECK-LABEL: @"OBJC_METACLASS_$__TtC27objc_generic_class_metadata8Subclass" = hidden global %objc_class
// CHECK: %objc_class* @"OBJC_METACLASS_$_NSObject"
// CHECK: %objc_class* @"OBJC_METACLASS_$_GenericClass"
// CHECK-LABEL: @"$s27objc_generic_class_metadata8SubclassCMf" = internal global
// CHECK: %objc_class* @"OBJC_METACLASS_$__TtC27objc_generic_class_metadata8Subclass"
// CHECK: %objc_class* @"OBJC_CLASS_$_GenericClass"
class Subclass: GenericClass<NSString> {}
sil_vtable Subclass {}
sil @metatype_sink : $@convention(thin) <T> (@thick T.Type) -> ()
sil @objc_class_sink : $@convention(thin) <T: AnyObject> (@objc_metatype T.Type) -> ()
// CHECK-LABEL: define swiftcc void @objc_generic_class_metatypes()
sil @objc_generic_class_metatypes : $@convention(thin) () -> () {
entry:
%z = function_ref @metatype_sink : $@convention(thin) <T> (@thick T.Type) -> ()
%y = function_ref @objc_class_sink : $@convention(thin) <T: AnyObject> (@objc_metatype T.Type) -> ()
// All instances of the generic ObjC class are erased to the same metadata
// at runtime.
// CHECK: [[TMP:%.*]] = call swiftcc %swift.metadata_response @"$sSo12GenericClassCMa"([[INT]] 0)
// CHECK: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[TMP]], 0
%a = metatype $@thick GenericClass<NSString>.Type
// CHECK: call swiftcc void @metatype_sink(%swift.type* [[METADATA]], %swift.type* [[METADATA]])
apply %z<GenericClass<NSString>>(%a) : $@convention(thin) <T> (@thick T.Type) -> ()
// CHECK: call swiftcc void @metatype_sink(%swift.type* [[METADATA]], %swift.type* [[METADATA]])
%b = metatype $@thick GenericClass<NSObject>.Type
apply %z<GenericClass<NSObject>>(%b) : $@convention(thin) <T> (@thick T.Type) -> ()
// CHECK: [[T0:%.*]] = load %objc_class*, %objc_class** @"OBJC_CLASS_REF_$_GenericClass",
// CHECK: [[OBJC_CLASS:%.*]] = call %objc_class* @swift_getInitializedObjCClass(%objc_class* [[T0]])
// CHECK: call swiftcc void @objc_class_sink(%objc_class* [[OBJC_CLASS]], %swift.type* [[METADATA]])
%c = metatype $@objc_metatype GenericClass<NSString>.Type
apply %y<GenericClass<NSString>>(%c) : $@convention(thin) <T: AnyObject> (@objc_metatype T.Type) -> ()
// Check that generic classes are erased at depth.
// CHECK: [[TMP:%.*]] = call swiftcc %swift.metadata_response @"$sSaySo12GenericClassC_SitGMa"([[INT]] 0)
// CHECK: [[TUPLE_METADATA:%.*]] = extractvalue %swift.metadata_response [[TMP]], 0
%d = metatype $@thick Array<(GenericClass<NSString>, Int)>.Type
// CHECK: call swiftcc void @metatype_sink(%swift.type* [[TUPLE_METADATA]], %swift.type* [[TUPLE_METADATA]])
apply %z<Array<(GenericClass<NSString>, Int)>>(%d) : $@convention(thin) <T> (@thick T.Type) -> ()
%e = metatype $@thick Array<(GenericClass<NSObject>, Int)>.Type
// CHECK: call swiftcc void @metatype_sink(%swift.type* [[TUPLE_METADATA]], %swift.type* [[TUPLE_METADATA]])
apply %z<Array<(GenericClass<NSObject>, Int)>>(%e) : $@convention(thin) <T> (@thick T.Type) -> ()
return undef : $()
}
sil @$s27objc_generic_class_metadata8SubclassC5thingACSgSo8NSStringCSg_tcfcTo : $@convention(objc_method) (Optional<NSString>, @owned Subclass) -> @owned Optional<Subclass> {
entry(%0 : $Optional<NSString>, %1 : $Subclass):
unreachable
}
sil @$s27objc_generic_class_metadata8SubclassC13arrayOfThingsACSgSaySo8NSStringCG_tcfcTo : $@convention(objc_method) (NSArray, @owned Subclass) -> @owned Optional<Subclass> {
entry(%0 : $NSArray, %1 : $Subclass):
unreachable
}
sil @$s27objc_generic_class_metadata8SubclassCACycfcTo : $@convention(objc_method) (@owned Subclass) -> @owned Subclass {
entry(%0 : $Subclass):
unreachable
}
sil @$s27objc_generic_class_metadata8SubclassC7optionsACSgSDySo13GenericOptionaypGSg_tcfcTo : $@convention(objc_method) (@owned Subclass, @owned NSDictionary) -> @owned Subclass {
entry(%0 : $Subclass, %1 : $NSDictionary):
unreachable
}
// CHECK-LABEL: define linkonce_odr hidden swiftcc %swift.metadata_response @"$sSo12GenericClassCMa"(
// CHECK: [[T0:%.*]] = load %objc_class*, %objc_class** @"OBJC_CLASS_REF_$_GenericClass",
// CHECK: call %objc_class* @swift_getInitializedObjCClass(%objc_class* [[T0]])
// CHECK-LABEL: define linkonce_odr hidden swiftcc %swift.metadata_response @"$sSaySo12GenericClassC_SitGMa"
// CHECK-SAME: ([[INT]])
// CHECK: [[TMP:%.*]] = call swiftcc %swift.metadata_response @"$sSo12GenericClassC_SitMa"([[INT]] 255)
// CHECK: [[TUPLE:%.*]] = extractvalue %swift.metadata_response [[TMP]], 0
// CHECK: call swiftcc %swift.metadata_response @"$sSaMa"([[INT]] %0, %swift.type* [[TUPLE]])
// CHECK-LABEL: define linkonce_odr hidden swiftcc %swift.metadata_response @"$sSo12GenericClassC_SitMa"
// CHECK-SAME: ([[INT]])
// CHECK: [[TMP:%.*]] = call swiftcc %swift.metadata_response @"$sSo12GenericClassCMa"([[INT]] 255)
// CHECK: [[CLASS:%.*]] = extractvalue %swift.metadata_response [[TMP]], 0
// CHECK: call swiftcc %swift.metadata_response @swift_getTupleTypeMetadata2([[INT]] %0, %swift.type* [[CLASS]], %swift.type* @"$sSiN", i8* null,
class K<T> {}
sil @$useMeta : $@convention(thin) <P> () -> ()
// CHECK-LABEL: define void @an_objc_method(i8*, i8*)
// CHECK: [[C:%.*]] = bitcast i8* %0 to %objc_class*
// CHECK: [[M:%.*]] = call %swift.type* @swift_getObjCClassMetadata(%objc_class* [[C]])
// CHECK: [[M2:%.*]] = bitcast %swift.type* [[M]] to %swift.type**
// CHECK: [[P:%.*]] = getelementptr inbounds %swift.type*, %swift.type** [[M2]]
// CHECK: [[P2:%.*]] = load %swift.type*, %swift.type** [[P]]
// CHECK: call swiftcc void @"$useMeta"(%swift.type* [[P2]])
// CHECK: ret void
sil @an_objc_method : $@convention(objc_method) <P> (@objc_metatype K<P>.Type) -> () {
bb0(%0 : $@objc_metatype K<P>.Type):
%2 = function_ref @$useMeta : $@convention(thin) _0_0> () -> ()
%3 = apply %2<P>() : $@convention(thin) _0_0 > () -> ()
return undef : $()
}