// 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 : $()
}
