@@ -33,21 +33,20 @@ func read_only_capture(_ x: Int) -> Int {
3333 var x = x
3434 // CHECK: bb0([[X:%[0-9]+]] : $Int):
3535 // CHECK: [[XBOX:%[0-9]+]] = alloc_box ${ var Int }
36+ // CHECK: [[XLIFETIME:%[0-9]+]] = begin_borrow [lexical] [[XBOX]]
3637 // SEMANTIC ARC TODO: This is incorrect. We need to do the project_box on the copy.
37- // CHECK: [[PROJECT:%.*]] = project_box [[XBOX ]]
38+ // CHECK: [[PROJECT:%.*]] = project_box [[XLIFETIME ]]
3839 // CHECK: store [[X]] to [trivial] [[PROJECT]]
3940
4041 func cap( ) -> Int {
4142 return x
4243 }
4344
4445 return cap ( )
45- // CHECK: [[XBOX_BORROW:%.*]] = begin_borrow [[XBOX]]
4646 // SEMANTIC ARC TODO: See above. This needs to happen on the copy_valued box.
4747 // CHECK: mark_function_escape [[PROJECT]]
4848 // CHECK: [[CAP:%[0-9]+]] = function_ref @[[CAP_NAME:\$s8closures17read_only_capture.*]] : $@convention(thin) (@guaranteed { var Int }) -> Int
49- // CHECK: [[RET:%[0-9]+]] = apply [[CAP]]([[XBOX_BORROW]])
50- // CHECK: end_borrow [[XBOX_BORROW]]
49+ // CHECK: [[RET:%[0-9]+]] = apply [[CAP]]([[XLIFETIME]])
5150 // CHECK: destroy_value [[XBOX]]
5251 // CHECK: return [[RET]]
5352}
@@ -67,14 +66,14 @@ func write_to_capture(_ x: Int) -> Int {
6766 var x = x
6867 // CHECK: bb0([[X:%[0-9]+]] : $Int):
6968 // CHECK: [[XBOX:%[0-9]+]] = alloc_box ${ var Int }
70- // CHECK: [[XBOX_PB:%.*]] = project_box [[XBOX]]
69+ // CHECK: [[XLIFETIME:%[0-9]+]] = begin_borrow [lexical] [[XBOX]]
70+ // CHECK: [[XBOX_PB:%[0-9]+]] = project_box [[XLIFETIME]]
7171 // CHECK: store [[X]] to [trivial] [[XBOX_PB]]
7272 // CHECK: [[X2BOX:%[0-9]+]] = alloc_box ${ var Int }
73- // CHECK: [[X2BOX_PB:%.*]] = project_box [[X2BOX]]
73+ // CHECK: [[X2LIFETIME:%[0-9]+]] = begin_borrow [lexical] [[X2BOX]]
74+ // CHECK: [[X2BOX_PB:%.*]] = project_box [[X2LIFETIME]]
7475 // CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[XBOX_PB]] : $*Int
7576 // CHECK: copy_addr [[ACCESS]] to [initialization] [[X2BOX_PB]]
76- // CHECK: [[X2BOX_BORROW:%.*]] = begin_borrow [[X2BOX]]
77- // SEMANTIC ARC TODO: This next mark_function_escape should be on a projection from X2BOX_BORROW.
7877 // CHECK: mark_function_escape [[X2BOX_PB]]
7978 var x2 = x
8079
@@ -84,10 +83,7 @@ func write_to_capture(_ x: Int) -> Int {
8483
8584 scribble ( )
8685 // CHECK: [[SCRIB:%[0-9]+]] = function_ref @[[SCRIB_NAME:\$s8closures16write_to_capture.*]] : $@convention(thin) (@guaranteed { var Int }) -> ()
87- // CHECK: apply [[SCRIB]]([[X2BOX_BORROW]])
88- // SEMANTIC ARC TODO: This should load from X2BOX_BORROW project. There is an
89- // issue here where after a copy_value, we need to reassign a projection in
90- // some way.
86+ // CHECK: apply [[SCRIB]]([[X2LIFETIME]])
9187 // CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[X2BOX_PB]] : $*Int
9288 // CHECK: [[RET:%[0-9]+]] = load [trivial] [[ACCESS]]
9389 // CHECK: destroy_value [[X2BOX]]
@@ -126,14 +122,15 @@ func capture_local_func(_ x: Int) -> () -> () -> Int {
126122 // CHECK: bb0([[ARG:%.*]] : $Int):
127123 var x = x
128124 // CHECK: [[XBOX:%[0-9]+]] = alloc_box ${ var Int }
129- // CHECK: [[XBOX_PB:%.*]] = project_box [[XBOX]]
125+ // CHECK: [[XLIFETIME:%[0-9]+]] = begin_borrow [lexical] [[XBOX]]
126+ // CHECK: [[XBOX_PB:%[0-9]+]] = project_box [[XLIFETIME]]
130127 // CHECK: store [[ARG]] to [trivial] [[XBOX_PB]]
131128
132129 func aleph( ) -> Int { return x }
133130
134131 func beth( ) -> ( ) -> Int { return aleph }
135132 // CHECK: [[BETH_REF:%.*]] = function_ref @[[BETH_NAME:\$s8closures18capture_local_funcySiycycSiF4bethL_SiycyF]] : $@convention(thin) (@guaranteed { var Int }) -> @owned @callee_guaranteed () -> Int
136- // CHECK: [[XBOX_COPY:%.*]] = copy_value [[XBOX ]]
133+ // CHECK: [[XBOX_COPY:%.*]] = copy_value [[XLIFETIME ]]
137134 // SEMANTIC ARC TODO: This is incorrect. This should be a project_box from XBOX_COPY.
138135 // CHECK: mark_function_escape [[XBOX_PB]]
139136 // CHECK: [[BETH_CLOSURE:%[0-9]+]] = partial_apply [callee_guaranteed] [[BETH_REF]]([[XBOX_COPY]])
@@ -163,7 +160,8 @@ func anon_read_only_capture(_ x: Int) -> Int {
163160 var x = x
164161 // CHECK: bb0([[X:%[0-9]+]] : $Int):
165162 // CHECK: [[XBOX:%[0-9]+]] = alloc_box ${ var Int }
166- // CHECK: [[PB:%.*]] = project_box [[XBOX]]
163+ // CHECK: [[XLIFETIME:%[0-9]+]] = begin_borrow [lexical] [[XBOX]]
164+ // CHECK: [[PB:%[0-9]+]] = project_box [[XLIFETIME]]
167165
168166 return ( { x } ) ( )
169167 // -- func expression
@@ -185,7 +183,8 @@ func small_closure_capture(_ x: Int) -> Int {
185183 var x = x
186184 // CHECK: bb0([[X:%[0-9]+]] : $Int):
187185 // CHECK: [[XBOX:%[0-9]+]] = alloc_box ${ var Int }
188- // CHECK: [[PB:%.*]] = project_box [[XBOX]]
186+ // CHECK: [[XLIFETIME:%[0-9]+]] = begin_borrow [lexical] [[XBOX]]
187+ // CHECK: [[PB:%.*]] = project_box [[XLIFETIME]]
189188
190189 return { x } ( )
191190 // -- func expression
@@ -207,11 +206,12 @@ func small_closure_capture(_ x: Int) -> Int {
207206func small_closure_capture_with_argument( _ x: Int ) -> ( _ y: Int ) -> Int {
208207 var x = x
209208 // CHECK: [[XBOX:%[0-9]+]] = alloc_box ${ var Int }
209+ // CHEKC: [[XLIFETIME:%[0-9]+]] = begin_borrow [lexical] [[XBOX]]
210210
211211 return { x + $0 }
212212 // -- func expression
213213 // CHECK: [[ANON:%[0-9]+]] = function_ref @[[CLOSURE_NAME:\$s8closures35small_closure_capture_with_argument.*]] : $@convention(thin) (Int, @guaranteed { var Int }) -> Int
214- // CHECK: [[XBOX_COPY:%.*]] = copy_value [[XBOX ]]
214+ // CHECK: [[XBOX_COPY:%.*]] = copy_value [[XLIFETIME ]]
215215 // CHECK: [[ANON_CLOSURE_APP:%[0-9]+]] = partial_apply [callee_guaranteed] [[ANON]]([[XBOX_COPY]])
216216 // -- return
217217 // CHECK: destroy_value [[XBOX]]
@@ -244,7 +244,8 @@ func uncaptured_locals(_ x: Int) -> (Int, Int) {
244244 // -- locals without captures are stack-allocated
245245 // CHECK: bb0([[XARG:%[0-9]+]] : $Int):
246246 // CHECK: [[XADDR:%[0-9]+]] = alloc_box ${ var Int }
247- // CHECK: [[PB:%.*]] = project_box [[XADDR]]
247+ // CHECK: [[XLIFETIME:%[0-9]+]] = begin_borrow [lexical] [[XADDR]]
248+ // CHECK: [[PB:%.*]] = project_box [[XLIFETIME]]
248249 // CHECK: store [[XARG]] to [trivial] [[PB]]
249250
250251 var y = zero
@@ -318,7 +319,8 @@ class SelfCapturedInInit : Base {
318319 // First create our initial value for self.
319320 // CHECK: [[SELF_BOX:%.*]] = alloc_box ${ var SelfCapturedInInit }, let, name "self"
320321 // CHECK: [[UNINIT_SELF:%.*]] = mark_uninitialized [derivedself] [[SELF_BOX]]
321- // CHECK: [[PB_SELF_BOX:%.*]] = project_box [[UNINIT_SELF]]
322+ // CHECK: [[SELF_LIFETIME:%.*]] = begin_borrow [lexical] [[UNINIT_SELF]]
323+ // CHECK: [[PB_SELF_BOX:%.*]] = project_box [[SELF_LIFETIME]]
322324 // CHECK: store [[SELF]] to [init] [[PB_SELF_BOX]]
323325 //
324326 // Then perform the super init sequence.
@@ -660,7 +662,8 @@ class SuperSub : SuperBase {
660662// -- We enter with an assumed strong +1.
661663// CHECK: bb0([[SELF:%.*]] : @guaranteed $UnownedSelfNestedCapture):
662664// CHECK: [[OUTER_SELF_CAPTURE:%.*]] = alloc_box ${ var @sil_unowned UnownedSelfNestedCapture }
663- // CHECK: [[PB:%.*]] = project_box [[OUTER_SELF_CAPTURE]]
665+ // CHECK: [[OUTER_SELF_LIFETIME:%.*]] = begin_borrow [lexical] [[OUTER_SELF_CAPTURE]]
666+ // CHECK: [[PB:%.*]] = project_box [[OUTER_SELF_LIFETIME]]
664667// -- strong +2
665668// CHECK: [[SELF_COPY:%.*]] = copy_value [[SELF]]
666669// CHECK: [[UNOWNED_SELF:%.*]] = ref_to_unowned [[SELF_COPY]] :
0 commit comments