mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
I am doing this separately from the actual change to eliminate the option to make it easier to review.
67 lines
1.7 KiB
Plaintext
67 lines
1.7 KiB
Plaintext
// 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 : $()
|
|
}
|
|
|