blob: 52bdff26c062a1b8fd6f5aa27320dd7f9fd80b96 [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,