1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
// RUN: %target-sil-opt -enable-sil-verify-all -inline %s | %FileCheck %s
// Check if cloning of init_existential_* works correctly with multiple
// conformances.
sil_stage canonical
import Builtin
typealias AnyObject = Builtin.AnyObject
protocol ClassProto1 : class {
}
protocol ClassProto2 : class {
}
class MyClass : ClassProto1, ClassProto2 {
}
protocol Proto1 {
}
protocol Proto2 {
}
class MyClass2 : Proto1, Proto2 {
}
// CHECK-LABEL: sil @test_ref
sil @test_ref : $@convention(thin) (@guaranteed MyClass) -> () {
bb0(%0 : $MyClass):
%6 = init_existential_ref %0 : $MyClass : $MyClass, $ClassProto1 & ClassProto2
%11 = tuple ()
return %11 : $()
}
// CHECK-LABEL: sil @call_test_ref
// CHECK: init_existential_ref
sil @call_test_ref : $@convention(thin) (@guaranteed MyClass) -> () {
bb0(%0 : $MyClass):
%1 = function_ref @test_ref : $@convention(thin) (@guaranteed MyClass) -> ()
%3 = apply %1(%0) : $@convention(thin) (@guaranteed MyClass) -> ()
return %3 : $()
}
// CHECK-LABEL: sil @test_addr
sil @test_addr : $@convention(thin) (@guaranteed MyClass2) -> @out Proto1 & Proto2 {
bb0(%0 : $*Proto1 & Proto2, %1 : $MyClass2):
%3 = init_existential_addr %0 : $*Proto1 & Proto2, $MyClass2
store %1 to %3 : $*MyClass2
%5 = tuple ()
return %5 : $()
}
// CHECK-LABEL: sil @call_test_addr
// CHECK: init_existential_addr
sil @call_test_addr : $@convention(thin) (@guaranteed MyClass2) -> @out Proto1 & Proto2 {
bb0(%0 : $*Proto1 & Proto2, %1 : $MyClass2):
%3 = function_ref @test_addr : $@convention(thin) (@guaranteed MyClass2) -> @out Proto1 & Proto2
%5 = apply %3(%0, %1) : $@convention(thin) (@guaranteed MyClass2) -> @out Proto1 & Proto2
%7 = tuple ()
return %7 : $()
}
|