@@ -1030,15 +1030,31 @@ public struct LoadableSubscriptGetOnlyTester : ~Copyable {
1030
1030
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
1031
1031
// CHECK: [[TEMP_MARK:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
1032
1032
// CHECK: apply {{%.*}}([[TEMP_MARK]], {{%.*}}, [[LOAD_BORROW]])
1033
+ // CHECK: end_borrow [[LOAD_BORROW]]
1034
+ // CHECK: end_access [[ACCESS]]
1033
1035
// CHECK: apply {{%.*}}([[TEMP_MARK]])
1034
1036
// 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]]
1036
1047
// 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]]
1037
1051
// CHECK: } // end sil function '$s8moveonly047testSubscriptGetOnly_BaseLoadable_ResultAddressE4_VaryyF'
1038
1052
public func testSubscriptGetOnly_BaseLoadable_ResultAddressOnly_Var( ) {
1039
1053
var m = LoadableSubscriptGetOnlyTester ( )
1040
1054
m = LoadableSubscriptGetOnlyTester ( )
1041
1055
m [ 0 ] . nonMutatingFunc ( )
1056
+ let m2 = m [ 0 ]
1057
+ _ = m2
1042
1058
}
1043
1059
1044
1060
// CHECK-LABEL: sil [ossa] @$s8moveonly047testSubscriptGetOnly_BaseLoadable_ResultAddressE4_LetyyF : $@convention(thin) () -> () {
@@ -1069,10 +1085,10 @@ public func testSubscriptGetOnly_BaseLoadable_ResultAddressOnly_Let() {
1069
1085
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
1070
1086
// CHECK: [[TEMP_MARK:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
1071
1087
// CHECK: apply {{%.*}}([[TEMP_MARK]], {{%.*}}, [[LOAD_BORROW]])
1072
- // CHECK: apply {{%.*}}([[TEMP_MARK]])
1073
- // CHECK: destroy_addr [[TEMP_MARK]]
1074
1088
// CHECK: end_borrow [[LOAD_BORROW]]
1075
1089
// CHECK: end_access [[ACCESS]]
1090
+ // CHECK: apply {{%.*}}([[TEMP_MARK]])
1091
+ // CHECK: destroy_addr [[TEMP_MARK]]
1076
1092
// CHECK: } // end sil function '$s8moveonly047testSubscriptGetOnly_BaseLoadable_ResultAddressE6_InOut1myAA0gcdE6TesterVz_tF'
1077
1093
public func testSubscriptGetOnly_BaseLoadable_ResultAddressOnly_InOut( m: inout LoadableSubscriptGetOnlyTester ) {
1078
1094
m [ 0 ] . nonMutatingFunc ( )
@@ -1088,10 +1104,10 @@ public func testSubscriptGetOnly_BaseLoadable_ResultAddressOnly_InOut(m: inout L
1088
1104
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
1089
1105
// CHECK: [[TEMP_MARK:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
1090
1106
// CHECK: apply {{%.*}}([[TEMP_MARK]], {{%.*}}, [[LOAD_BORROW]])
1091
- // CHECK: apply {{%.*}}([[TEMP_MARK]])
1092
- // CHECK: destroy_addr [[TEMP_MARK]]
1093
1107
// CHECK: end_borrow [[LOAD_BORROW]]
1094
1108
// CHECK: end_access [[ACCESS]]
1109
+ // CHECK: apply {{%.*}}([[TEMP_MARK]])
1110
+ // CHECK: destroy_addr [[TEMP_MARK]]
1095
1111
// CHECK: } // end sil function '$s8moveonly047testSubscriptGetOnly_BaseLoadable_ResultAddressE7_GlobalyyF'
1096
1112
var globalLoadableSubscriptGetOnlyTester = LoadableSubscriptGetOnlyTester ( )
1097
1113
public func testSubscriptGetOnly_BaseLoadable_ResultAddressOnly_Global( ) {
@@ -1116,10 +1132,10 @@ public struct LoadableSubscriptGetOnlyTesterNonCopyableStructParent : ~Copyable
1116
1132
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
1117
1133
// CHECK: [[TEMP_MARK:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
1118
1134
// CHECK: apply {{%.*}}([[TEMP_MARK]], {{%.*}}, [[LOAD_BORROW]])
1119
- // CHECK: apply {{%.*}}([[TEMP_MARK]])
1120
- // CHECK: destroy_addr [[TEMP_MARK]]
1121
1135
// CHECK: end_borrow [[LOAD_BORROW]]
1122
1136
// CHECK: end_access [[ACCESS]]
1137
+ // CHECK: apply {{%.*}}([[TEMP_MARK]])
1138
+ // CHECK: destroy_addr [[TEMP_MARK]]
1123
1139
//
1124
1140
// The second get call.
1125
1141
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[PROJECT]]
@@ -1129,10 +1145,12 @@ public struct LoadableSubscriptGetOnlyTesterNonCopyableStructParent : ~Copyable
1129
1145
// CHECK: end_borrow [[LOAD_BORROW]]
1130
1146
// CHECK: end_access [[ACCESS]]
1131
1147
//
1148
+ // CHECK: [[BORROWED_VALUE:%.*]] = begin_borrow [[VALUE]]
1132
1149
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
1133
1150
// CHECK: [[TEMP_MARK:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
1134
- // CHECK: [[BORROWED_VALUE:%.*]] = begin_borrow [[VALUE]]
1135
1151
// CHECK: apply {{%.*}}([[TEMP_MARK]], {{%.*}}, [[BORROWED_VALUE]])
1152
+ // CHECK: end_borrow [[BORROWED_VALUE]]
1153
+ // CHECK: destroy_value [[VALUE]]
1136
1154
// CHECK: apply {{%.*}}([[TEMP_MARK]])
1137
1155
// CHECK: destroy_addr [[TEMP_MARK]]
1138
1156
// } // end sil function '$s8moveonly077testSubscriptGetOnlyThroughNonCopyableParentStruct_BaseLoadable_ResultAddressE4_VaryyF'
@@ -1151,13 +1169,14 @@ public func testSubscriptGetOnlyThroughNonCopyableParentStruct_BaseLoadable_Resu
1151
1169
// CHECK: [[LOAD:%.*]] = load_borrow [[MARK]]
1152
1170
// CHECK: [[EXT:%.*]] = struct_extract [[LOAD]]
1153
1171
// CHECK: [[COPY:%.*]] = copy_value [[EXT]]
1172
+ // CHECK: [[BORROW:%.*]] = begin_borrow [[COPY]]
1154
1173
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
1155
1174
// CHECK: [[TEMP_MARK:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
1156
- // CHECK: [[BORROW:%.*]] = begin_borrow [[COPY]]
1157
1175
// CHECK: apply {{%.*}}([[TEMP_MARK]], {{%.*}}, [[BORROW]])
1176
+ // CHECK: end_borrow [[BORROW]]
1177
+ // CHECK: destroy_value [[COPY]]
1158
1178
// CHECK: apply {{%.*}}([[TEMP_MARK]])
1159
1179
// CHECK: destroy_addr [[TEMP_MARK]]
1160
- // CHECK: destroy_value [[COPY]]
1161
1180
// CHECK: end_borrow [[LOAD]]
1162
1181
// CHECK: } // end sil function '$s8moveonly077testSubscriptGetOnlyThroughNonCopyableParentStruct_BaseLoadable_ResultAddressE4_LetyyF'
1163
1182
public func testSubscriptGetOnlyThroughNonCopyableParentStruct_BaseLoadable_ResultAddressOnly_Let( ) {
@@ -1175,10 +1194,10 @@ public func testSubscriptGetOnlyThroughNonCopyableParentStruct_BaseLoadable_Resu
1175
1194
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
1176
1195
// CHECK: [[TEMP_MARK:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
1177
1196
// CHECK: apply {{%.*}}([[TEMP_MARK]], {{%.*}}, [[LOAD]])
1178
- // CHECK: apply {{%.*}}([[TEMP_MARK]])
1179
- // CHECK: destroy_addr [[TEMP_MARK]]
1180
1197
// CHECK: end_borrow [[LOAD]]
1181
1198
// CHECK: end_access [[ACCESS]]
1199
+ // CHECK: apply {{%.*}}([[TEMP_MARK]])
1200
+ // CHECK: destroy_addr [[TEMP_MARK]]
1182
1201
// CHECK: } // end sil function '$s8moveonly077testSubscriptGetOnlyThroughNonCopyableParentStruct_BaseLoadable_ResultAddressE6_InOut1myAA0lcde6TesterghjI0Vz_tF'
1183
1202
public func testSubscriptGetOnlyThroughNonCopyableParentStruct_BaseLoadable_ResultAddressOnly_InOut( m: inout LoadableSubscriptGetOnlyTesterNonCopyableStructParent ) {
1184
1203
m. tester [ 0 ] . nonMutatingFunc ( )
@@ -1193,10 +1212,10 @@ public func testSubscriptGetOnlyThroughNonCopyableParentStruct_BaseLoadable_Resu
1193
1212
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
1194
1213
// CHECK: [[TEMP_MARK:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
1195
1214
// CHECK: apply {{%.*}}([[TEMP_MARK]], {{%.*}}, [[LOAD]])
1196
- // CHECK: apply {{%.*}}([[TEMP_MARK]])
1197
- // CHECK: destroy_addr [[TEMP_MARK]]
1198
1215
// CHECK: end_borrow [[LOAD]]
1199
1216
// CHECK: end_access [[ACCESS]]
1217
+ // CHECK: apply {{%.*}}([[TEMP_MARK]])
1218
+ // CHECK: destroy_addr [[TEMP_MARK]]
1200
1219
// CHECK: } // end sil function '$s8moveonly077testSubscriptGetOnlyThroughNonCopyableParentStruct_BaseLoadable_ResultAddressE7_GlobalyyF'
1201
1220
var globalLoadableSubscriptGetOnlyTesterNonCopyableStructParent = LoadableSubscriptGetOnlyTesterNonCopyableStructParent ( )
1202
1221
public func testSubscriptGetOnlyThroughNonCopyableParentStruct_BaseLoadable_ResultAddressOnly_Global( ) {
@@ -1233,9 +1252,10 @@ public class LoadableSubscriptGetOnlyTesterClassParent {
1233
1252
// CHECK: [[TEMP2:%.*]] = alloc_stack $
1234
1253
// CHECK: [[TEMP2_MARK:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP2]]
1235
1254
// CHECK: apply {{%.*}}([[TEMP2_MARK]], {{%.*}}, [[LOAD]])
1236
- // CHECK: destroy_addr [[TEMP2_MARK]]
1237
1255
// CHECK: end_borrow [[LOAD]]
1238
1256
// CHECK: end_apply [[CORO_TOKEN]]
1257
+ // CHECK: apply {{%.*}}([[TEMP2_MARK]])
1258
+ // CHECK: destroy_addr [[TEMP2_MARK]]
1239
1259
//
1240
1260
// Second read.
1241
1261
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[PROJECT]]
@@ -1252,9 +1272,10 @@ public class LoadableSubscriptGetOnlyTesterClassParent {
1252
1272
// CHECK: [[TEMP2:%.*]] = alloc_stack $
1253
1273
// CHECK: [[TEMP2_MARK:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP2]]
1254
1274
// CHECK: apply {{%.*}}([[TEMP2_MARK]], {{%.*}}, [[LOAD]])
1255
- // CHECK: destroy_addr [[TEMP2_MARK]]
1256
1275
// CHECK: end_borrow [[LOAD]]
1257
1276
// CHECK: end_apply [[CORO_TOKEN]]
1277
+ // CHECK: apply {{%.*}}([[TEMP2_MARK]])
1278
+ // CHECK: destroy_addr [[TEMP2_MARK]]
1258
1279
//
1259
1280
// Third read. This is a case that we can't handle today due to the way the AST
1260
1281
// looks:
@@ -1280,9 +1301,9 @@ public class LoadableSubscriptGetOnlyTesterClassParent {
1280
1301
// CHECK: ([[CORO_RESULT:%.*]], [[CORO_TOKEN:%.*]]) = begin_apply {{%.*}}([[BORROW_COPYABLE_CLASS]])
1281
1302
// CHECK: [[CORO_RESULT_COPY:%.*]] = copy_value [[CORO_RESULT]]
1282
1303
// CHECK: end_apply [[CORO_TOKEN]]
1304
+ // CHECK: [[BORROW:%.*]] = begin_borrow [[CORO_RESULT_COPY]]
1283
1305
// CHECK: [[TEMP:%.*]] = alloc_stack $
1284
1306
// CHECK: [[TEMP_MARK:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
1285
- // CHECK: [[BORROW:%.*]] = begin_borrow [[CORO_RESULT_COPY]]
1286
1307
// CHECK: apply {{%.*}}([[TEMP_MARK]], {{%.*}}, [[BORROW]])
1287
1308
// CHECK: destroy_addr [[TEMP_MARK]]
1288
1309
@@ -1503,10 +1524,12 @@ public struct LoadableSubscriptGetSetTesterNonCopyableStructParent : ~Copyable {
1503
1524
// CHECK: [[VALUE:%.*]] = apply {{%.*}}([[LOAD_BORROW]])
1504
1525
// CHECK: end_borrow [[LOAD_BORROW]]
1505
1526
// CHECK: end_access [[ACCESS]]
1527
+ // CHECK: [[BORROWED_VALUE:%.*]] = begin_borrow [[VALUE]]
1506
1528
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
1507
1529
// CHECK: [[MARK_TEMP:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
1508
- // CHECK: [[BORROWED_VALUE:%.*]] = begin_borrow [[VALUE]]
1509
1530
// CHECK: apply {{%.*}}([[MARK_TEMP]], {{%.*}}, [[BORROWED_VALUE]])
1531
+ // CHECK: end_borrow [[BORROWED_VALUE]]
1532
+ // CHECK: destroy_value [[VALUE]]
1510
1533
// CHECK: apply {{%.*}}([[MARK_TEMP]])
1511
1534
// CHECK: destroy_addr [[MARK_TEMP]]
1512
1535
// } // end sil function '$s8moveonly077testSubscriptGetSetThroughNonCopyableParentStruct_BaseLoadable_ResultAddressE4_VaryyF'
@@ -1526,13 +1549,14 @@ public func testSubscriptGetSetThroughNonCopyableParentStruct_BaseLoadable_Resul
1526
1549
// CHECK: [[LOAD:%.*]] = load_borrow [[MARK]]
1527
1550
// CHECK: [[EXT:%.*]] = struct_extract [[LOAD]]
1528
1551
// CHECK: [[COPY:%.*]] = copy_value [[EXT]]
1552
+ // CHECK: [[BORROW:%.*]] = begin_borrow [[COPY]]
1529
1553
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
1530
1554
// CHECK: [[MARK_TEMP:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
1531
- // CHECK: [[BORROW:%.*]] = begin_borrow [[COPY]]
1532
1555
// CHECK: apply {{%.*}}([[MARK_TEMP]], {{%.*}}, [[BORROW]])
1556
+ // CHECK: end_borrow [[BORROW]]
1557
+ // CHECK: destroy_value [[COPY]]
1533
1558
// CHECK: apply {{%.*}}([[MARK_TEMP]])
1534
1559
// CHECK: destroy_addr [[MARK_TEMP]]
1535
- // CHECK: destroy_value [[COPY]]
1536
1560
// CHECK: end_borrow [[LOAD]]
1537
1561
// CHECK: } // end sil function '$s8moveonly84testSubscriptGetSetThroughNonCopyableParentStruct_BaseLoadable_ResultAddressOnly_LetyyF'
1538
1562
public func testSubscriptGetSetThroughNonCopyableParentStruct_BaseLoadable_ResultAddressOnly_Let( ) {
@@ -1709,10 +1733,13 @@ public class LoadableSubscriptGetSetTesterClassParent {
1709
1733
// CHECK: ([[CORO_RESULT:%.*]], [[CORO_TOKEN:%.*]]) = begin_apply {{%.*}}([[BORROW_COPYABLE_CLASS]])
1710
1734
// CHECK: [[CORO_RESULT_COPY:%.*]] = copy_value [[CORO_RESULT]]
1711
1735
// CHECK: end_apply [[CORO_TOKEN]]
1736
+ // CHECK: [[BORROW:%.*]] = begin_borrow [[CORO_RESULT_COPY]]
1712
1737
// CHECK: [[TEMP:%.*]] = alloc_stack $
1713
1738
// CHECK: [[MARK_TEMP:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
1714
- // CHECK: [[BORROW:%.*]] = begin_borrow [[CORO_RESULT_COPY]]
1715
1739
// CHECK: apply {{%.*}}([[MARK_TEMP]], {{%.*}}, [[BORROW]])
1740
+ // CHECK: end_borrow [[BORROW]]
1741
+ // CHECK: destroy_value [[CORO_RESULT_COPY]]
1742
+ // CHECK: apply {{%.*}}([[MARK_TEMP]])
1716
1743
// CHECK: destroy_addr [[MARK_TEMP]]
1717
1744
//
1718
1745
// First read
@@ -2893,10 +2920,12 @@ public struct LoadableSubscriptGetModifyTesterNonCopyableStructParent : ~Copyabl
2893
2920
// CHECK: [[VALUE:%.*]] = apply {{%.*}}([[LOAD_BORROW]])
2894
2921
// CHECK: end_borrow [[LOAD_BORROW]]
2895
2922
// CHECK: end_access [[ACCESS]]
2923
+ // CHECK: [[BORROWED_VALUE:%.*]] = begin_borrow [[VALUE]]
2896
2924
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
2897
2925
// CHECK: [[MARK_TEMP:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
2898
- // CHECK: [[BORROWED_VALUE:%.*]] = begin_borrow [[VALUE]]
2899
2926
// CHECK: apply {{%.*}}([[MARK_TEMP]], {{%.*}}, [[BORROWED_VALUE]])
2927
+ // CHECK: end_borrow [[BORROWED_VALUE]]
2928
+ // CHECK: destroy_value [[VALUE]]
2900
2929
// CHECK: apply {{%.*}}([[MARK_TEMP]])
2901
2930
// CHECK: destroy_addr [[MARK_TEMP]]
2902
2931
// } // end sil function '$s8moveonly077testSubscriptGetModifyThroughNonCopyableParentStruct_BaseLoadable_ResultAddressE4_VaryyF'
@@ -2916,13 +2945,14 @@ public func testSubscriptGetModifyThroughNonCopyableParentStruct_BaseLoadable_Re
2916
2945
// CHECK: [[LOAD:%.*]] = load_borrow [[MARK]]
2917
2946
// CHECK: [[EXT:%.*]] = struct_extract [[LOAD]]
2918
2947
// CHECK: [[COPY:%.*]] = copy_value [[EXT]]
2948
+ // CHECK: [[BORROW:%.*]] = begin_borrow [[COPY]]
2919
2949
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
2920
2950
// CHECK: [[MARK_TEMP:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
2921
- // CHECK: [[BORROW:%.*]] = begin_borrow [[COPY]]
2922
2951
// CHECK: apply {{%.*}}([[MARK_TEMP]], {{%.*}}, [[BORROW]])
2952
+ // CHECK: end_borrow [[BORROW]]
2953
+ // CHECK: destroy_value [[COPY]]
2923
2954
// CHECK: apply {{%.*}}([[MARK_TEMP]])
2924
2955
// CHECK: destroy_addr [[MARK_TEMP]]
2925
- // CHECK: destroy_value [[COPY]]
2926
2956
// CHECK: end_borrow [[LOAD]]
2927
2957
// CHECK: } // end sil function '$s8moveonly87testSubscriptGetModifyThroughNonCopyableParentStruct_BaseLoadable_ResultAddressOnly_LetyyF'
2928
2958
public func testSubscriptGetModifyThroughNonCopyableParentStruct_BaseLoadable_ResultAddressOnly_Let( ) {
@@ -3053,10 +3083,13 @@ public class LoadableSubscriptGetModifyTesterClassParent {
3053
3083
// CHECK: ([[CORO_RESULT:%.*]], [[CORO_TOKEN:%.*]]) = begin_apply {{%.*}}([[BORROW_COPYABLE_CLASS]])
3054
3084
// CHECK: [[CORO_RESULT_COPY:%.*]] = copy_value [[CORO_RESULT]]
3055
3085
// CHECK: end_apply [[CORO_TOKEN]]
3086
+ // CHECK: [[BORROW:%.*]] = begin_borrow [[CORO_RESULT_COPY]]
3056
3087
// CHECK: [[TEMP:%.*]] = alloc_stack $
3057
3088
// CHECK: [[MARK_TEMP:%.*]] = mark_must_check [consumable_and_assignable] [[TEMP]]
3058
- // CHECK: [[BORROW:%.*]] = begin_borrow [[CORO_RESULT_COPY]]
3059
3089
// CHECK: apply {{%.*}}([[MARK_TEMP]], {{%.*}}, [[BORROW]])
3090
+ // CHECK: end_borrow [[BORROW]]
3091
+ // CHECK: destroy_value [[CORO_RESULT_COPY]]
3092
+ // CHECK: apply {{%.*}}([[MARK_TEMP]])
3060
3093
// CHECK: destroy_addr [[MARK_TEMP]]
3061
3094
//
3062
3095
// First read
0 commit comments