// RUN: %empty-directory(%t)
// RUN: %build-irgen-test-overlays
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) -primary-file %s -emit-ir | %FileCheck --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize %s

// REQUIRES: objc_interop

import Swift
import Foundation

class SwiftClass {}
sil_vtable SwiftClass {}

protocol ClassProto : class {}

// CHECK-LABEL: define hidden swiftcc %TSo8NSObjectC* @checkedClassBoundCast(%swift.type*, %TSo8NSObjectC*, %swift.type* %T) #0 {
// CHECK: [[OBJ:%.+]] = bitcast %TSo8NSObjectC* %1 to i8*
// CHECK: call i8* @llvm.objc.retain(i8* [[OBJ]])
// CHECK: [[OPAQUE_OBJ:%.+]] = bitcast %TSo8NSObjectC* %1 to i8*
// CHECK: [[OPAQUE_CLASS:%.+]] = bitcast %swift.type* %T to i8*
// CHECK: [[OPAQUE_RESULT:%.+]] = call i8* @swift_dynamicCastUnknownClassUnconditional(i8* [[OPAQUE_OBJ]], i8* [[OPAQUE_CLASS]], {{.*}})
// CHECK: [[RESULT:%.+]] = bitcast i8* [[OPAQUE_RESULT]] to %TSo8NSObjectC*
// CHECK: ret %TSo8NSObjectC* [[RESULT]]
// CHECK: {{^}$}}

sil hidden @checkedClassBoundCast : $@convention(thin) <T where T : NSObject> (@thick T.Type, @owned NSObject) -> @owned T {
bb0(%unused : $@thick T.Type, %obj : $NSObject):
  strong_retain %obj : $NSObject
  %result = unconditional_checked_cast %obj : $NSObject to $T
  strong_release %obj : $NSObject
  return %result : $T
}

// rdar://24924966
// CHECK-LABEL: define hidden swiftcc void @metatype_to_objc_class(%swift.type*, %swift.type* %T)
// CHECK:       [[T0:%.*]] = call %objc_object* @swift_dynamicCastMetatypeToObjectUnconditional(%swift.type* %0, {{.*}})
//   TODO: is this really necessary? also, this really shouldn't use a direct reference
// CHECK-NEXT:  [[T1:%.*]] = bitcast %objc_object* [[T0]] to i8*
// CHECK-NEXT:  [[T2a:%.*]] = load %objc_class*, %objc_class** @"OBJC_CLASS_REF_$_Foo"
// CHECK-NEXT:  [[T2:%.*]] = call %objc_class* @swift_getInitializedObjCClass(%objc_class* [[T2a]])
// CHECK-NEXT:  [[T3:%.*]] = bitcast %objc_class* [[T2]] to i8*
// CHECK-NEXT:  call i8* @swift_dynamicCastObjCClassUnconditional(i8* [[T1]], i8* [[T3]], {{.*}})
sil hidden @metatype_to_objc_class : $@convention(thin) <T> (@thick T.Type) -> () {
bb0(%metatype : $@thick T.Type):
  %result = unconditional_checked_cast %metatype : $@thick T.Type to $Foo
  %tuple = tuple ()
  return %tuple : $()
}

// CHECK-LABEL: define hidden swiftcc void @opt_metatype_to_objc_class({{(i32|i64)}}, %swift.type* %T)
// CHECK:       [[ARG:%.*]] = inttoptr {{.*}} %0 to %swift.type*
// CHECK:       [[T0:%.*]] = call %objc_object* @swift_dynamicCastMetatypeToObjectUnconditional(%swift.type* [[ARG]], {{.*}})
//   TODO: is this really necessary? also, this really shouldn't use a direct reference
// CHECK-NEXT:  [[T1:%.*]] = bitcast %objc_object* [[T0]] to i8*
// CHECK-NEXT:  [[T2a:%.*]] = load %objc_class*, %objc_class** @"OBJC_CLASS_REF_$_Foo"
// CHECK-NEXT:  [[T2:%.*]] = call %objc_class* @swift_getInitializedObjCClass(%objc_class* [[T2a]])
// CHECK-NEXT:  [[T3:%.*]] = bitcast %objc_class* [[T2]] to i8*
// CHECK-NEXT:  call i8* @swift_dynamicCastObjCClassUnconditional(i8* [[T1]], i8* [[T3]], {{.*}})
sil hidden @opt_metatype_to_objc_class : $@convention(thin) <T> (Optional<@thick T.Type>) -> () {
bb0(%metatype : $Optional<@thick T.Type>):
  %result = unconditional_checked_cast %metatype : $Optional<@thick T.Type> to $Foo
  %tuple = tuple ()
  return %tuple : $()
}

// CHECK-LABEL: define hidden swiftcc { %objc_object*, i8** } @swift_class_bounded_to_cp
// CHECK-SAME:    ([[SWIFTCLASS:%T10objc_casts10SwiftClassC]]*, %swift.type* %T)
// CHECK:       [[T0:%.*]] = bitcast [[SWIFTCLASS]]* %0 to %swift.type**
// CHECK-NEXT:  [[TYPE:%.*]] = load %swift.type*, %swift.type** [[T0]],
// CHECK-NEXT:  [[T0:%.*]] = bitcast [[SWIFTCLASS]]* %0 to i8*
// CHECK-NEXT:  call { i8*, i8** } @dynamic_cast_existential_1_unconditional(i8* [[T0]], %swift.type* [[TYPE]], {{.*}} @"$s10objc_casts10ClassProtoMp"
sil hidden @swift_class_bounded_to_cp : $@convention(thin) <T: SwiftClass> (@owned T) -> @owned ClassProto {
entry(%a : $T):
  %0 = unconditional_checked_cast %a : $T to $ClassProto
  return %0 : $ClassProto
}

// CHECK-LABEL: define hidden swiftcc { %objc_object*, i8** } @objc_class_bounded_to_cp
// CHECK-SAME:    ([[OBJCCLASS:%TSo8NSObjectC]]*, %swift.type* %T)
// CHECK:       [[T0:%.*]] = bitcast [[OBJCCLASS]]* %0 to %objc_object*
// CHECK-NEXT:  [[TYPE:%.*]] = call %swift.type* @swift_getObjectType(%objc_object* [[T0]])
// CHECK-NEXT:  [[T0:%.*]] = bitcast [[OBJCCLASS]]* %0 to i8*
// CHECK-NEXT:  call { i8*, i8** } @dynamic_cast_existential_1_unconditional(i8* [[T0]], %swift.type* [[TYPE]], {{.*}} @"$s10objc_casts10ClassProtoMp"
sil hidden @objc_class_bounded_to_cp : $@convention(thin) <T: NSObject> (@owned T) -> @owned ClassProto {
entry(%a : $T):
  %0 = unconditional_checked_cast %a : $T to $ClassProto
  return %0 : $ClassProto
}
