@@ -1030,15 +1030,31 @@ public struct LoadableSubscriptGetOnlyTester : ~Copyable {
10301030// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
10311031// CHECK: [[TEMP_MARK:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
10321032// CHECK: apply {{%.*}}([[TEMP_MARK]], {{%.*}}, [[LOAD_BORROW]])
1033+ // CHECK: end_borrow [[LOAD_BORROW]]
1034+ // CHECK: end_access [[ACCESS]]
10331035// CHECK: apply {{%.*}}([[TEMP_MARK]])
10341036// CHECK: destroy_addr [[TEMP_MARK]]
1035- // CHECK: end_borrow [[LOAD_BORROW]]
1037+ //
1038+ // Test the assignment
1039+ // CHECK: [[M2_BOX:%.*]] = alloc_box ${
1040+ // CHECK: [[M2_BORROW:%.*]] = begin_borrow [lexical] [[M2_BOX]]
1041+ // CHECK: [[M2_PROJECT:%.*]] = project_box [[M2_BORROW]]
1042+ // CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[PROJECT]]
1043+ // CHECK: [[MARK:%.*]] = mark_must_check [no_consume_or_assign] [[ACCESS]]
1044+ // CHECK: [[LOAD:%.*]] = load_borrow [[MARK]]
1045+ // CHECK: apply {{%.*}}([[M2_PROJECT]], {{%.*}}, [[LOAD]])
1046+ // CHECK: end_borrow [[LOAD]]
10361047// CHECK: end_access [[ACCESS]]
1048+ // CHECK: [[M2_MARK:%.*]] = mark_must_check [no_consume_or_assign] [[M2_PROJECT]]
1049+ // CHECK: end_borrow [[M2_BORROW]]
1050+ // CHECK: destroy_value [[M2_BOX]]
10371051// CHECK: } // end sil function '$s8moveonly047testSubscriptGetOnly_BaseLoadable_ResultAddressE4_VaryyF'
10381052public func testSubscriptGetOnly_BaseLoadable_ResultAddressOnly_Var( ) {
10391053 var m = LoadableSubscriptGetOnlyTester ( )
10401054 m = LoadableSubscriptGetOnlyTester ( )
10411055 m [ 0 ] . nonMutatingFunc ( )
1056+ let m2 = m [ 0 ]
1057+ _ = m2
10421058}
10431059
10441060// CHECK-LABEL: sil [ossa] @$s8moveonly047testSubscriptGetOnly_BaseLoadable_ResultAddressE4_LetyyF : $@convention(thin) () -> () {
@@ -1069,10 +1085,10 @@ public func testSubscriptGetOnly_BaseLoadable_ResultAddressOnly_Let() {
10691085// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
10701086// CHECK: [[TEMP_MARK:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
10711087// CHECK: apply {{%.*}}([[TEMP_MARK]], {{%.*}}, [[LOAD_BORROW]])
1072- // CHECK: apply {{%.*}}([[TEMP_MARK]])
1073- // CHECK: destroy_addr [[TEMP_MARK]]
10741088// CHECK: end_borrow [[LOAD_BORROW]]
10751089// CHECK: end_access [[ACCESS]]
1090+ // CHECK: apply {{%.*}}([[TEMP_MARK]])
1091+ // CHECK: destroy_addr [[TEMP_MARK]]
10761092// CHECK: } // end sil function '$s8moveonly047testSubscriptGetOnly_BaseLoadable_ResultAddressE6_InOut1myAA0gcdE6TesterVz_tF'
10771093public func testSubscriptGetOnly_BaseLoadable_ResultAddressOnly_InOut( m: inout LoadableSubscriptGetOnlyTester ) {
10781094 m [ 0 ] . nonMutatingFunc ( )
@@ -1088,10 +1104,10 @@ public func testSubscriptGetOnly_BaseLoadable_ResultAddressOnly_InOut(m: inout L
10881104// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
10891105// CHECK: [[TEMP_MARK:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
10901106// CHECK: apply {{%.*}}([[TEMP_MARK]], {{%.*}}, [[LOAD_BORROW]])
1091- // CHECK: apply {{%.*}}([[TEMP_MARK]])
1092- // CHECK: destroy_addr [[TEMP_MARK]]
10931107// CHECK: end_borrow [[LOAD_BORROW]]
10941108// CHECK: end_access [[ACCESS]]
1109+ // CHECK: apply {{%.*}}([[TEMP_MARK]])
1110+ // CHECK: destroy_addr [[TEMP_MARK]]
10951111// CHECK: } // end sil function '$s8moveonly047testSubscriptGetOnly_BaseLoadable_ResultAddressE7_GlobalyyF'
10961112var globalLoadableSubscriptGetOnlyTester = LoadableSubscriptGetOnlyTester ( )
10971113public func testSubscriptGetOnly_BaseLoadable_ResultAddressOnly_Global( ) {
@@ -1116,10 +1132,10 @@ public struct LoadableSubscriptGetOnlyTesterNonCopyableStructParent : ~Copyable
11161132// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
11171133// CHECK: [[TEMP_MARK:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
11181134// CHECK: apply {{%.*}}([[TEMP_MARK]], {{%.*}}, [[LOAD_BORROW]])
1119- // CHECK: apply {{%.*}}([[TEMP_MARK]])
1120- // CHECK: destroy_addr [[TEMP_MARK]]
11211135// CHECK: end_borrow [[LOAD_BORROW]]
11221136// CHECK: end_access [[ACCESS]]
1137+ // CHECK: apply {{%.*}}([[TEMP_MARK]])
1138+ // CHECK: destroy_addr [[TEMP_MARK]]
11231139//
11241140// The second get call.
11251141// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[PROJECT]]
@@ -1129,10 +1145,12 @@ public struct LoadableSubscriptGetOnlyTesterNonCopyableStructParent : ~Copyable
11291145// CHECK: end_borrow [[LOAD_BORROW]]
11301146// CHECK: end_access [[ACCESS]]
11311147//
1148+ // CHECK: [[BORROWED_VALUE:%.*]] = begin_borrow [[VALUE]]
11321149// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
11331150// CHECK: [[TEMP_MARK:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
1134- // CHECK: [[BORROWED_VALUE:%.*]] = begin_borrow [[VALUE]]
11351151// CHECK: apply {{%.*}}([[TEMP_MARK]], {{%.*}}, [[BORROWED_VALUE]])
1152+ // CHECK: end_borrow [[BORROWED_VALUE]]
1153+ // CHECK: destroy_value [[VALUE]]
11361154// CHECK: apply {{%.*}}([[TEMP_MARK]])
11371155// CHECK: destroy_addr [[TEMP_MARK]]
11381156// } // end sil function '$s8moveonly077testSubscriptGetOnlyThroughNonCopyableParentStruct_BaseLoadable_ResultAddressE4_VaryyF'
@@ -1151,13 +1169,14 @@ public func testSubscriptGetOnlyThroughNonCopyableParentStruct_BaseLoadable_Resu
11511169// CHECK: [[LOAD:%.*]] = load_borrow [[MARK]]
11521170// CHECK: [[EXT:%.*]] = struct_extract [[LOAD]]
11531171// CHECK: [[COPY:%.*]] = copy_value [[EXT]]
1172+ // CHECK: [[BORROW:%.*]] = begin_borrow [[COPY]]
11541173// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
11551174// CHECK: [[TEMP_MARK:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
1156- // CHECK: [[BORROW:%.*]] = begin_borrow [[COPY]]
11571175// CHECK: apply {{%.*}}([[TEMP_MARK]], {{%.*}}, [[BORROW]])
1176+ // CHECK: end_borrow [[BORROW]]
1177+ // CHECK: destroy_value [[COPY]]
11581178// CHECK: apply {{%.*}}([[TEMP_MARK]])
11591179// CHECK: destroy_addr [[TEMP_MARK]]
1160- // CHECK: destroy_value [[COPY]]
11611180// CHECK: end_borrow [[LOAD]]
11621181// CHECK: } // end sil function '$s8moveonly077testSubscriptGetOnlyThroughNonCopyableParentStruct_BaseLoadable_ResultAddressE4_LetyyF'
11631182public func testSubscriptGetOnlyThroughNonCopyableParentStruct_BaseLoadable_ResultAddressOnly_Let( ) {
@@ -1175,10 +1194,10 @@ public func testSubscriptGetOnlyThroughNonCopyableParentStruct_BaseLoadable_Resu
11751194// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
11761195// CHECK: [[TEMP_MARK:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
11771196// CHECK: apply {{%.*}}([[TEMP_MARK]], {{%.*}}, [[LOAD]])
1178- // CHECK: apply {{%.*}}([[TEMP_MARK]])
1179- // CHECK: destroy_addr [[TEMP_MARK]]
11801197// CHECK: end_borrow [[LOAD]]
11811198// CHECK: end_access [[ACCESS]]
1199+ // CHECK: apply {{%.*}}([[TEMP_MARK]])
1200+ // CHECK: destroy_addr [[TEMP_MARK]]
11821201// CHECK: } // end sil function '$s8moveonly077testSubscriptGetOnlyThroughNonCopyableParentStruct_BaseLoadable_ResultAddressE6_InOut1myAA0lcde6TesterghjI0Vz_tF'
11831202public func testSubscriptGetOnlyThroughNonCopyableParentStruct_BaseLoadable_ResultAddressOnly_InOut( m: inout LoadableSubscriptGetOnlyTesterNonCopyableStructParent ) {
11841203 m. tester [ 0 ] . nonMutatingFunc ( )
@@ -1193,10 +1212,10 @@ public func testSubscriptGetOnlyThroughNonCopyableParentStruct_BaseLoadable_Resu
11931212// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
11941213// CHECK: [[TEMP_MARK:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
11951214// CHECK: apply {{%.*}}([[TEMP_MARK]], {{%.*}}, [[LOAD]])
1196- // CHECK: apply {{%.*}}([[TEMP_MARK]])
1197- // CHECK: destroy_addr [[TEMP_MARK]]
11981215// CHECK: end_borrow [[LOAD]]
11991216// CHECK: end_access [[ACCESS]]
1217+ // CHECK: apply {{%.*}}([[TEMP_MARK]])
1218+ // CHECK: destroy_addr [[TEMP_MARK]]
12001219// CHECK: } // end sil function '$s8moveonly077testSubscriptGetOnlyThroughNonCopyableParentStruct_BaseLoadable_ResultAddressE7_GlobalyyF'
12011220var globalLoadableSubscriptGetOnlyTesterNonCopyableStructParent = LoadableSubscriptGetOnlyTesterNonCopyableStructParent ( )
12021221public func testSubscriptGetOnlyThroughNonCopyableParentStruct_BaseLoadable_ResultAddressOnly_Global( ) {
@@ -1233,9 +1252,10 @@ public class LoadableSubscriptGetOnlyTesterClassParent {
12331252// CHECK: [[TEMP2:%.*]] = alloc_stack $
12341253// CHECK: [[TEMP2_MARK:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP2]]
12351254// CHECK: apply {{%.*}}([[TEMP2_MARK]], {{%.*}}, [[LOAD]])
1236- // CHECK: destroy_addr [[TEMP2_MARK]]
12371255// CHECK: end_borrow [[LOAD]]
12381256// CHECK: end_apply [[CORO_TOKEN]]
1257+ // CHECK: apply {{%.*}}([[TEMP2_MARK]])
1258+ // CHECK: destroy_addr [[TEMP2_MARK]]
12391259//
12401260// Second read.
12411261// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[PROJECT]]
@@ -1252,9 +1272,10 @@ public class LoadableSubscriptGetOnlyTesterClassParent {
12521272// CHECK: [[TEMP2:%.*]] = alloc_stack $
12531273// CHECK: [[TEMP2_MARK:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP2]]
12541274// CHECK: apply {{%.*}}([[TEMP2_MARK]], {{%.*}}, [[LOAD]])
1255- // CHECK: destroy_addr [[TEMP2_MARK]]
12561275// CHECK: end_borrow [[LOAD]]
12571276// CHECK: end_apply [[CORO_TOKEN]]
1277+ // CHECK: apply {{%.*}}([[TEMP2_MARK]])
1278+ // CHECK: destroy_addr [[TEMP2_MARK]]
12581279//
12591280// Third read. This is a case that we can't handle today due to the way the AST
12601281// looks:
@@ -1280,9 +1301,9 @@ public class LoadableSubscriptGetOnlyTesterClassParent {
12801301// CHECK: ([[CORO_RESULT:%.*]], [[CORO_TOKEN:%.*]]) = begin_apply {{%.*}}([[BORROW_COPYABLE_CLASS]])
12811302// CHECK: [[CORO_RESULT_COPY:%.*]] = copy_value [[CORO_RESULT]]
12821303// CHECK: end_apply [[CORO_TOKEN]]
1304+ // CHECK: [[BORROW:%.*]] = begin_borrow [[CORO_RESULT_COPY]]
12831305// CHECK: [[TEMP:%.*]] = alloc_stack $
12841306// CHECK: [[TEMP_MARK:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
1285- // CHECK: [[BORROW:%.*]] = begin_borrow [[CORO_RESULT_COPY]]
12861307// CHECK: apply {{%.*}}([[TEMP_MARK]], {{%.*}}, [[BORROW]])
12871308// CHECK: destroy_addr [[TEMP_MARK]]
12881309
@@ -1503,10 +1524,12 @@ public struct LoadableSubscriptGetSetTesterNonCopyableStructParent : ~Copyable {
15031524// CHECK: [[VALUE:%.*]] = apply {{%.*}}([[LOAD_BORROW]])
15041525// CHECK: end_borrow [[LOAD_BORROW]]
15051526// CHECK: end_access [[ACCESS]]
1527+ // CHECK: [[BORROWED_VALUE:%.*]] = begin_borrow [[VALUE]]
15061528// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
15071529// CHECK: [[MARK_TEMP:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
1508- // CHECK: [[BORROWED_VALUE:%.*]] = begin_borrow [[VALUE]]
15091530// CHECK: apply {{%.*}}([[MARK_TEMP]], {{%.*}}, [[BORROWED_VALUE]])
1531+ // CHECK: end_borrow [[BORROWED_VALUE]]
1532+ // CHECK: destroy_value [[VALUE]]
15101533// CHECK: apply {{%.*}}([[MARK_TEMP]])
15111534// CHECK: destroy_addr [[MARK_TEMP]]
15121535// } // end sil function '$s8moveonly077testSubscriptGetSetThroughNonCopyableParentStruct_BaseLoadable_ResultAddressE4_VaryyF'
@@ -1526,13 +1549,14 @@ public func testSubscriptGetSetThroughNonCopyableParentStruct_BaseLoadable_Resul
15261549// CHECK: [[LOAD:%.*]] = load_borrow [[MARK]]
15271550// CHECK: [[EXT:%.*]] = struct_extract [[LOAD]]
15281551// CHECK: [[COPY:%.*]] = copy_value [[EXT]]
1552+ // CHECK: [[BORROW:%.*]] = begin_borrow [[COPY]]
15291553// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
15301554// CHECK: [[MARK_TEMP:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
1531- // CHECK: [[BORROW:%.*]] = begin_borrow [[COPY]]
15321555// CHECK: apply {{%.*}}([[MARK_TEMP]], {{%.*}}, [[BORROW]])
1556+ // CHECK: end_borrow [[BORROW]]
1557+ // CHECK: destroy_value [[COPY]]
15331558// CHECK: apply {{%.*}}([[MARK_TEMP]])
15341559// CHECK: destroy_addr [[MARK_TEMP]]
1535- // CHECK: destroy_value [[COPY]]
15361560// CHECK: end_borrow [[LOAD]]
15371561// CHECK: } // end sil function '$s8moveonly84testSubscriptGetSetThroughNonCopyableParentStruct_BaseLoadable_ResultAddressOnly_LetyyF'
15381562public func testSubscriptGetSetThroughNonCopyableParentStruct_BaseLoadable_ResultAddressOnly_Let( ) {
@@ -1709,10 +1733,13 @@ public class LoadableSubscriptGetSetTesterClassParent {
17091733// CHECK: ([[CORO_RESULT:%.*]], [[CORO_TOKEN:%.*]]) = begin_apply {{%.*}}([[BORROW_COPYABLE_CLASS]])
17101734// CHECK: [[CORO_RESULT_COPY:%.*]] = copy_value [[CORO_RESULT]]
17111735// CHECK: end_apply [[CORO_TOKEN]]
1736+ // CHECK: [[BORROW:%.*]] = begin_borrow [[CORO_RESULT_COPY]]
17121737// CHECK: [[TEMP:%.*]] = alloc_stack $
17131738// CHECK: [[MARK_TEMP:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
1714- // CHECK: [[BORROW:%.*]] = begin_borrow [[CORO_RESULT_COPY]]
17151739// CHECK: apply {{%.*}}([[MARK_TEMP]], {{%.*}}, [[BORROW]])
1740+ // CHECK: end_borrow [[BORROW]]
1741+ // CHECK: destroy_value [[CORO_RESULT_COPY]]
1742+ // CHECK: apply {{%.*}}([[MARK_TEMP]])
17161743// CHECK: destroy_addr [[MARK_TEMP]]
17171744//
17181745// First read
@@ -2893,10 +2920,12 @@ public struct LoadableSubscriptGetModifyTesterNonCopyableStructParent : ~Copyabl
28932920// CHECK: [[VALUE:%.*]] = apply {{%.*}}([[LOAD_BORROW]])
28942921// CHECK: end_borrow [[LOAD_BORROW]]
28952922// CHECK: end_access [[ACCESS]]
2923+ // CHECK: [[BORROWED_VALUE:%.*]] = begin_borrow [[VALUE]]
28962924// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
28972925// CHECK: [[MARK_TEMP:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
2898- // CHECK: [[BORROWED_VALUE:%.*]] = begin_borrow [[VALUE]]
28992926// CHECK: apply {{%.*}}([[MARK_TEMP]], {{%.*}}, [[BORROWED_VALUE]])
2927+ // CHECK: end_borrow [[BORROWED_VALUE]]
2928+ // CHECK: destroy_value [[VALUE]]
29002929// CHECK: apply {{%.*}}([[MARK_TEMP]])
29012930// CHECK: destroy_addr [[MARK_TEMP]]
29022931// } // end sil function '$s8moveonly077testSubscriptGetModifyThroughNonCopyableParentStruct_BaseLoadable_ResultAddressE4_VaryyF'
@@ -2916,13 +2945,14 @@ public func testSubscriptGetModifyThroughNonCopyableParentStruct_BaseLoadable_Re
29162945// CHECK: [[LOAD:%.*]] = load_borrow [[MARK]]
29172946// CHECK: [[EXT:%.*]] = struct_extract [[LOAD]]
29182947// CHECK: [[COPY:%.*]] = copy_value [[EXT]]
2948+ // CHECK: [[BORROW:%.*]] = begin_borrow [[COPY]]
29192949// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
29202950// CHECK: [[MARK_TEMP:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
2921- // CHECK: [[BORROW:%.*]] = begin_borrow [[COPY]]
29222951// CHECK: apply {{%.*}}([[MARK_TEMP]], {{%.*}}, [[BORROW]])
2952+ // CHECK: end_borrow [[BORROW]]
2953+ // CHECK: destroy_value [[COPY]]
29232954// CHECK: apply {{%.*}}([[MARK_TEMP]])
29242955// CHECK: destroy_addr [[MARK_TEMP]]
2925- // CHECK: destroy_value [[COPY]]
29262956// CHECK: end_borrow [[LOAD]]
29272957// CHECK: } // end sil function '$s8moveonly87testSubscriptGetModifyThroughNonCopyableParentStruct_BaseLoadable_ResultAddressOnly_LetyyF'
29282958public func testSubscriptGetModifyThroughNonCopyableParentStruct_BaseLoadable_ResultAddressOnly_Let( ) {
@@ -3053,10 +3083,13 @@ public class LoadableSubscriptGetModifyTesterClassParent {
30533083// CHECK: ([[CORO_RESULT:%.*]], [[CORO_TOKEN:%.*]]) = begin_apply {{%.*}}([[BORROW_COPYABLE_CLASS]])
30543084// CHECK: [[CORO_RESULT_COPY:%.*]] = copy_value [[CORO_RESULT]]
30553085// CHECK: end_apply [[CORO_TOKEN]]
3086+ // CHECK: [[BORROW:%.*]] = begin_borrow [[CORO_RESULT_COPY]]
30563087// CHECK: [[TEMP:%.*]] = alloc_stack $
30573088// CHECK: [[MARK_TEMP:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
3058- // CHECK: [[BORROW:%.*]] = begin_borrow [[CORO_RESULT_COPY]]
30593089// CHECK: apply {{%.*}}([[MARK_TEMP]], {{%.*}}, [[BORROW]])
3090+ // CHECK: end_borrow [[BORROW]]
3091+ // CHECK: destroy_value [[CORO_RESULT_COPY]]
3092+ // CHECK: apply {{%.*}}([[MARK_TEMP]])
30603093// CHECK: destroy_addr [[MARK_TEMP]]
30613094//
30623095// First read
0 commit comments