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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
// RUN: %target-sil-opt -enable-sil-verify-all=true %s | %target-sil-opt -enable-sil-verify-all=true | %FileCheck %s
// REQUIRES: concurrency
import Builtin
import Swift
import _Concurrency
// CHECK: sil @not_async_test : $@convention(thin) () -> () {
sil @not_async_test : $@convention(thin) () -> () {
bb0:
%0 = tuple ()
return %0 : $()
}
// CHECK: sil @not_async_test2 : $@convention(thin) (Builtin.Int32) -> () {
sil @not_async_test2 : $(Builtin.Int32) -> () {
bb0(%int : $Builtin.Int32):
%0 = tuple ()
return %0 : $()
}
// CHECK: sil @async_test : $@convention(thin) @async
sil @async_test : $@async () -> () {
bb0:
%0 = tuple ()
return %0 : $()
}
// CHECK: sil @take_async : $@convention(thin) (@async () -> ()) -> ()
sil @take_async : $(@async () -> ()) -> () {
bb0(%fn : $@async () -> ()):
%0 = tuple ()
return %0 : $()
}
// CHECK: sil @async_continuation : $@convention(thin) @async () -> () {
sil @async_continuation : $@async () -> () {
// CHECK-NEXT: bb
entry:
// CHECK-NEXT: [[CONT:%.*]] = get_async_continuation Builtin.Int32
%c = get_async_continuation Builtin.Int32
// CHECK-NEXT: // function_ref
// CHECK-NEXT: function_ref
%f = function_ref @not_async_test : $@convention(thin) () -> ()
// CHECK-NEXT: apply
apply %f() : $@convention(thin) () -> ()
// CHECK-NEXT: await_async_continuation [[CONT]] : $Builtin.RawUnsafeContinuation, resume [[RESUME:bb[0-9]+]]
await_async_continuation %c : $Builtin.RawUnsafeContinuation, resume bb1
// CHECK-NEXT: {{^ *$}}
// CHECK-NEXT: [[RESUME]]([[RVALUE:%.*]] : $Builtin.Int32):
bb1(%r : $Builtin.Int32):
return undef : $()
}
// CHECK: sil @async_continuation_throws : $@convention(thin) @async () -> () {
sil @async_continuation_throws : $@async () -> () {
// CHECK-NEXT: bb
entry:
// CHECK-NEXT: [[CONT:%.*]] = get_async_continuation [throws] Builtin.Int32
%c = get_async_continuation [throws] Builtin.Int32
// CHECK-NEXT: // function_ref
// CHECK-NEXT: function_ref
%f = function_ref @not_async_test : $@convention(thin) () -> ()
// CHECK-NEXT: apply
apply %f() : $@convention(thin) () -> ()
// CHECK-NEXT: await_async_continuation [[CONT]] : $Builtin.RawUnsafeContinuation, resume [[RESUME:bb[0-9]+]], error [[ERROR:bb[0-9]+]]
await_async_continuation %c : $Builtin.RawUnsafeContinuation, resume bb1, error bb2
// CHECK-NEXT: {{^ *$}}
// CHECK-NEXT: [[RESUME]]([[RVALUE:%.*]] : $Builtin.Int32):
bb1(%r : $Builtin.Int32):
// CHECK-NEXT: br
br bb3
// CHECK-NEXT: {{^ *$}}
// CHECK-NEXT: [[ERROR]]([[EVALUE:%.*]] : $any Error):
bb2(%e : $Error):
// CHECK-NEXT: br
br bb3
bb3:
return undef : $()
}
// CHECK: sil @async_continuation_addr : $@convention(thin) @async () -> () {
sil @async_continuation_addr : $@async () -> () {
// CHECK-NEXT: bb
entry:
// CHECK: [[SLOT:%.*]] = alloc_stack
%a = alloc_stack $Builtin.Int32
// CHECK-NEXT: [[CONT:%.*]] = get_async_continuation_addr Builtin.Int32, [[SLOT]] : $*Builtin.Int32
%c = get_async_continuation_addr Builtin.Int32, %a : $*Builtin.Int32
// CHECK-NEXT: // function_ref
// CHECK-NEXT: function_ref
%f = function_ref @not_async_test : $@convention(thin) () -> ()
// CHECK-NEXT: apply
apply %f() : $@convention(thin) () -> ()
// CHECK-NEXT: await_async_continuation [[CONT]] : $Builtin.RawUnsafeContinuation, resume [[RESUME:bb[0-9]+]]
await_async_continuation %c : $Builtin.RawUnsafeContinuation, resume bb1
// CHECK-NEXT: {{^ *$}}
// CHECK-NEXT: [[RESUME]]:
bb1:
dealloc_stack %a : $*Builtin.Int32
return undef : $()
}
// CHECK: sil @async_continuation_throws_addr : $@convention(thin) @async () -> () {
sil @async_continuation_throws_addr : $@async () -> () {
// CHECK-NEXT: bb
entry:
// CHECK: [[SLOT:%.*]] = alloc_stack
%a = alloc_stack $Builtin.Int32
// CHECK-NEXT: [[CONT:%.*]] = get_async_continuation_addr [throws] Builtin.Int32, [[SLOT]] : $*Builtin.Int32
%c = get_async_continuation_addr [throws] Builtin.Int32, %a : $*Builtin.Int32
// CHECK-NEXT: // function_ref
// CHECK-NEXT: function_ref
%f = function_ref @not_async_test : $@convention(thin) () -> ()
// CHECK-NEXT: apply
apply %f() : $@convention(thin) () -> ()
// CHECK-NEXT: await_async_continuation [[CONT]] : $Builtin.RawUnsafeContinuation, resume [[RESUME:bb[0-9]+]], error [[ERROR:bb[0-9]+]]
await_async_continuation %c : $Builtin.RawUnsafeContinuation, resume bb1, error bb2
// CHECK-NEXT: {{^ *$}}
// CHECK-NEXT: [[RESUME]]:
bb1:
// CHECK-NEXT: dealloc_stack
dealloc_stack %a : $*Builtin.Int32
// CHECK-NEXT: br
br bb3
// CHECK-NEXT: {{^ *$}}
// CHECK-NEXT: [[ERROR]]([[EVALUE:%.*]] : $any Error):
bb2(%e : $Error):
dealloc_stack %a : $*Builtin.Int32
br bb3
bb3:
return undef : $()
}
|