// Failing the test as 'Boolean' to 'Boolean' rename introduced problems
// with converting bool literals to DarwinBoolean

// XFAIL: *

// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -emit-silgen %s -import-objc-header %S/Inputs/BoolBridgingTests.h | %FileCheck %s --check-prefix=CHECK $(test '%target-os' = 'macosx' -o '(' '%target-os' = 'ios' -a '%target-ptrsize' = '32' ')' && echo '--check-prefix=CHECK-OBJCBOOL')

// REQUIRES: objc_interop

import Foundation

// CHECK-LABEL: sil @_TF18objc_bool_bridging13testFunctionsFT_T_
public func testFunctions() {
  // CHECK-NOT: convert
  // CHECK: [[FUNC_1:%.+]] = function_ref @testCBool
  // CHECK-NOT: convert
  // CHECK: = apply [[FUNC_1]]({{%.+}}) : $@convention(c) (Bool) -> Bool
  // CHECK-NOT: convert
  _ = testCBool(true)

  // CHECK-OBJCBOOL: [[FUNC_2:%.+]] = function_ref @testObjCBool
  // CHECK-OBJCBOOL: [[BOOL_TO_OBJCBOOL:%.+]] = function_ref @_TF10ObjectiveC22_convertBoolToObjCBoolFSbVS_8ObjCBool
  // CHECK-OBJCBOOL: [[INPUT_2:%.+]] = apply [[BOOL_TO_OBJCBOOL]]({{%.+}})
  // CHECK-OBJCBOOL: [[RESULT_2:%.+]] = apply [[FUNC_2]]({{%.+}}) : $@convention(c) (ObjCBool) -> ObjCBool
  // CHECK-OBJCBOOL: [[OBJCBOOL_TO_BOOL:%.+]] = function_ref @_TF10ObjectiveC22_convertObjCBoolToBoolFVS_8ObjCBoolSb
  // CHECK-OBJCBOOL: = apply [[OBJCBOOL_TO_BOOL]]([[RESULT_2]])
  _ = testObjCBool(true)

  // CHECK: [[FUNC_3:%.+]] = function_ref @testDarwinBoolean
  // CHECK: [[BOOL_TO_DARWIN:%.+]] = function_ref @_TF6Darwin27_convertBoolToDarwinBooleanFSbVS_13DarwinBoolean
  // CHECK: [[INPUT_3:%.+]] = apply [[BOOL_TO_DARWIN]]({{%.+}})
  // CHECK: [[RESULT_3:%.+]] = apply [[FUNC_3]]({{%.+}}) : $@convention(c) (DarwinBoolean) -> DarwinBoolean
  // CHECK: [[DARWIN_TO_BOOL:%.+]] = function_ref @_TF6Darwin27_convertDarwinBooleanToBoolFVS_13DarwinBooleanSb
  // CHECK: = apply [[DARWIN_TO_BOOL]]([[RESULT_3]])
  _ = testDarwinBoolean(true)
}

// CHECK-LABEL: sil @_TF18objc_bool_bridging11testMethodsFCSo4TestT_
public func testMethods(x: Test) {
  // CHECK-NOT: convert
  // CHECK: [[METHOD_1:%.+]] = objc_method %0 : $Test, #Test.testCBool!1.foreign
  // CHECK-NOT: convert
  // CHECK: = apply [[METHOD_1]]({{%.+}}, %0) : $@convention(objc_method) (Bool, Test) -> Bool
  // CHECK-NOT: convert
  _ = x.testCBool(true)

  // CHECK-OBJCBOOL: [[METHOD_2:%.+]] = objc_method %0 : $Test, #Test.testObjCBool!1.foreign
  // CHECK-OBJCBOOL: [[BOOL_TO_OBJCBOOL:%.+]] = function_ref @_TF10ObjectiveC22_convertBoolToObjCBoolFSbVS_8ObjCBool
  // CHECK-OBJCBOOL: [[INPUT_2:%.+]] = apply [[BOOL_TO_OBJCBOOL]]({{%.+}})
  // CHECK-OBJCBOOL: [[RESULT_2:%.+]] = apply [[METHOD_2]]([[INPUT_2]], %0) : $@convention(objc_method) (ObjCBool, Test) -> ObjCBool
  // CHECK-OBJCBOOL: [[OBJCBOOL_TO_BOOL:%.+]] = function_ref @_TF10ObjectiveC22_convertObjCBoolToBoolFVS_8ObjCBoolSb
  // CHECK-OBJCBOOL: = apply [[OBJCBOOL_TO_BOOL]]([[RESULT_2]])
  _ = x.testObjCBool(true)

  // CHECK: [[METHOD_3:%.+]] = objc_method %0 : $Test, #Test.testDarwinBoolean!1.foreign
  // CHECK: [[BOOL_TO_DARWIN:%.+]] = function_ref @_TF6Darwin27_convertBoolToDarwinBooleanFSbVS_13DarwinBoolean
  // CHECK: [[INPUT_3:%.+]] = apply [[BOOL_TO_DARWIN]]({{%.+}})
  // CHECK: [[RESULT_3:%.+]] = apply [[METHOD_3]]([[INPUT_3]], %0) : $@convention(objc_method) (DarwinBoolean, Test) -> DarwinBoolean
  // CHECK: [[DARWIN_TO_BOOL:%.+]] = function_ref @_TF6Darwin27_convertDarwinBooleanToBoolFVS_13DarwinBooleanSb
  // CHECK: = apply [[DARWIN_TO_BOOL]]([[RESULT_3]])
  _ = x.testDarwinBoolean(true)
}

// CHECK-LABEL: sil @_TF18objc_bool_bridging14testPropertiesFCSo4TestT_
public func testProperties(x: Test) {
  // CHECK-NOT: convert
  // CHECK: [[SETTER_1:%.+]] = objc_method %0 : $Test, #Test.propCBool!setter.1.foreign
  // CHECK-NOT: convert
  // CHECK: apply [[SETTER_1]]({{%.+}}, %0) : $@convention(objc_method) (Bool, Test) -> ()
  x.propCBool = true

  // CHECK-OBJCBOOL: [[SETTER_2:%.+]] = objc_method %0 : $Test, #Test.propObjCBool!setter.1.foreign
  // CHECK-OBJCBOOL: [[BOOL_TO_OBJCBOOL:%.+]] = function_ref @_TF10ObjectiveC22_convertBoolToObjCBoolFSbVS_8ObjCBool
  // CHECK-OBJCBOOL: [[INPUT_2:%.+]] = apply [[BOOL_TO_OBJCBOOL]]({{%.+}})
  // CHECK-OBJCBOOL: apply [[SETTER_2]]([[INPUT_2]], %0) : $@convention(objc_method) (ObjCBool, Test) -> ()
  x.propObjCBool = true

  // CHECK: [[SETTER_3:%.+]] = objc_method %0 : $Test, #Test.propDarwinBoolean!setter.1.foreign
  // CHECK: [[BOOL_TO_DARWIN:%.+]] = function_ref @_TF6Darwin27_convertBoolToDarwinBooleanFSbVS_13DarwinBoolean
  // CHECK: [[INPUT_3:%.+]] = apply [[BOOL_TO_DARWIN]]({{%.+}})
  // CHECK: apply [[SETTER_3]]([[INPUT_3]], %0) : $@convention(objc_method) (DarwinBoolean, Test) -> ()
  x.propDarwinBoolean = true
}

// CHECK-LABEL: sil @_TF18objc_bool_bridging20testFunctionPointersFT_T_
public func testFunctionPointers() {
  // CHECK: = function_ref @_TToFF18objc_bool_bridging20testFunctionPointersFT_T_U_FSbSb : $@convention(c) (Bool) -> Bool
  let x: CBoolFn = { $0 }
  _ = x(true)
  
  // CHECK-OBJCBOOL: = function_ref @_TToFF18objc_bool_bridging20testFunctionPointersFT_T_U0_FV10ObjectiveC8ObjCBoolS1_ : $@convention(c) (ObjCBool) -> ObjCBool
  let y: ObjCBoolFn = { $0 }
  _ = y(true)
  
  // CHECK: = function_ref @_TToFF18objc_bool_bridging20testFunctionPointersFT_T_U1_FV6Darwin13DarwinBooleanS1_ : $@convention(c) (DarwinBoolean) -> DarwinBoolean
  let z: DarwinBooleanFn = { $0 }
  _ = z(true)
}

// CHECK-LABEL: sil shared @_TFF18objc_bool_bridging20testFunctionPointersFT_T_U_FSbSb
// CHECK: return %0 : $Bool

// CHECK-LABEL: sil shared @_TToFF18objc_bool_bridging20testFunctionPointersFT_T_U_FSbSb
// CHECK: [[NATIVE:%.+]] = function_ref @_TFF18objc_bool_bridging20testFunctionPointersFT_T_U_FSbSb
// CHECK: [[RESULT:%.+]] = apply [[NATIVE]](%0) : $@convention(thin) (Bool) -> Bool
// CHECK: return [[RESULT]] : $Bool

// CHECK-OBJCBOOL-LABEL: sil shared @_TFF18objc_bool_bridging20testFunctionPointersFT_T_U0_FV10ObjectiveC8ObjCBoolS1_
// CHECK-OBJCBOOL: return %0 : $ObjCBool

// CHECK-OBJCBOOL-LABEL: sil shared @_TToFF18objc_bool_bridging20testFunctionPointersFT_T_U0_FV10ObjectiveC8ObjCBoolS1_
// CHECK-OBJCBOOL: [[NATIVE:%.+]] = function_ref @_TFF18objc_bool_bridging20testFunctionPointersFT_T_U0_FV10ObjectiveC8ObjCBoolS1_
// CHECK-OBJCBOOL: [[RESULT:%.+]] = apply [[NATIVE]](%0) : $@convention(thin) (ObjCBool) -> ObjCBool
// CHECK-OBJCBOOL: return [[RESULT]] : $ObjCBool

// CHECK-LABEL: sil shared @_TFF18objc_bool_bridging20testFunctionPointersFT_T_U1_FV6Darwin13DarwinBooleanS1_
// CHECK: return %0 : $DarwinBoolean

// CHECK-LABEL: sil shared @_TToFF18objc_bool_bridging20testFunctionPointersFT_T_U1_FV6Darwin13DarwinBooleanS1_
// CHECK: [[NATIVE:%.+]] = function_ref @_TFF18objc_bool_bridging20testFunctionPointersFT_T_U1_FV6Darwin13DarwinBooleanS1_
// CHECK: [[RESULT:%.+]] = apply [[NATIVE]](%0) : $@convention(thin) (DarwinBoolean) -> DarwinBoolean
// CHECK: return [[RESULT]] : $DarwinBoolean

// CHECK-LABEL: sil @_TF18objc_bool_bridging10testBlocksFT_T_
public func testBlocks() {
  // CHECK: = function_ref @_TFF18objc_bool_bridging10testBlocksFT_T_U_FSbSb : $@convention(thin) (Bool) -> Bool
  let x: @convention(block) (Bool) -> Bool = { $0 }
  _ = x(true)
  
  // CHECK-OBJCBOOL: = function_ref @_TFF18objc_bool_bridging10testBlocksFT_T_U0_FV10ObjectiveC8ObjCBoolS1_ : $@convention(thin) (ObjCBool) -> ObjCBool
  let y: @convention(block) (ObjCBool) -> ObjCBool = { $0 }
  _ = y(true)
  
  // CHECK: = function_ref @_TFF18objc_bool_bridging10testBlocksFT_T_U1_FV6Darwin13DarwinBooleanS1_ : $@convention(thin) (DarwinBoolean) -> DarwinBoolean
  let z: @convention(block) (DarwinBoolean) -> DarwinBoolean = { $0 }
  _ = z(true)
}

// CHECK-LABEL: sil @_TF18objc_bool_bridging14testBlockPropsFCSo4TestT_
public func testBlockProps(x: Test) {
  // CHECK: = function_ref @_TFF18objc_bool_bridging14testBlockPropsFCSo4TestT_U_FSbSb : $@convention(thin) (Bool) -> Bool
  // CHECK: [[SETTER_1:%.+]] = objc_method %0 : $Test, #Test.propCBoolBlock!setter.1.foreign
  // CHECK: = apply [[SETTER_1]]({{%.+}}, %0) : $@convention(objc_method) (@convention(block) (Bool) -> Bool, Test) -> ()
  x.propCBoolBlock = { $0 }
  
  // CHECK-OBJCBOOL: = function_ref @_TFF18objc_bool_bridging14testBlockPropsFCSo4TestT_U0_FSbSb : $@convention(thin) (Bool) -> Bool
  // CHECK-OBJCBOOL: [[SETTER_2:%.+]] = objc_method %0 : $Test, #Test.propObjCBoolBlock!setter.1.foreign
  // CHECK-OBJCBOOL: = apply [[SETTER_2]]({{%.+}}, %0) : $@convention(objc_method) (@convention(block) (ObjCBool) -> ObjCBool, Test) -> ()
  x.propObjCBoolBlock = { $0 }
  
  // CHECK: = function_ref @_TFF18objc_bool_bridging14testBlockPropsFCSo4TestT_U1_FSbSb : $@convention(thin) (Bool) -> Bool
  // CHECK: [[SETTER_3:%.+]] = objc_method %0 : $Test, #Test.propDarwinBooleanBlock!setter.1.foreign
  // CHECK: = apply [[SETTER_3]]({{%.+}}, %0) : $@convention(objc_method) (@convention(block) (DarwinBoolean) -> DarwinBoolean, Test) -> ()
  x.propDarwinBooleanBlock = { $0 }
}

// CHECK-LABEL: sil @_TF18objc_bool_bridging26testFunctionPointerMethodsFCSo4TestT_
public func testFunctionPointerMethods(x: Test) {
  // CHECK: [[METHOD_1:%.+]] = objc_method %0 : $Test, #Test.testCBoolFnToBlock!1.foreign
  // CHECK: [[CLOSURE_1:%.+]] = function_ref @_TToFF18objc_bool_bridging26testFunctionPointerMethodsFCSo4TestT_U_FSbSb : $@convention(c) (Bool) -> Bool
  // CHECK: [[RESULT_1:%.+]] = apply [[METHOD_1]]([[CLOSURE_1]], %0)
  // CHECK: function_ref @_TTRXFdCb_dSb_dSb_XFo_dSb_dSb_
  _ = x.testCBoolFnToBlock { $0 }
  
  // CHECK-OBJCBOOL: [[METHOD_2:%.+]] = objc_method %0 : $Test, #Test.testObjCBoolFnToBlock!1.foreign
  // CHECK-OBJCBOOL: [[CLOSURE_2:%.+]] = function_ref @_TToFF18objc_bool_bridging26testFunctionPointerMethodsFCSo4TestT_U0_FV10ObjectiveC8ObjCBoolS2_ : $@convention(c) (ObjCBool) -> ObjCBool
  // CHECK-OBJCBOOL: [[RESULT_2:%.+]] = apply [[METHOD_2]]([[CLOSURE_2]], %0)
  // CHECK-OBJCBOOL: function_ref @_TTRXFdCb_dV10ObjectiveC8ObjCBool_dS0__XFo_dSb_dSb_
  _ = x.testObjCBoolFnToBlock { $0 }

  // CHECK: [[METHOD_3:%.+]] = objc_method %0 : $Test, #Test.testDarwinBooleanFnToBlock!1.foreign
  // CHECK: [[CLOSURE_3:%.+]] = function_ref @_TToFF18objc_bool_bridging26testFunctionPointerMethodsFCSo4TestT_U1_FV6Darwin13DarwinBooleanS2_ : $@convention(c) (DarwinBoolean) -> DarwinBoolean
  // CHECK: [[RESULT_3:%.+]] = apply [[METHOD_3]]([[CLOSURE_3]], %0)
  // CHECK: function_ref @_TTRXFdCb_dV6Darwin13DarwinBoolean_dS0__XFo_dSb_dSb_
  _ = x.testDarwinBooleanFnToBlock { $0 }
}

class NewClass : NSObject {
  // CHECK-LABEL: sil hidden @_TFC18objc_bool_bridging8NewClass12takesClosure
  // CHECK-OBJCBOOL-LABEL: sil hidden [thunk] @_TToFC18objc_bool_bridging8NewClass12takesClosure
  func takesClosure(_: (Bool) -> Bool) {}

  // CHECK-LABEL: sil hidden @_TFC18objc_bool_bridging8NewClass15takesCBoolBlock
  // CHECK-LABEL: sil hidden [thunk] @_TToFC18objc_bool_bridging8NewClass15takesCBoolBlock
  func takesCBoolBlock(_: @convention(block) (Bool) -> Bool) {}

  // CHECK-OBJCBOOL-LABEL: sil hidden @_TFC18objc_bool_bridging8NewClass18takesObjCBoolBlock
  // CHECK-OBJCBOOL-LABEL: sil hidden [thunk] @_TToFC18objc_bool_bridging8NewClass18takesObjCBoolBlock
  func takesObjCBoolBlock(_: @convention(block) (ObjCBool) -> ObjCBool) {}

  // CHECK-LABEL: sil hidden @_TFC18objc_bool_bridging8NewClass23takesDarwinBooleanBlock
  // CHECK-LABEL: sil hidden [thunk] @_TToFC18objc_bool_bridging8NewClass23takesDarwinBooleanBlock
  func takesDarwinBooleanBlock(_: @convention(block) (DarwinBoolean) -> DarwinBoolean) {}
}
