// RUN: %target-swift-frontend -emit-ir -o - -primary-file %s | FileCheck %s
// REQUIRES: CPU=x86_64

sil_stage canonical

import Builtin
import Swift
import SwiftShims

public protocol Kindable {
  var kind: Int { get }
}

extension Int : Kindable {
  public var kind: Int { get }
}

extension Float : Kindable {
  public var kind: Int { get }
}

// CHECK: @_TWPSi21existential_metatypes8KindableS_ = external global i8*, align 8
// CHECK: @_TWPSf21existential_metatypes8KindableS_ = external global i8*, align 8

sil @int_kind_getter : $@convention(method) (Int) -> Int {
bb0(%0 : $Int):
  %2 = integer_literal $Builtin.Int64, 0
  %3 = struct $Int (%2 : $Builtin.Int64)
  return %3 : $Int
}

sil [transparent] [thunk] @int_kind_getter_witness : $@convention(witness_method) (@in_guaranteed Int) -> Int {
bb0(%0 : $*Int):
  %1 = load %0 : $*Int
  %2 = function_ref @int_kind_getter : $@convention(method) (Int) -> Int
  %3 = apply %2(%1) : $@convention(method) (Int) -> Int
  return %3 : $Int
}

sil @float_kind_getter : $@convention(method) (Float) -> Int {
bb0(%0 : $Float):
  %2 = integer_literal $Builtin.Int64, 1
  %3 = struct $Int (%2 : $Builtin.Int64)
  return %3 : $Int
}

sil [transparent] [thunk] @float_kind_getter_witness : $@convention(witness_method) (@in_guaranteed Float) -> Int {
bb0(%0 : $*Float):
  %1 = load %0 : $*Float
  %2 = function_ref @float_kind_getter : $@convention(method) (Float) -> Int
  %3 = apply %2(%1) : $@convention(method) (Float) -> Int
  return %3 : $Int
}

// CHECK: define{{( protected)?}} void @test0()
sil @test0 : $@convention(thin) () -> () {
bb0:
  // CHECK:      [[V:%.*]] = alloca { %swift.type*, i8** }, align 8
  // CHECK-NEXT: bitcast
  // CHECK-NEXT: llvm.lifetime.start
  %0 = alloc_stack $@thick Kindable.Type, var, name "v"
  // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds { %swift.type*, i8** }, { %swift.type*, i8** }* [[V]], i32 0, i32 0
  // CHECK-NEXT: store %swift.type* @_TMSi, %swift.type** [[T0]], align 8
  // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds { %swift.type*, i8** }, { %swift.type*, i8** }* [[V]], i32 0, i32 1
  %1 = metatype $@thin Int.Type
  %2 = metatype $@thick Int.Type
  %3 = init_existential_metatype %2 : $@thick Int.Type, $@thick Kindable.Type
  // CHECK-NEXT: store i8** @_TWPSi21existential_metatypes8KindableS_, i8*** [[T0]], align 8
  store %3 to %0 : $*@thick Kindable.Type
  // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds { %swift.type*, i8** }, { %swift.type*, i8** }* [[V]], i32 0, i32 0
  // CHECK-NEXT: store %swift.type* @_TMSf, %swift.type** [[T0]], align 8
  // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds { %swift.type*, i8** }, { %swift.type*, i8** }* [[V]], i32 0, i32 1
  %5 = metatype $@thin Float.Type
  %6 = metatype $@thick Float.Type
  %7 = init_existential_metatype %6 : $@thick Float.Type, $@thick Kindable.Type
  // CHECK-NEXT: store i8** @_TWPSf21existential_metatypes8KindableS_, i8*** [[T0]], align 8
  store %7 to %0 : $*@thick Kindable.Type
  %9 = tuple ()
  // CHECK-NEXT: bitcast
  // CHECK-NEXT: llvm.lifetime.end
  dealloc_stack %0 : $*@thick Kindable.Type
  // CHECK-NEXT: ret void
  return %9 : $()
}

sil @use : $@convention(thin) (@thick Kindable.Type) -> () {
bb0(%0 : $@thick Kindable.Type):
  %2 = tuple ()
  return %2 : $()
}

// CHECK: define{{( protected)?}} void @test1(i64, i64)
sil @test1 : $@convention(thin) (Optional<Kindable.Type>) -> () {
bb0(%0 : $Optional<Kindable.Type>):
  // CHECK:     [[TYPE:%.*]] = inttoptr i64 %0 to %swift.type*
  // CHECK:     [[WITNESS:%.*]] = inttoptr i64 %1 to i8**
  switch_enum %0 : $Optional<Kindable.Type>, case #Optional.some!enumelt.1: bb1, case #Optional.none!enumelt: bb2

bb1(%3 : $@thick Kindable.Type):
  %5 = function_ref @use : $@convention(thin) (@thick Kindable.Type) -> ()
  %6 = apply %5(%3) : $@convention(thin) (@thick Kindable.Type) -> ()
  br bb3

bb2:
  br bb3

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

sil_witness_table Int: Kindable module existential_metatypes {
  method #Kindable.kind!getter.1: @int_kind_getter_witness
}

sil_witness_table Float: Kindable module existential_metatypes {
  method #Kindable.kind!getter.1: @float_kind_getter_witness
}
