// RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil -emit-ir %s | %FileCheck %s

// REQUIRES: CPU=i386 || CPU=x86_64
// REQUIRES: objc_interop

import Swift
import Builtin

class X {
  @objc func f() { }
  @objc class func g() { }
  @objc var value : Int { get }
  @objc subscript (i : Int) -> Int { get }
}
sil_vtable X {}

sil @$S14dynamic_lookup1XCfD : $@convention(method) (X) -> ()

// [objc] t.X.f (t.X)() -> ()
sil @$S14dynamic_lookup1XC1fyyFTo : $@convention(objc_method) (X) -> () {
bb0(%0 : $X):
  %3 = tuple ()
  return %3 : $()
}

// [objc] X.g (ObjectiveC.X.Type)() -> ()
sil @$S14dynamic_lookup1XC1gyyFZTo : $@convention(thin) (@thick X.Type) -> () {
bb0(%0 : $@thick X.Type):
  %14 = tuple ()                                  // user: %15
  return %14 : $()
}

sil @$S14dynamic_lookup1XCyS2icigTo : $@convention(objc_method) (Int, X) -> Int {
bb0(%0 : $Int, %1 : $X):
  %4 = function_ref @$SSi33_convertFromBuiltinIntegerLiteralySiBi64_3val_tcSimF : $@convention(thin) (Builtin.Int64, @thin Int.Type) -> Int // user: %7
  %5 = metatype $@thin Int.Type
  %6 = integer_literal $Builtin.Int64, 5
  %7 = apply %4(%6, %5) : $@convention(thin) (Builtin.Int64, @thin Int.Type) -> Int // user: %9
  return %7 : $Int
}

sil @$SSi33_convertFromBuiltinIntegerLiteralySiBi64_3val_tcSimF : $@convention(thin) (Builtin.Int64, @thin Int.Type) -> Int

// [objc] dynamic_lookup.X.value.getter : Swift.Int
sil @$S14dynamic_lookup1XC5valueSivgTo : $@convention(objc_method) (X) -> Int {
bb0(%0 : $X):
  %4 = function_ref @$SSi33_convertFromBuiltinIntegerLiteralySiBi64_3val_tcSimF : $@convention(thin) (Builtin.Int64, @thin Int.Type) -> Int // user: %7
  %5 = metatype $@thin Int.Type
  %6 = integer_literal $Builtin.Int64, 5
  %7 = apply %4(%6, %5) : $@convention(thin) (Builtin.Int64, @thin Int.Type) -> Int // user: %9
  return %7 : $Int
}

// CHECK: define{{( protected)?}} swiftcc void @dynamic_lookup_br(%objc_object*)
sil @dynamic_lookup_br : $@convention(thin) (AnyObject) -> () {
bb0(%0 : $AnyObject):
  %1 = alloc_box $<τ_0_0> { var τ_0_0 } <AnyObject>
  %1a = project_box %1 : $<τ_0_0> { var τ_0_0 } <AnyObject>, 0
  store %0 to %1a : $*AnyObject
  %3 = alloc_box $<τ_0_0> { var τ_0_0 } <Optional<() -> ()>>
  %4 = load %1a : $*AnyObject
  strong_retain %4 : $AnyObject
  %6 = open_existential_ref %4 : $AnyObject to $@opened("01234567-89ab-cdef-0123-000000000000") AnyObject
  %7 = unchecked_ref_cast %6 : $@opened("01234567-89ab-cdef-0123-000000000000") AnyObject to $Builtin.UnknownObject

  // CHECK: [[SEL:%[0-9]+]] = load i8*, i8** @"\01L_selector(f)"
  // CHECK: [[RESPONDS:%[0-9]+]] = load i8*, i8** @"\01L_selector(respondsToSelector:)"
  // CHECK: [[HAS_SEL:%[0-9]]] = call i1 {{.*}}@objc_msgSend {{.*}}(%objc_object* [[OBJECT:%[0-9]+]], i8* [[RESPONDS]], i8* [[SEL]])
  // CHECK: br i1 [[HAS_SEL]]
  dynamic_method_br %7 : $Builtin.UnknownObject, #X.f!1.foreign, bb1, bb2

bb1(%8 : $@convention(objc_method) (Builtin.UnknownObject) -> ()):
  br bb3

bb2:
  br bb3

bb3:
  strong_release %1 : $<τ_0_0> { var τ_0_0 } <AnyObject>
  strong_release %3 : $<τ_0_0> { var τ_0_0 } <Optional<() -> ()>>
  %43 = tuple ()
  return %43 : $()
}

// CHECK: define{{( protected)?}} swiftcc void @dynamic_lookup_static_br(%swift.type*)
sil @dynamic_lookup_static_br : $@convention(thin) (@thick AnyObject.Type) -> () {
bb0(%0 : $@thick AnyObject.Type):
  // CHECK: [[SEL:%[0-9]+]] = load i8*, i8** @"\01L_selector(g)", align {{(4|8)}}
  // CHECK: [[RESPONDS:%[0-9]+]] = load i8*, i8** @"\01L_selector(respondsToSelector:)"
  // CHECK: [[HAS_SEL:%[0-9]]] = call i1 {{.*}}@objc_msgSend {{.*}}(%objc_object* [[OBJECT:%[0-9]+]], i8* [[RESPONDS]], i8* [[SEL]])
  // CHECK: br i1 [[HAS_SEL]]
  %1 = open_existential_metatype %0 : $@thick AnyObject.Type to $@thick (@opened("EF9BE7CA-DFBF-11E4-99CB-28CFE91AF28F") AnyObject).Type
  dynamic_method_br %1 : $@thick (@opened("EF9BE7CA-DFBF-11E4-99CB-28CFE91AF28F") AnyObject).Type, #X.g!1.foreign, bb1, bb2

bb1(%8 : $@convention(objc_method) (@thick (@opened("EF9BE7CA-DFBF-11E4-99CB-28CFE91AF28F") AnyObject).Type) -> ()):
  br bb3

bb2:
  br bb3

bb3:
  %43 = tuple ()
  return %43 : $()
}

sil @_T1t23dynamic_lookup_propertyFT1xPSo13AnyObject__T_ : $@convention(thin) (AnyObject) -> () {
  bb0(%0 : $AnyObject):
  %1 = alloc_box $<τ_0_0> { var τ_0_0 } <AnyObject>
  %1a = project_box %1 : $<τ_0_0> { var τ_0_0 } <AnyObject>, 0
  store %0 to %1a : $*AnyObject
  %6 = load %1a : $*AnyObject                // users: %24, %8, %7
  strong_retain %6 : $AnyObject
  %8 = open_existential_ref %6 : $AnyObject to $@opened("01234567-89ab-cdef-0123-111111111111") AnyObject // users: %11, %9
  %9 = unchecked_ref_cast %8 : $@opened("01234567-89ab-cdef-0123-111111111111") AnyObject to $Builtin.UnknownObject
  dynamic_method_br %9 : $Builtin.UnknownObject, #X.value!getter.1.foreign, bb1, bb2

bb1(%10 : $@convention(objc_method) (Builtin.UnknownObject) -> Int):
  br bb3

bb2:
  br bb3

bb3:
  strong_release %1 : $<τ_0_0> { var τ_0_0 } <AnyObject>
  %43 = tuple ()
  return %43 : $()
}

// CHECK-LABEL: define{{( protected)?}} swiftcc void @_T1t16opt_to_subscriptFT3objPSo13AnyObject_1iSi_T_(%objc_object*, {{(i32|i64)}})
sil @_T1t16opt_to_subscriptFT3objPSo13AnyObject_1iSi_T_ : $@convention(thin) (AnyObject, Int) -> () {
bb0(%0 : $AnyObject, %1 : $Int):
  %2 = alloc_box $<τ_0_0> { var τ_0_0 } <AnyObject>
  %2a = project_box %2 : $<τ_0_0> { var τ_0_0 } <AnyObject>, 0
  %3 = alloc_box $<τ_0_0> { var τ_0_0 } <Int>
  %3a = project_box %3 : $<τ_0_0> { var τ_0_0 } <Int>, 0
  store %0 to %2a : $*AnyObject
  store %1 to %3a : $*Int
  %8 = load %2a : $*AnyObject
  strong_retain %8 : $AnyObject
  %10 = open_existential_ref %8 : $AnyObject to $@opened("01234567-89ab-cdef-0123-111111111111") AnyObject
  %11 = unchecked_ref_cast %10 : $@opened("01234567-89ab-cdef-0123-111111111111") AnyObject to $Builtin.UnknownObject
  // CHECK: [[SEL:%[0-9]+]] = load i8*, i8** @"\01L_selector(objectAtIndexedSubscript:)", align {{(4|8)}}
  // CHECK: [[RESPONDS:%[0-9]+]] = load i8*, i8** @"\01L_selector(respondsToSelector:)"
  // CHECK-NEXT: [[HAS_SEL:%[0-9]]] = call i1 {{.*}}@objc_msgSend {{.*}}(%objc_object* [[OBJECT:%[0-9]+]], i8* [[RESPONDS]], i8* [[SEL]])
  // CHECK-NEXT: br i1 [[HAS_SEL]], label [[HAS_METHOD:%[0-9]+]], label [[HAS_METHOD:%[0-9]+]]

  dynamic_method_br %11 : $Builtin.UnknownObject, #X.subscript!getter.1.foreign, bb1, bb2

bb1(%13 : $@convention(objc_method) (Int, Builtin.UnknownObject) -> Int): // Preds: bb0
  %14 = partial_apply %13(%11) : $@convention(objc_method) (Int, Builtin.UnknownObject) -> Int
  %15 = load %3a : $*Int
  %16 = apply %14(%15) : $@callee_owned Int -> Int
  br bb3

bb2:
  br bb3

bb3:
  strong_release %3 : $<τ_0_0> { var τ_0_0 } <Int>
  strong_release %2 : $<τ_0_0> { var τ_0_0 } <AnyObject>
  %30 = tuple ()
  return %30 : $()
}
