@@ -4,6 +4,12 @@ import Builtin
4
4
5
5
typealias AnyObject = Builtin.AnyObject
6
6
7
+ class C {}
8
+ class D : C {}
9
+
10
+ sil @getD : $() -> (@owned D)
11
+ sil @takeC : $(@owned C) -> ()
12
+
7
13
struct Unmanaged<Instance> where Instance : AnyObject {
8
14
unowned(unsafe) var _value: @sil_unmanaged Instance
9
15
}
@@ -57,3 +63,37 @@ bb0(%instance : @guaranteed $Instance):
57
63
%retval = struct $Unmanaged<Instance> (%unmanaged : $@sil_unmanaged Instance)
58
64
return %retval : $Unmanaged<Instance>
59
65
}
66
+
67
+ // CHECK-LABEL: begin running test {{.*}} on dont_rewrite_inner_forwarding_user: canonicalize-borrow-scope
68
+ // CHECK-LABEL: sil [ossa] @dont_rewrite_inner_forwarding_user : {{.*}} {
69
+ // CHECK: [[GET_C:%[^,]+]] = function_ref @getD
70
+ // CHECK: [[TAKE_C:%[^,]+]] = function_ref @takeC
71
+ // CHECK: [[C:%[^,]+]] = apply [[GET_C]]()
72
+ // CHECK: [[OUTER_COPY:%[^,]+]] = copy_value [[C]]
73
+ // CHECK: [[OUTER_UPCAST:%[^,]+]] = upcast [[OUTER_COPY]]
74
+ // CHECK: [[B:%[^,]+]] = begin_borrow [[C]]
75
+ // CHECK: [[DEAD_INNER_COPY:%[^,]+]] = copy_value [[B]]
76
+ // CHECK: destroy_value [[DEAD_INNER_COPY]]
77
+ // CHECK: [[U:%[^,]+]] = upcast [[B]]
78
+ // CHECK: [[C1:%[^,]+]] = copy_value [[U]]
79
+ // CHECK: apply [[TAKE_C]]([[C1]])
80
+ // CHECK: end_borrow [[B]]
81
+ // CHECK: destroy_value [[C]]
82
+ // CHECK: return [[OUTER_UPCAST]]
83
+ // CHECK-LABEL: } // end sil function 'dont_rewrite_inner_forwarding_user'
84
+ // CHECK-LABEL: end running test {{.*}} on dont_rewrite_inner_forwarding_user: canonicalize-borrow-scope
85
+ sil [ossa] @dont_rewrite_inner_forwarding_user : $@convention(thin) () -> (@owned C) {
86
+ %getD = function_ref @getD : $@convention(thin) () -> (@owned D)
87
+ %takeC = function_ref @takeC : $@convention(thin) (@owned C) -> ()
88
+ %d = apply %getD() : $@convention(thin) () -> (@owned D)
89
+ test_specification "canonicalize-borrow-scope @instruction"
90
+ %b = begin_borrow %d : $D
91
+ %c2 = copy_value %b : $D
92
+ %u2 = upcast %c2 : $D to $C
93
+ %c1 = copy_value %b : $D
94
+ %u1 = upcast %c1 : $D to $C
95
+ apply %takeC(%u1) : $@convention(thin) (@owned C) -> ()
96
+ end_borrow %b : $D
97
+ destroy_value %d : $D
98
+ return %u2 : $C
99
+ }
0 commit comments