@@ -38,24 +38,26 @@ public var irm: Int {
38
38
modify {
39
39
yield & _i
40
40
}
41
- // CHECK-LABEL: sil {{.*}}[ossa] @$s19coroutine_accessors1SV3irmSivg :
42
- // CHECK-SAME: $@convention(method)
41
+ // CHECK-LABEL: sil{{.*}} [ossa] @$s19coroutine_accessors1SV3irmSivr :
42
+ // CHECK-SAME: $@yield_once
43
+ // CHECK-SAME: @convention(method)
43
44
// CHECK-SAME: (@guaranteed S)
44
45
// CHECK-SAME: ->
45
- // CHECK-SAME: Int
46
+ // CHECK-SAME: @yields Int
46
47
// CHECK-SAME: {
47
48
// CHECK: bb0(
48
- // CHECK-SAME: [[SELF:%[^,]+]] :
49
- // CHECK-SAME: ):
50
- // CHECK: [[READ_ACCESSOR:%[^,]+]] = function_ref @$s19coroutine_accessors1SV3irmSivy
51
- // CHECK: ([[VALUE:%[^,]+]],
52
- // CHECK-SAME: [[TOKEN:%[^,]+]],
53
- // CHECK-SAME: [[ALLOCATION:%[^)]+]])
54
- // CHECK-SAME: = begin_apply [[READ_ACCESSOR]]([[SELF]])
49
+ // CHECK: [[SELF:%[^,]+]] :
50
+ // CHECK: ):
51
+ // CHECK: [[READER2:%[^,]+]] = function_ref @$s19coroutine_accessors1SV3irmSivy
52
+ // CHECK: ([[VALUE_ADDRESS:%[^,]+]], [[TOKEN:%[^,]+]], [[ALLOCATION:%[^,]+]]) = begin_apply [[READER2]]([[SELF]])
55
53
// CHECK: end_apply [[TOKEN]]
56
- // CHECK: dealloc_stack [[ALLOCATION]]
57
- // CHECK: return [[VALUE:%[^,]+]]
58
- // CHECK-LABEL: } // end sil function '$s19coroutine_accessors1SV3irmSivg'
54
+ // CHECK: yield [[VALUE_ADDRESS]] : $Int, resume bb1, unwind bb2
55
+ // CHECK: bb1:
56
+ // CHECK: dealloc_stack [[ALLOCATION]] : $*Builtin.SILToken
57
+ // CHECK: bb2:
58
+ // CHECK: dealloc_stack [[ALLOCATION]] : $*Builtin.SILToken
59
+ // CHECK: unwind
60
+ // CHECK-LABEL: } // end sil function '$s19coroutine_accessors1SV3irmSivr'
59
61
60
62
// CHECK-LABEL: sil {{.*}}[ossa] @$s19coroutine_accessors1SV3irmSivs :
61
63
// CHECK-SAME: $@convention(method)
@@ -95,12 +97,14 @@ public var irm: Int {
95
97
// CHECK-SAME: [[TOKEN:%[^,]+]],
96
98
// CHECK-SAME: [[ALLOCATION:%[^)]+]])
97
99
// CHECK-SAME: = begin_apply [[MODIFY_ACCESSOR]]([[SELF_ACCESS]])
98
- // CHECK: yield [[VALUE_ADDRESS:%[^,]+]] : $*Int, resume bb1, unwind bb2
99
- // CHECK: bb1:
100
+ // CHECK: yield [[VALUE_ADDRESS]]
101
+ // CHECK-SAME: resume [[RESUME_BB:bb[0-9]+]]
102
+ // CHECK-SAME: unwind [[UNWIND_BB:bb[0-9]+]]
103
+ // CHECK: [[RESUME_BB]]:
100
104
// CHECK: end_apply [[TOKEN]]
101
105
// CHECK: end_access [[SELF_ACCESS]]
102
106
// CHECK: dealloc_stack [[ALLOCATION]]
103
- // CHECK: bb2 :
107
+ // CHECK: [[UNWIND_BB]] :
104
108
// CHECK: end_apply [[TOKEN]]
105
109
// CHECK: dealloc_stack [[ALLOCATION]]
106
110
// CHECK: end_access [[SELF_ACCESS]]
@@ -123,7 +127,7 @@ public var irm: Int {
123
127
// CHECK: store [[NEW_VALUE:%[^,]+]] to [trivial] [[NEW_VALUE_ADDR]]
124
128
// CHECK: [[SELF_ACCESS:%[^,]+]] = begin_access [modify] [unknown] [[SELF]]
125
129
// CHECK: [[MODIFY_ACCESSOR:%[^,]+]] = function_ref @$s19coroutine_accessors1SV3irmSivx
126
- // CHECK: ([[VALUE_ADDR:%[^,]+]],
130
+ // CHECK: ([[VALUE_ADDR:%[^,]+]],
127
131
// CHECK-SAME: [[TOKEN:%[^,]+]],
128
132
// CHECK-SAME: [[ALLOCATION:%[^)]+]])
129
133
// CHECK-SAME: = begin_apply [[MODIFY_ACCESSOR]]([[SELF_ACCESS]])
@@ -164,3 +168,65 @@ func update<T : Equatable>(at location: inout T, to newValue: T) throws -> T {
164
168
location = newValue
165
169
return oldValue
166
170
}
171
+
172
+ protocol ReadableTitle {
173
+ var title : String { read }
174
+ }
175
+ class OverridableGetter : ReadableTitle {
176
+ var title : String = " "
177
+ }
178
+ // The read witness thunk does a direct call to the concrete read accessor.
179
+ // CHECK-LABEL: sil private [transparent] [thunk] [ossa] @$s19coroutine_accessors17OverridableGetterCAA13ReadableTitleA2aDP5titleSSvrTW
180
+ // CHECK: function_ref @$s19coroutine_accessors17OverridableGetterC5titleSSvr
181
+ // CHECK-LABEL: // end sil function '$s19coroutine_accessors17OverridableGetterCAA13ReadableTitleA2aDP5titleSSvrTW'
182
+ // The concrete read accessor is generated on-demand and does a class dispatch to the getter.
183
+ // CHECK-LABEL: sil shared [ossa] @$s19coroutine_accessors17OverridableGetterC5titleSSvr
184
+ // CHECK: class_method %0 : $OverridableGetter, #OverridableGetter.title!getter
185
+ // CHECK-LABEL: // end sil function '$s19coroutine_accessors17OverridableGetterC5titleSSvr'
186
+
187
+ class ImplementedReader : ReadableTitle {
188
+ var _title : String = " "
189
+ var title : String {
190
+ read {
191
+ yield _title
192
+ }
193
+ }
194
+ }
195
+
196
+ protocol GettableTitle {
197
+ var title : String { get }
198
+ }
199
+
200
+ // CHECK-LABEL: sil{{.*}} [ossa] @$s19coroutine_accessors17OverridableReaderCAA13GettableTitleA2aDP5titleSSvgTW : {{.*}} {
201
+ // CHECK: bb0(
202
+ // CHECK-SAME: [[SELF_ADDR:%[^,]+]] :
203
+ // CHECK-SAME: ):
204
+ // CHECK: [[SELF:%[^,]+]] = load_borrow [[SELF_ADDR]]
205
+ // CHECK: [[GETTER:%[^,]+]] = function_ref @$s19coroutine_accessors17OverridableReaderC5titleSSvg
206
+ // CHECK: [[RETVAL:%[^,]+]] = apply [[GETTER]]([[SELF]])
207
+ // CHECK: end_borrow [[SELF]]
208
+ // CHECK: return [[RETVAL]]
209
+ // CHECK-LABEL: } // end sil function '$s19coroutine_accessors17OverridableReaderCAA13GettableTitleA2aDP5titleSSvgTW'
210
+ // CHECK-LABEL: sil{{.*}} [ossa] @$s19coroutine_accessors17OverridableReaderC5titleSSvg : {{.*}} {
211
+ // CHECK: bb0(
212
+ // CHECK-SAME: [[SELF:%[^,]+]] :
213
+ // CHECK-SAME: ):
214
+ // CHECK: [[READER:%[^,]+]] = class_method [[SELF]] : $OverridableReader, #OverridableReader.title!read
215
+ // CHECK: ([[TITLE:%[^,]+]], [[TOKEN:%[^,]+]]) = begin_apply [[READER]]([[SELF]])
216
+ // CHECK: [[RETVAL:%[^,]+]] = copy_value [[TITLE]]
217
+ // CHECK: end_apply [[TOKEN]] as $()
218
+ // CHECK: return [[RETVAL]]
219
+ // CHECK-LABEL: } // end sil function '$s19coroutine_accessors17OverridableReaderC5titleSSvg'
220
+
221
+ // CHECK-LABEL: sil_witness_table{{.*}} OverridableReader: GettableTitle {{.*}} {
222
+ // CHECK-NEXT: method #GettableTitle.title!getter
223
+ // CHECK-SAME: @$s19coroutine_accessors17OverridableReaderCAA13GettableTitleA2aDP5titleSSvgTW
224
+ // CHECK-NEXT: }
225
+ class OverridableReader : GettableTitle {
226
+ var _title : String = " "
227
+ var title : String {
228
+ read {
229
+ yield _title
230
+ }
231
+ }
232
+ }
0 commit comments