@@ -12,37 +12,43 @@ import Builtin
1212
1313struct BufferView : ~ Escapable {
1414 let ptr : UnsafeRawBufferPointer
15+ let c : Int
1516 @_unsafeNonescapableResult
16- init ( _ ptr: UnsafeRawBufferPointer ) {
17+ init ( _ ptr: UnsafeRawBufferPointer , _ c : Int ) {
1718 self . ptr = ptr
19+ self . c = c
1820 }
1921// CHECK: sil hidden @$s28implicit_lifetime_dependence10BufferViewVyA2ChYlscfC : $@convention(method) (@guaranteed BufferView, @thin BufferView.Type) -> _scope(1) @owned BufferView {
2022 init ( _ otherBV: borrowing BufferView ) {
2123 self . ptr = otherBV. ptr
24+ self . c = otherBV. c
2225 }
2326// CHECK: sil hidden @$s28implicit_lifetime_dependence10BufferViewVyA2CYlicfC : $@convention(method) (@owned BufferView, @thin BufferView.Type) -> _inherit(1) @owned BufferView {
2427 init ( _ otherBV: consuming BufferView ) {
2528 self . ptr = otherBV. ptr
29+ self . c = otherBV. c
2630 }
2731// CHECK: sil hidden @$s28implicit_lifetime_dependence10BufferViewVyACSWYls_SaySiGhtcfC : $@convention(method) (UnsafeRawBufferPointer, @guaranteed Array<Int>, @thin BufferView.Type) -> _scope(1) @owned BufferView {
2832 init ( _ ptr: UnsafeRawBufferPointer , _ a: borrowing Array < Int > ) {
2933 self . ptr = ptr
34+ self . c = a. count
3035 }
3136}
3237
3338struct MutableBufferView : ~ Escapable, ~ Copyable {
3439 let ptr : UnsafeMutableRawBufferPointer
40+ let c : Int
3541 @_unsafeNonescapableResult
36- init ( _ ptr: UnsafeMutableRawBufferPointer ) {
42+ init ( _ ptr: UnsafeMutableRawBufferPointer , _ c : Int ) {
3743 self . ptr = ptr
44+ self . c = c
3845 }
3946}
4047
4148func testBasic( ) {
42- let capacity = 4
43- let a = Array ( 0 ..< capacity)
49+ let a = [ Int] ( repeating: 0 , count: 4 )
4450 a. withUnsafeBytes {
45- let view = BufferView ( $0)
51+ let view = BufferView ( $0, a . count )
4652 let derivedView = derive ( view)
4753 let newView = consumeAndCreate ( derivedView)
4854 use ( newView)
@@ -51,42 +57,62 @@ func testBasic() {
5157
5258// CHECK: sil hidden @$s28implicit_lifetime_dependence6deriveyAA10BufferViewVADYlsF : $@convention(thin) (@guaranteed BufferView) -> _scope(1) @owned BufferView {
5359func derive( _ x: borrowing BufferView ) -> BufferView {
54- return BufferView ( x. ptr)
60+ return BufferView ( x. ptr, x . c )
5561}
5662
5763// CHECK: sil hidden @$s28implicit_lifetime_dependence16consumeAndCreateyAA10BufferViewVADnYliF : $@convention(thin) (@owned BufferView) -> _inherit(1) @owned BufferView {
5864func consumeAndCreate( _ x: consuming BufferView ) -> BufferView {
59- return BufferView ( x. ptr)
65+ return BufferView ( x. ptr, x . c )
6066}
6167
6268func use( _ x: borrowing BufferView ) { }
6369
6470struct Wrapper : ~ Escapable {
65- let view : BufferView
71+ var _view : BufferView
72+ var view : BufferView {
73+ // CHECK: sil hidden @$s28implicit_lifetime_dependence7WrapperV4viewAA10BufferViewVvr : $@yield_once @convention(method) (@guaranteed Wrapper) -> _scope(0) @yields @guaranteed BufferView {
74+ _read {
75+ yield _view
76+ }
77+ // CHECK: sil hidden @$s28implicit_lifetime_dependence7WrapperV4viewAA10BufferViewVvM : $@yield_once @convention(method) (@inout Wrapper) -> _scope(0) @yields @inout BufferView {
78+ _modify {
79+ yield & _view
80+ }
81+ }
6682// CHECK: sil hidden @$s28implicit_lifetime_dependence7WrapperVyAcA10BufferViewVYlicfC : $@convention(method) (@owned BufferView, @thin Wrapper.Type) -> _inherit(1) @owned Wrapper {
6783 init ( _ view: consuming BufferView ) {
68- self . view = view
84+ self . _view = view
6985 }
7086// CHECK: sil hidden @$s28implicit_lifetime_dependence7WrapperV8getView1AA10BufferViewVyYLsF : $@convention(method) (@guaranteed Wrapper) -> _scope(0) @owned BufferView {
7187 borrowing func getView1( ) -> BufferView {
72- return view
88+ return _view
7389 }
7490
7591// CHECK:sil hidden @$s28implicit_lifetime_dependence7WrapperV8getView2AA10BufferViewVyYLiF : $@convention(method) (@owned Wrapper) -> _inherit(0) @owned BufferView {
7692 consuming func getView2( ) -> BufferView {
77- return view
93+ return _view
7894 }
7995}
8096
81- struct Container : ~ Copyable {
82- var ptr : UnsafeRawBufferPointer
83- // CHECK: sil hidden @$s28implicit_lifetime_dependence9ContainerV4viewAA10BufferViewVvg : $@convention(method) (@guaranteed Container) -> _scope(0) @owned BufferView {
97+ struct Container1 : ~ Copyable {
98+ let ptr : UnsafeRawBufferPointer
99+ let c : Int
100+ // CHECK: sil hidden @$s28implicit_lifetime_dependence10Container1V4viewAA10BufferViewVvg : $@convention(method) (@guaranteed Container1) -> _scope(0) @owned BufferView {
84101 var view : BufferView {
85102 get {
86- return BufferView ( ptr)
103+ return BufferView ( ptr, c )
87104 }
88- set ( newView) {
89- ptr = newView. ptr
105+ }
106+ }
107+
108+ struct Container2 : ~ Copyable {
109+ let ptr : UnsafeMutableRawBufferPointer
110+ let c : Int
111+ // CHECK: sil hidden @$s28implicit_lifetime_dependence10Container2V11mutableViewAA013MutableBufferF0Vvr : $@yield_once @convention(method) (@guaranteed Container2) -> _scope(0) @yields @guaranteed MutableBufferView {
112+ var mutableView : MutableBufferView {
113+ _read {
114+ yield MutableBufferView ( ptr, c)
90115 }
91116 }
92117}
118+
0 commit comments