// 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 @_T014dynamic_lookup1XCfD : $@convention(method) (X) -> ()

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

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

sil @_T014dynamic_lookup1XCS2icigTo : $@convention(objc_method) (Int, X) -> Int {
bb0(%0 : $Int, %1 : $X):
  %4 = function_ref @_T0Si33_convertFromBuiltinIntegerLiteralSiBi64_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 @_T0Si33_convertFromBuiltinIntegerLiteralSiBi64_3val_tcSimF : $@convention(thin) (Builtin.Int64, @thin Int.Type) -> Int

// [objc] dynamic_lookup.X.value.getter : Swift.Int
sil @_T014dynamic_lookup1XC5valueSivgTo : $@convention(objc_method) (X) -> Int {
bb0(%0 : $X):
  %4 = function_ref @_T0Si33_convertFromBuiltinIntegerLiteralSiBi64_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 : $()
}
