mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
When its operand has coroutine kind `yield_once_2`, a `begin_apply` instruction produces an additional value representing the storage allocated by the callee. This storage must be deallocated by a `dealloc_stack` on every path out of the function. Like any other stack allocation, it must obey stack discipline.
83 lines
1.9 KiB
Plaintext
83 lines
1.9 KiB
Plaintext
// RUN: %target-swift-frontend %s -emit-silgen -verify
|
|
|
|
sil_stage raw
|
|
|
|
import Builtin
|
|
import Swift
|
|
|
|
sil @use_int : $@convention(thin) (Int) -> ()
|
|
sil @use_float : $@convention(thin) (Float) -> ()
|
|
sil @yield_2 : $@yield_once_2 (Int, Float) -> (@yields Int, @yields Float)
|
|
|
|
sil @once_signature : $@yield_once () -> (@yields Int, @yields Float) {
|
|
bb0:
|
|
%0 = tuple ()
|
|
return %0 : $()
|
|
}
|
|
|
|
sil @once_2_signature : $@yield_once_2 () -> (@yields Int, @yields Float) {
|
|
bb0:
|
|
%0 = tuple ()
|
|
return %0 : $()
|
|
}
|
|
|
|
sil @many_signature : $@yield_many () -> (@yields Int, @yields Float) {
|
|
bb0:
|
|
%0 = tuple ()
|
|
return %0 : $()
|
|
}
|
|
|
|
sil [ossa] @yield : $@yield_once (Int, Float) -> (@yields Int, @yields Float) {
|
|
bb0(%0 : $Int, %1 : $Float):
|
|
yield (%0 : $Int, %1 : $Float), resume bb1, unwind bb2
|
|
|
|
bb1:
|
|
%r = tuple ()
|
|
return %r : $()
|
|
|
|
bb2:
|
|
unwind
|
|
}
|
|
|
|
sil [ossa] @yield_many : $@yield_many (Int, Float) -> (@yields Int, @yields Float) {
|
|
bb0(%0 : $Int, %1 : $Float):
|
|
yield (%0 : $Int, %1 : $Float), resume bb1, unwind bb3
|
|
|
|
bb1:
|
|
yield (%0 : $Int, %1 : $Float), resume bb2, unwind bb4
|
|
|
|
bb2:
|
|
%r = tuple ()
|
|
return %r : $()
|
|
|
|
bb3:
|
|
br bb5
|
|
|
|
bb4:
|
|
br bb5
|
|
|
|
bb5:
|
|
unwind
|
|
}
|
|
|
|
sil [ossa] @begin_apply : $(Int, Float) -> () {
|
|
bb0(%0 : $Int, %1 : $Float):
|
|
%coro = function_ref @yield : $@convention(thin) @yield_once (Int, Float) -> (@yields Int, @yields Float)
|
|
(%int, %float, %token) = begin_apply %coro(%0, %1) : $@convention(thin) @yield_once (Int, Float) -> (@yields Int, @yields Float)
|
|
|
|
end_apply %token as $()
|
|
%r = tuple ()
|
|
return %r : $()
|
|
}
|
|
|
|
sil [ossa] @begin_apply_2 : $(Int, Float) -> () {
|
|
bb0(%0 : $Int, %1 : $Float):
|
|
%coro = function_ref @yield_2 : $@convention(thin) @yield_once_2 (Int, Float) -> (@yields Int, @yields Float)
|
|
(%int, %float, %token, %allocation) = begin_apply %coro(%0, %1) : $@convention(thin) @yield_once_2 (Int, Float) -> (@yields Int, @yields Float)
|
|
|
|
end_apply %token as $()
|
|
dealloc_stack %allocation : $*Builtin.SILToken
|
|
%r = tuple ()
|
|
return %r : $()
|
|
}
|