blob: f9eb8ea82ff80dcb5d8f011ae2e8c861ca150218 [file] [log] [blame]
// 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 : $()
}