-
Notifications
You must be signed in to change notification settings - Fork 10.4k
/
Copy pathaddress_lowering_objc.sil
40 lines (33 loc) · 1.84 KB
/
address_lowering_objc.sil
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
// RUN: %target-sil-opt -address-lowering -enable-sil-opaque-values -emit-sorted-sil -module-name Swift -sil-verify-all %s | %FileCheck %s
// REQUIRES: objc_interop
import Builtin
typealias AnyObject = Builtin.AnyObject
// The module name must be Swift so that declarations like Error are parsed as the correct loadable type.
struct UnownedBox<T : AnyObject> {
unowned var value: T
}
// CHECK-LABEL: sil [ossa] @test_strong_copy_unowned_value : {{.*}} {
// CHECK: bb0([[INSTANCE_ADDR:%[^,]+]] :
// CHECK: [[FIELD_ADDR:%[^,]+]] = struct_element_addr [[INSTANCE_ADDR]]
// CHECK: [[OWNED_VALUE:%[^,]+]] = load_unowned [[FIELD_ADDR]]
// CHECK: return [[OWNED_VALUE]]
// CHECK-LABEL: } // end sil function 'test_strong_copy_unowned_value'
sil [ossa] @test_strong_copy_unowned_value : $@convention(thin) <T where T : AnyObject> (@in_guaranteed UnownedBox<T>) -> @owned T {
bb0(%instance : @guaranteed $UnownedBox<T>):
%unowned_value = struct_extract %instance : $UnownedBox<T>, #UnownedBox.value
%owned_value = strong_copy_unowned_value %unowned_value : $@sil_unowned T
return %owned_value : $T
}
// CHECK-LABEL: sil [ossa] @test_unowned_copy_value : {{.*}} {
// CHECK: bb0([[INSTANCE_OUT:%[^,]+]] : {{.*}}, [[OWNED_VALUE:%[^,]+]] :
// CHECK: [[FIELD_ADDR:%[^,]+]] = struct_element_addr [[INSTANCE_OUT]]
// CHECK: store_unowned [[OWNED_VALUE]] to [init] [[FIELD_ADDR]]
// CHECK: destroy_value [[OWNED_VALUE]]
// CHECK-LABEL: } // end sil function 'test_unowned_copy_value'
sil [ossa] @test_unowned_copy_value : $@convention(thin) <T where T : AnyObject> (@owned T) -> @out UnownedBox<T> {
bb0(%owned_value : @owned $T):
%unowned_value = unowned_copy_value %owned_value : $T
destroy_value %owned_value : $T
%instance = struct $UnownedBox<T> (%unowned_value : $@sil_unowned T)
return %instance : $UnownedBox<T>
}