Files
swift-mirror/test/SIL/Parser/forwarding_ownership.sil
Nate Chandler e5d87f75a8 [SIL] Add source formal type to checked_cast_br.
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.
2023-07-27 15:04:15 -07:00

78 lines
2.2 KiB
Plaintext

// RUN: %target-sil-opt %s | %FileCheck %s
sil_stage canonical
import Builtin
import Swift
class Klass {
}
class SubKlass : Klass {
}
struct NonTrivialStruct {
var id:Klass
}
// CHECK-LABEL: sil [ossa] @unchecked_ref_cast_test :
sil [ossa] @unchecked_ref_cast_test : $@convention(thin) <T> (@in T, @owned Klass) -> () {
bb0(%0 : $*T, %1 : @owned $Klass):
destroy_addr %0 : $*T
// CHECK: unchecked_ref_cast %1 : $Klass to $Optional<Klass>, forwarding: @unowned
%3 = unchecked_ref_cast %1 : $Klass to $Optional<Klass>, forwarding: @unowned
%4 = copy_value %3 : $Optional<Klass>
destroy_value %1 : $Klass
destroy_value %4 : $Optional<Klass>
%8 = tuple ()
return %8 : $()
}
// CHECK-LABEL: } // end sil function 'unchecked_ref_cast_test'
// CHECK-LABEL: sil [ossa] @struct_test :
sil [ossa] @struct_test : $@convention(thin) (@owned Klass) -> () {
bb0(%0 : @owned $Klass):
// CHECK-NOT: forwarding:
%3 = struct $NonTrivialStruct (%0 : $Klass), forwarding: @owned
destroy_value %3 : $NonTrivialStruct
%8 = tuple ()
return %8 : $()
}
// CHECK-LABEL: } // end sil function 'struct_test'
// 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 $Optional<Klass>, #Optional.none
switch_enum %none : $Optional<Klass>, case #Optional.some!enumelt:bb1, case #Optional.none!enumelt:bb2, forwarding: @guaranteed
bb1(%arg : @guaranteed $Klass):
br bb3
bb2:
br bb3
bb3:
%8 = tuple ()
return %8 : $()
}
// 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 : $()
}