@@ -38,24 +38,26 @@ public var irm: Int {
3838 modify {
3939 yield & _i
4040 }
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)
4344// CHECK-SAME: (@guaranteed S)
4445// CHECK-SAME: ->
45- // CHECK-SAME: Int
46+ // CHECK-SAME: @yields Int
4647// CHECK-SAME: {
4748// 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]])
5553// 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'
5961
6062// CHECK-LABEL: sil {{.*}}[ossa] @$s19coroutine_accessors1SV3irmSivs :
6163// CHECK-SAME: $@convention(method)
@@ -95,12 +97,14 @@ public var irm: Int {
9597// CHECK-SAME: [[TOKEN:%[^,]+]],
9698// CHECK-SAME: [[ALLOCATION:%[^)]+]])
9799// 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]]:
100104// CHECK: end_apply [[TOKEN]]
101105// CHECK: end_access [[SELF_ACCESS]]
102106// CHECK: dealloc_stack [[ALLOCATION]]
103- // CHECK: bb2 :
107+ // CHECK: [[UNWIND_BB]] :
104108// CHECK: end_apply [[TOKEN]]
105109// CHECK: dealloc_stack [[ALLOCATION]]
106110// CHECK: end_access [[SELF_ACCESS]]
@@ -123,7 +127,7 @@ public var irm: Int {
123127// CHECK: store [[NEW_VALUE:%[^,]+]] to [trivial] [[NEW_VALUE_ADDR]]
124128// CHECK: [[SELF_ACCESS:%[^,]+]] = begin_access [modify] [unknown] [[SELF]]
125129// CHECK: [[MODIFY_ACCESSOR:%[^,]+]] = function_ref @$s19coroutine_accessors1SV3irmSivx
126- // CHECK: ([[VALUE_ADDR:%[^,]+]],
130+ // CHECK: ([[VALUE_ADDR:%[^,]+]],
127131// CHECK-SAME: [[TOKEN:%[^,]+]],
128132// CHECK-SAME: [[ALLOCATION:%[^)]+]])
129133// 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 {
164168 location = newValue
165169 return oldValue
166170}
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