mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
It is necessary for opaque values where for casts that will newly start out as checked_cast_brs and be lowered to checked_cast_addr_brs, since the latter has the source formal type, IRGen relies on being able to access it, and there's no way in general to obtain the source formal type from the source lowered type.
62 lines
1.7 KiB
Plaintext
62 lines
1.7 KiB
Plaintext
// First parse this and then emit a *.sib. Then read in the *.sib, then recreate
|
|
// RUN: %empty-directory(%t)
|
|
// RUN: %target-sil-opt %s -emit-sib -o %t/tmp.sib -module-name temp
|
|
// RUN: %target-sil-opt %t/tmp.sib -o %t/tmp.2.sib -module-name temp
|
|
// RUN: %target-sil-opt %t/tmp.2.sib -module-name temp | %FileCheck %s
|
|
|
|
import Builtin
|
|
|
|
enum FakeOptional<T> {
|
|
case none
|
|
case some(T)
|
|
}
|
|
|
|
class Klass {
|
|
}
|
|
class SubKlass : Klass {
|
|
}
|
|
|
|
// Test checked_cast_br ownership forwarding.
|
|
//
|
|
// Also test unchecked_ownership_conversion @none serialization (@none
|
|
// is the highest value ownership encoding).
|
|
//
|
|
// CHECK-LABEL: sil [ossa] @checked_cast_test : $@convention(thin) (@owned Klass) -> () {
|
|
// CHECK: checked_cast_br {{.*}}, forwarding: @guaranteed
|
|
// CHECK-LABEL: } // end sil function 'checked_cast_test'
|
|
sil [ossa] @checked_cast_test : $@convention(thin) (@owned Klass) -> () {
|
|
bb0(%0 : @owned $Klass):
|
|
%trivial = unchecked_ownership_conversion %0 : $Klass, @owned to @none
|
|
checked_cast_br Klass in %trivial : $Klass to SubKlass, bb1, bb2, forwarding: @guaranteed
|
|
|
|
bb1(%arg1 : @guaranteed $SubKlass):
|
|
br bb3
|
|
|
|
bb2(%arg2: @guaranteed $Klass):
|
|
br bb3
|
|
|
|
bb3:
|
|
destroy_value %0 : $Klass
|
|
%8 = tuple ()
|
|
return %8 : $()
|
|
}
|
|
|
|
// CHECK-LABEL: sil [ossa] @switch_test : $@convention(thin) () -> () {
|
|
// CHECK: switch_enum {{.*}}, forwarding: @guaranteed
|
|
// CHECK-LABEL: } // end sil function 'switch_test'
|
|
sil [ossa] @switch_test : $@convention(thin) () -> () {
|
|
%none = enum $FakeOptional<Klass>, #FakeOptional.none
|
|
switch_enum %none : $FakeOptional<Klass>, case #FakeOptional.some!enumelt:bb1, case #FakeOptional.none!enumelt:bb2, forwarding: @guaranteed
|
|
|
|
bb1(%arg : @guaranteed $Klass):
|
|
br bb3
|
|
|
|
bb2:
|
|
br bb3
|
|
|
|
bb3:
|
|
%8 = tuple ()
|
|
return %8 : $()
|
|
}
|
|
|