@@ -35,6 +35,8 @@ public struct Val<T> : ValProto {
35
35
init()
36
36
}
37
37
38
+ class X {}
39
+
38
40
sil @coerce : $@convention(thin) <T, U, V> (@owned @callee_owned (@owned Ref<T>) -> @owned @callee_owned (@owned Ref<U>) -> @owned Ref<V>) -> @owned @callee_owned (Val<U>) -> Val<V>
39
41
40
42
sil @merge : $@convention(method) <Self where Self : RefProto><U> (@owned Ref<U>, @in_guaranteed Self) -> @owned Ref<(Self.T, U)> {
@@ -131,3 +133,35 @@ bb0(%0 : $Bool):
131
133
%rv = tuple ()
132
134
return %rv : $()
133
135
}
136
+
137
+ // CHECK-LABEL: sil shared [escapes %0 => %r] @$s21arg_escapes_to_return4main1XC_Tg5
138
+ sil [escapes %1 => %0] @arg_escapes_to_return : $@convention(thin) <T> (@in_guaranteed T) -> @out T {
139
+ bb0(%0 : $*T, %1 : $*T):
140
+ copy_addr %1 to [initialization] %0 : $*T
141
+ %4 = tuple ()
142
+ return %4 : $()
143
+ }
144
+
145
+ // CHECK-LABEL: sil shared [escapes %1 => %0] @$s015arg_escapes_to_A04main1XC_Tg5
146
+ sil [escapes %1 => %0] @arg_escapes_to_arg : $@convention(thin) <T> (@inout T, @in_guaranteed T) -> () {
147
+ bb0(%0 : $*T, %1 : $*T):
148
+ copy_addr %1 to %0 : $*T
149
+ %4 = tuple ()
150
+ return %4 : $()
151
+ }
152
+
153
+ sil @test_escape_effects : $@convention(thin) (@guaranteed X) -> @owned X {
154
+ bb0(%0 : $X):
155
+ %2 = alloc_stack $X
156
+ %3 = alloc_stack $X
157
+ store %0 to %3 : $*X
158
+ %5 = function_ref @arg_escapes_to_return : $@convention(thin) <τ_0_0> (@in_guaranteed τ_0_0) -> @out τ_0_0
159
+ %6 = apply %5<X>(%2, %3) : $@convention(thin) <τ_0_0> (@in_guaranteed τ_0_0) -> @out τ_0_0
160
+ %7 = function_ref @arg_escapes_to_arg : $@convention(thin) <τ_0_0> (@inout τ_0_0, @in_guaranteed τ_0_0) -> ()
161
+ %8 = apply %7<X>(%2, %3) : $@convention(thin) <τ_0_0> (@inout τ_0_0, @in_guaranteed τ_0_0) -> ()
162
+ dealloc_stack %3 : $*X
163
+ %10 = load %2 : $*X
164
+ dealloc_stack %2 : $*X
165
+ return %10 : $X
166
+ }
167
+
0 commit comments