blob: 6e8e4197fd61d2de90bfe2dba44736503850be72 [file] [log] [blame]
// RUN: %target-sil-opt -enable-sil-verify-all %s -generic-specializer | %FileCheck %s
// REQUIRES: objc_interop
// This test checks that we properly distinguish in between the specialized
// functions for the @thick, @thin, and @objc_metatype metatypes.
//
// This can occur if we do not properly mangle in the metatype representation
// into the name of functions and thus reuse the incorrect already specialized
// method instead of the new specialized method.
sil_stage canonical
import Builtin
protocol AnyObject {}
sil [noinline] @tmp : $@convention(thin) <T> () -> (@out T) {
bb0(%0 : $*T):
%1 = tuple()
return %1 : $()
}
// CHECK-LABEL: sil @tmp2 : $@convention(thin) () -> () {
// CHECK: [[FUN1:%[0-9]+]] = function_ref @$s3tmp4main9AnyObject_pXmT_Tg5 : $@convention(thin) () -> @thick AnyObject.Type
// CHECK-NEXT: apply [[FUN1]]
// CHECK: [[FUN2:%[0-9]+]] = function_ref @$s3tmp4main9AnyObject_pXmo_Tg5 : $@convention(thin) () -> @objc_metatype AnyObject.Type
// CHECK-NEXT: apply [[FUN2]]
// CHECK: [[FUN3:%[0-9]+]] = function_ref @$s3tmpBi32_XMT_Tg5 : $@convention(thin) () -> @thick Builtin.Int32.Type
// CHECK-NEXT: apply [[FUN3]]
// CHECK: [[FUN4:%[0-9]+]] = function_ref @$s3tmpBi32_XMo_Tg5 : $@convention(thin) () -> @objc_metatype Builtin.Int32.Type
// CHECK-NEXT: apply [[FUN4]]
// CHECK: [[FUN5:%[0-9]+]] = function_ref @$s3tmpBi32_XMt_Tg5 : $@convention(thin) () -> @thin Builtin.Int32.Type
// CHECK-NEXT: apply [[FUN5]]
sil @tmp2 : $@convention(thin) () -> () {
bb0:
%0 = function_ref @tmp : $@convention(thin) <T> () -> (@out T)
%1 = alloc_box $_0_0> { var τ_0_0 } <@thick AnyObject.Type>
%1a = project_box %1 : $_0_0> { var τ_0_0 } <@thick AnyObject.Type>, 0
%2 = alloc_box $_0_0> { var τ_0_0 } <@objc_metatype AnyObject.Type>
%2a = project_box %2 : $_0_0> { var τ_0_0 } <@objc_metatype AnyObject.Type>, 0
%4 = apply %0<@thick AnyObject.Type>(%1a) : $@convention(thin) <T> () -> (@out T)
%5 = apply %0<@objc_metatype AnyObject.Type>(%2a) : $@convention(thin) <T> () -> (@out T)
%6 = alloc_box $_0_0> { var τ_0_0 } <@thick Builtin.Int32.Type>
%6a = project_box %6 : $_0_0> { var τ_0_0 } <@thick Builtin.Int32.Type>, 0
%7 = alloc_box $_0_0> { var τ_0_0 } <@objc_metatype Builtin.Int32.Type>
%7a = project_box %7 : $_0_0> { var τ_0_0 } <@objc_metatype Builtin.Int32.Type>, 0
%8 = alloc_box $_0_0> { var τ_0_0 } <@thin Builtin.Int32.Type>
%8a = project_box %8 : $_0_0> { var τ_0_0 } <@thin Builtin.Int32.Type>, 0
%9 = apply %0<@thick Builtin.Int32.Type>(%6a) : $@convention(thin) <T> () -> (@out T)
%10 = apply %0<@objc_metatype Builtin.Int32.Type>(%7a) : $@convention(thin) <T> () -> (@out T)
%11 = apply %0<@thin Builtin.Int32.Type>(%8a) : $@convention(thin) <T> () -> (@out T)
%9999 = tuple()
return %9999 : $()
}