Skip to content

Commit 7b66c70

Browse files
committed
[move-only] Restrict 508bf8a so it only applies if a subscript has a _read accessor.
We want the result of getters to still be separate values.
1 parent c9edaee commit 7b66c70

File tree

2 files changed

+64
-26
lines changed

2 files changed

+64
-26
lines changed

lib/SILGen/SILGenApply.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3047,7 +3047,12 @@ Expr *ArgumentSource::findStorageReferenceExprForMoveOnly(
30473047
// subscript instead.
30483048
SubscriptExpr *subscriptExpr = nullptr;
30493049
if ((subscriptExpr = dyn_cast<SubscriptExpr>(argExpr))) {
3050-
argExpr = subscriptExpr->getBase();
3050+
auto *decl = cast<SubscriptDecl>(subscriptExpr->getDecl().getDecl());
3051+
if (decl->getReadImpl() != ReadImplKind::Read) {
3052+
subscriptExpr = nullptr;
3053+
} else {
3054+
argExpr = subscriptExpr->getBase();
3055+
}
30513056
}
30523057

30533058
// If there's a load around the outer part of this arg expr, look past it.

test/SILGen/moveonly.swift

Lines changed: 58 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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'
10381052
public 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'
10771093
public 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'
10961112
var globalLoadableSubscriptGetOnlyTester = LoadableSubscriptGetOnlyTester()
10971113
public 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'
11631182
public 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'
11831202
public 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'
12011220
var globalLoadableSubscriptGetOnlyTesterNonCopyableStructParent = LoadableSubscriptGetOnlyTesterNonCopyableStructParent()
12021221
public 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'
15381562
public 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'
29282958
public 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

Comments
 (0)