Skip to content

Commit a153286

Browse files
committed
Merge remote-tracking branch 'origin/master' into master-next
2 parents 55e3e43 + 7461bfa commit a153286

File tree

7 files changed

+220
-163
lines changed

7 files changed

+220
-163
lines changed

lib/SILGen/ManagedValue.h

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,14 @@ class ConsumableManagedValue {
367367
/// Create a CMV with a specific value and consumption rule.
368368
/*implicit*/ ConsumableManagedValue(ManagedValue value,
369369
CastConsumptionKind finalConsumption)
370-
: Value(value), FinalConsumption(finalConsumption) {}
370+
: Value(value), FinalConsumption(finalConsumption) {
371+
assert((value.getType().isObject() ||
372+
finalConsumption != CastConsumptionKind::BorrowAlways) &&
373+
"Can not borrow always a value");
374+
assert((value.getType().isAddress() ||
375+
finalConsumption != CastConsumptionKind::CopyOnSuccess) &&
376+
"Can not copy on success a value.");
377+
}
371378

372379
/// Create a CMV for a value of trivial type.
373380
static ConsumableManagedValue forUnmanaged(SILValue value) {
@@ -415,8 +422,12 @@ class ConsumableManagedValue {
415422

416423
/// Return a managed value that's appropriate for borrowing this
417424
/// value and promising not to consume it.
418-
ConsumableManagedValue asBorrowedOperand() const {
419-
return { asUnmanagedValue(), CastConsumptionKind::CopyOnSuccess };
425+
ConsumableManagedValue asBorrowedOperand(SILGenFunction &SGF,
426+
SILLocation loc) const {
427+
if (getType().isAddress())
428+
return {asUnmanagedValue(), CastConsumptionKind::CopyOnSuccess};
429+
return {asUnmanagedValue().borrow(SGF, loc),
430+
CastConsumptionKind::BorrowAlways};
420431
}
421432

422433
/// Return a managed value that's appropriate for copying this value and

lib/SILGen/SILGenPattern.cpp

Lines changed: 165 additions & 111 deletions
Large diffs are not rendered by default.

test/SILGen/errors.swift

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,7 @@ func dont_return<T>(_ argument: T) throws -> T {
114114
// Catch HomeworkError.
115115
// CHECK: [[IS_HWE]]:
116116
// CHECK-NEXT: [[T0_ORIG:%.*]] = load [take] [[DEST_TEMP]] : $*HomeworkError
117-
// CHECK-NEXT: [[T0_COPY:%.*]] = copy_value [[T0_ORIG]]
118-
// CHECK-NEXT: switch_enum [[T0_COPY]] : $HomeworkError, case #HomeworkError.CatAteIt!enumelt.1: [[MATCH:bb[0-9]+]], default [[NO_MATCH:bb[0-9]+]]
117+
// CHECK-NEXT: switch_enum [[T0_ORIG]] : $HomeworkError, case #HomeworkError.CatAteIt!enumelt.1: [[MATCH:bb[0-9]+]], default [[NO_MATCH:bb[0-9]+]]
119118

120119
// Catch HomeworkError.CatAteIt.
121120
// CHECK: [[MATCH]]([[T0:%.*]] : @owned $Cat):
@@ -124,7 +123,6 @@ func dont_return<T>(_ argument: T) throws -> T {
124123
// CHECK-NEXT: [[T0_COPY:%.*]] = copy_value [[BORROWED_T0]]
125124
// CHECK-NEXT: end_borrow [[BORROWED_T0]]
126125
// CHECK-NEXT: destroy_value [[T0]]
127-
// CHECK-NEXT: destroy_value [[T0_ORIG]]
128126
// CHECK-NEXT: dealloc_stack [[DEST_TEMP]]
129127
// CHECK-NEXT: destroy_addr [[SRC_TEMP]]
130128
// CHECK-NEXT: dealloc_stack [[SRC_TEMP]]
@@ -135,7 +133,6 @@ func dont_return<T>(_ argument: T) throws -> T {
135133
// Catch other HomeworkErrors.
136134
// CHECK: [[NO_MATCH]]([[CATCHALL_ERROR:%.*]] : @owned $HomeworkError):
137135
// CHECK-NEXT: destroy_value [[CATCHALL_ERROR]]
138-
// CHECK-NEXT: destroy_value [[T0_ORIG]]
139136
// CHECK-NEXT: dealloc_stack [[DEST_TEMP]]
140137
// CHECK-NEXT: destroy_addr [[SRC_TEMP]]
141138
// CHECK-NEXT: dealloc_stack [[SRC_TEMP]]

test/SILGen/indirect_enum.swift

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,7 @@ func switchTreeA<T>(_ x: TreeA<T>) {
152152
// -- x +2
153153
// CHECK: [[ARG_COPY:%.*]] = copy_value [[ARG]]
154154
// CHECK: [[BORROWED_ARG_COPY:%.*]] = begin_borrow [[ARG_COPY]]
155-
// CHECK: [[ARG_COPY_2:%.*]] = copy_value [[BORROWED_ARG_COPY]]
156-
// CHECK: switch_enum [[ARG_COPY_2]] : $TreeA<T>,
155+
// CHECK: switch_enum [[BORROWED_ARG_COPY]] : $TreeA<T>,
157156
// CHECK: case #TreeA.Nil!enumelt: [[NIL_CASE:bb1]],
158157
// CHECK: case #TreeA.Leaf!enumelt.1: [[LEAF_CASE:bb2]],
159158
// CHECK: case #TreeA.Branch!enumelt.1: [[BRANCH_CASE:bb3]],
@@ -163,48 +162,42 @@ func switchTreeA<T>(_ x: TreeA<T>) {
163162
// CHECK: br [[OUTER_CONT:bb[0-9]+]]
164163
case .Nil:
165164
a()
166-
// CHECK: [[LEAF_CASE]]([[LEAF_BOX:%.*]] : @owned $<τ_0_0> { var τ_0_0 } <T>):
165+
// CHECK: [[LEAF_CASE]]([[LEAF_BOX:%.*]] : @guaranteed $<τ_0_0> { var τ_0_0 } <T>):
167166
// CHECK: [[VALUE:%.*]] = project_box [[LEAF_BOX]]
168167
// CHECK: copy_addr [[VALUE]] to [initialization] [[X:%.*]] : $*T
169168
// CHECK: function_ref @$s13indirect_enum1b{{[_0-9a-zA-Z]*}}F
170169
// CHECK: destroy_addr [[X]]
171170
// CHECK: dealloc_stack [[X]]
172171
// -- x +1
173-
// CHECK: destroy_value [[LEAF_BOX]]
174172
// CHECK: br [[OUTER_CONT]]
175173
case .Leaf(let x):
176174
b(x)
177175

178-
// CHECK: [[BRANCH_CASE]]([[NODE_BOX:%.*]] : @owned $<τ_0_0> { var (left: TreeA<τ_0_0>, right: TreeA<τ_0_0>) } <T>):
176+
// CHECK: [[BRANCH_CASE]]([[NODE_BOX:%.*]] : @guaranteed $<τ_0_0> { var (left: TreeA<τ_0_0>, right: TreeA<τ_0_0>) } <T>):
179177
// CHECK: [[TUPLE_ADDR:%.*]] = project_box [[NODE_BOX]]
180178
// CHECK: [[TUPLE:%.*]] = load_borrow [[TUPLE_ADDR]]
181179
// CHECK: ([[LEFT:%.*]], [[RIGHT:%.*]]) = destructure_tuple [[TUPLE]]
182-
// CHECK: [[LEFT_COPY:%.*]] = copy_value [[LEFT]]
183-
// CHECK: switch_enum [[LEFT_COPY]] : $TreeA<T>,
180+
// CHECK: switch_enum [[LEFT]] : $TreeA<T>,
184181
// CHECK: case #TreeA.Leaf!enumelt.1: [[LEAF_CASE_LEFT:bb[0-9]+]],
185182
// CHECK: default [[FAIL_LEFT:bb[0-9]+]]
186183

187-
// CHECK: [[LEAF_CASE_LEFT]]([[LEFT_LEAF_BOX:%.*]] : @owned $<τ_0_0> { var τ_0_0 } <T>):
184+
// CHECK: [[LEAF_CASE_LEFT]]([[LEFT_LEAF_BOX:%.*]] : @guaranteed $<τ_0_0> { var τ_0_0 } <T>):
188185
// CHECK: [[LEFT_LEAF_VALUE:%.*]] = project_box [[LEFT_LEAF_BOX]]
189-
// CHECK: [[RIGHT_COPY:%.*]] = copy_value [[RIGHT]]
190-
// CHECK: switch_enum [[RIGHT_COPY]] : $TreeA<T>,
186+
// CHECK: switch_enum [[RIGHT]] : $TreeA<T>,
191187
// CHECK: case #TreeA.Leaf!enumelt.1: [[LEAF_CASE_RIGHT:bb[0-9]+]],
192188
// CHECK: default [[FAIL_RIGHT:bb[0-9]+]]
193189

194-
// CHECK: [[LEAF_CASE_RIGHT]]([[RIGHT_LEAF_BOX:%.*]] : @owned $<τ_0_0> { var τ_0_0 } <T>):
190+
// CHECK: [[LEAF_CASE_RIGHT]]([[RIGHT_LEAF_BOX:%.*]] : @guaranteed $<τ_0_0> { var τ_0_0 } <T>):
195191
// CHECK: [[RIGHT_LEAF_VALUE:%.*]] = project_box [[RIGHT_LEAF_BOX]]
196192
// CHECK: copy_addr [[LEFT_LEAF_VALUE]]
197193
// CHECK: copy_addr [[RIGHT_LEAF_VALUE]]
198194
// -- x +1
199-
// CHECK: destroy_value [[NODE_BOX]]
200195
// CHECK: br [[OUTER_CONT]]
201196

202-
// CHECK: [[FAIL_RIGHT]]([[DEFAULT_VAL:%.*]] :
203-
// CHECK: destroy_value [[DEFAULT_VAL]]
197+
// CHECK: [[FAIL_RIGHT]]([[DEFAULT_VAL:%.*]] : @guaranteed
204198
// CHECK: br [[DEFAULT:bb[0-9]+]]
205199

206-
// CHECK: [[FAIL_LEFT]]([[DEFAULT_VAL:%.*]] :
207-
// CHECK: destroy_value [[DEFAULT_VAL]]
200+
// CHECK: [[FAIL_LEFT]]([[DEFAULT_VAL:%.*]] : @guaranteed
208201
// CHECK: br [[DEFAULT]]
209202

210203
case .Branch(.Leaf(let x), .Leaf(let y)):

test/SILGen/switch.swift

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
2-
// RUN: %target-swift-emit-silgen -module-name switch %s | %FileCheck %s
1+
// RUN: %target-swift-emit-silgen -enable-sil-ownership -module-name switch %s | %FileCheck %s
32

43
func markUsed<T>(_ t: T) {}
54

@@ -722,6 +721,7 @@ func test_union_1(u: MaybePair) {
722721
func test_union_3(u: MaybePair) {
723722
// CHECK: bb0([[ARG:%.*]] : @guaranteed $MaybePair):
724723
// CHECK: [[ARG_COPY:%.*]] = copy_value [[ARG]]
724+
// CHECK: [[SUBJECT:%.*]] = begin_borrow [[ARG_COPY]]
725725
// CHECK: switch_enum [[SUBJECT]] : $MaybePair,
726726
// CHECK: case #MaybePair.Neither!enumelt: [[IS_NEITHER:bb[0-9]+]],
727727
// CHECK: case #MaybePair.Left!enumelt.1: [[IS_LEFT:bb[0-9]+]],
@@ -740,14 +740,13 @@ func test_union_3(u: MaybePair) {
740740
// CHECK: br [[CONT]]
741741
b()
742742

743-
// CHECK: [[IS_RIGHT]]([[STR:%.*]] : @owned $String):
743+
// CHECK: [[IS_RIGHT]]([[STR:%.*]] : @guaranteed $String):
744744
case .Right:
745-
// CHECK: destroy_value [[STR]] : $String
746745
// CHECK: function_ref @$s6switch1cyyF
747746
// CHECK: br [[CONT]]
748747
c()
749748

750-
// CHECK: [[DEFAULT]]:
749+
// CHECK: [[DEFAULT]](
751750
// -- Ensure the fully-opaque value is destroyed in the default case.
752751
// CHECK: destroy_value [[ARG_COPY]] :
753752
// CHECK: function_ref @$s6switch1dyyF
@@ -923,21 +922,21 @@ func test_switch_two_unions(x: Foo, y: Foo) {
923922
// CHECK: function_ref @$s6switch1ayyF
924923
a()
925924

926-
// CHECK: [[IS_NOT_CASE1]]:
925+
// CHECK: [[IS_NOT_CASE1]](
927926
// CHECK: switch_enum [[X]] : $Foo, case #Foo.B!enumelt: [[IS_CASE2:bb[0-9]+]], default [[IS_NOT_CASE2:bb[0-9]+]]
928927
// CHECK: [[IS_CASE2]]:
929928
case (Foo.B, _):
930929
// CHECK: function_ref @$s6switch1byyF
931930
b()
932931

933-
// CHECK: [[IS_NOT_CASE2]]:
932+
// CHECK: [[IS_NOT_CASE2]](
934933
// CHECK: switch_enum [[Y]] : $Foo, case #Foo.B!enumelt: [[IS_CASE3:bb[0-9]+]], default [[UNREACHABLE:bb[0-9]+]]
935934
// CHECK: [[IS_CASE3]]:
936935
case (_, Foo.B):
937936
// CHECK: function_ref @$s6switch1cyyF
938937
c()
939938

940-
// CHECK: [[UNREACHABLE]]:
939+
// CHECK: [[UNREACHABLE]](
941940
// CHECK: unreachable
942941
}
943942
}
@@ -981,7 +980,7 @@ enum ABC { case A, B, C }
981980
// CHECK: switch_enum [[X]] : $ABC, case #ABC.A!enumelt: [[X_A:bb[0-9]+]], default [[X_NOT_A:bb[0-9]+]]
982981
// CHECK: [[X_A]]:
983982
// CHECK: function_ref @$s6switch1ayyF
984-
// CHECK: [[X_NOT_A]]:
983+
// CHECK: [[X_NOT_A]](
985984
// CHECK: switch_enum [[Y]] : $ABC, case #ABC.A!enumelt: [[Y_A:bb[0-9]+]], case #ABC.B!enumelt: [[Y_B:bb[0-9]+]], case #ABC.C!enumelt: [[Y_C:bb[0-9]+]]
986985
// CHECK-NOT: default
987986
// CHECK: [[Y_A]]:
@@ -992,7 +991,7 @@ enum ABC { case A, B, C }
992991
// CHECK: switch_enum [[X]] : $ABC, case #ABC.C!enumelt: [[X_C:bb[0-9]+]], default [[X_NOT_C:bb[0-9]+]]
993992
// CHECK: [[X_C]]:
994993
// CHECK: function_ref @$s6switch1dyyF
995-
// CHECK: [[X_NOT_C]]:
994+
// CHECK: [[X_NOT_C]](
996995
// CHECK: function_ref @$s6switch1eyyF
997996
func testTupleWildcards(_ x: ABC, _ y: ABC) {
998997
switch (x, y) {

test/SILGen/switch_ownership.swift

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -69,27 +69,24 @@ func test_switch_two_nontrivial_unions(x: NonTrivialFoo, y: NonTrivialFoo) {
6969
// CHECK: [[T0:%.*]] = tuple ([[ARG0_COPY]] : $NonTrivialFoo, [[ARG1_COPY]] : $NonTrivialFoo)
7070
// CHECK: ([[X:%.*]], [[Y:%.*]]) = destructure_tuple [[T0]]
7171
// CHECK: [[BORROWED_Y:%.*]] = begin_borrow [[Y]]
72-
// CHECK: [[BORROWED_Y_COPY:%.*]] = copy_value [[BORROWED_Y]]
73-
// CHECK: switch_enum [[BORROWED_Y_COPY]] : $NonTrivialFoo, case #NonTrivialFoo.A!enumelt.1: [[IS_CASE1:bb[0-9]+]], default [[IS_NOT_CASE1:bb[0-9]+]]
72+
// CHECK: switch_enum [[BORROWED_Y]] : $NonTrivialFoo, case #NonTrivialFoo.A!enumelt.1: [[IS_CASE1:bb[0-9]+]], default [[IS_NOT_CASE1:bb[0-9]+]]
7473

7574
switch (x, y) {
76-
// CHECK: [[IS_CASE1]]({{%.*}} : @owned $Klass)
75+
// CHECK: [[IS_CASE1]]({{%.*}} : @guaranteed $Klass)
7776
case (_, NonTrivialFoo.A):
7877
// CHECK: function_ref @$s6switch1ayyF
7978
a()
8079

81-
// CHECK: [[IS_NOT_CASE1]]({{%.*}} : @owned $NonTrivialFoo):
80+
// CHECK: [[IS_NOT_CASE1]]({{%.*}} : @guaranteed $NonTrivialFoo):
8281
// CHECK: [[BORROWED_X:%.*]] = begin_borrow [[X]]
83-
// CHECK: [[BORROWED_X_COPY:%.*]] = copy_value [[BORROWED_X]]
84-
// CHECK: switch_enum [[BORROWED_X_COPY]] : $NonTrivialFoo, case #NonTrivialFoo.B!enumelt.1: [[IS_CASE2:bb[0-9]+]], default [[IS_NOT_CASE2:bb[0-9]+]]
85-
// CHECK: [[IS_CASE2]]({{%.*}} : @owned $Klass)
82+
// CHECK: switch_enum [[BORROWED_X]] : $NonTrivialFoo, case #NonTrivialFoo.B!enumelt.1: [[IS_CASE2:bb[0-9]+]], default [[IS_NOT_CASE2:bb[0-9]+]]
83+
// CHECK: [[IS_CASE2]]({{%.*}} : @guaranteed $Klass)
8684
case (NonTrivialFoo.B, _):
8785
// CHECK: function_ref @$s6switch1byyF
8886
b()
8987

90-
// CHECK: [[IS_NOT_CASE2]]({{%.*}} : @owned $NonTrivialFoo)
91-
// CHECK: [[Y_COPY:%.*]] = copy_value [[Y]]
92-
// CHECK: switch_enum [[Y_COPY]] : $NonTrivialFoo, case #NonTrivialFoo.B!enumelt.1: [[IS_CASE3:bb[0-9]+]], default [[UNREACHABLE:bb[0-9]+]]
88+
// CHECK: [[IS_NOT_CASE2]]({{%.*}} : @guaranteed $NonTrivialFoo)
89+
// CHECK: switch_enum [[Y]] : $NonTrivialFoo, case #NonTrivialFoo.B!enumelt.1: [[IS_CASE3:bb[0-9]+]], default [[UNREACHABLE:bb[0-9]+]]
9390
// CHECK: [[IS_CASE3]]({{%.*}} : @owned $Klass):
9491
case (_, NonTrivialFoo.B):
9592
// CHECK: function_ref @$s6switch1cyyF

test/SILGen/switch_var.swift

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
2-
// RUN: %target-swift-emit-silgen -module-name switch_var %s | %FileCheck %s
1+
// RUN: %target-swift-emit-silgen -enable-sil-ownership -module-name switch_var %s | %FileCheck %s
32

43
// TODO: Implement tuple equality in the library.
54
// BLOCKED: <rdar://problem/13822406>
@@ -402,7 +401,8 @@ func test_var_return() {
402401
func test_let() {
403402
// CHECK: [[FOOS:%.*]] = function_ref @$s10switch_var4foosSSyF
404403
// CHECK: [[VAL:%.*]] = apply [[FOOS]]()
405-
// CHECK: [[VAL_COPY:%.*]] = copy_value [[VAL]]
404+
// CHECK: [[BORROWED_VAL:%.*]] = begin_borrow [[VAL]]
405+
// CHECK: [[VAL_COPY:%.*]] = copy_value [[BORROWED_VAL]]
406406
// CHECK: function_ref @$s10switch_var6runcedSbyF
407407
// CHECK: cond_br {{%.*}}, [[CASE1:bb[0-9]+]], [[NO_CASE1:bb[0-9]+]]
408408
switch foos() {
@@ -419,7 +419,8 @@ func test_let() {
419419
// CHECK: destroy_value [[VAL_COPY]]
420420
// CHECK: br [[TRY_CASE2:bb[0-9]+]]
421421
// CHECK: [[TRY_CASE2]]:
422-
// CHECK: [[VAL_COPY_2:%.*]] = copy_value [[VAL]]
422+
// CHECK: [[BORROWED_VAL_2:%.*]] = begin_borrow [[VAL]]
423+
// CHECK: [[VAL_COPY_2:%.*]] = copy_value [[BORROWED_VAL_2]]
423424
// CHECK: function_ref @$s10switch_var6fungedSbyF
424425
// CHECK: cond_br {{%.*}}, [[CASE2:bb[0-9]+]], [[NO_CASE2:bb[0-9]+]]
425426
case let y where funged():
@@ -436,7 +437,8 @@ func test_let() {
436437
// CHECK: br [[NEXT_CASE:bb6]]
437438

438439
// CHECK: [[NEXT_CASE]]:
439-
// CHECK: [[VAL_COPY_3:%.*]] = copy_value [[VAL]]
440+
// CHECK: [[BORROWED_VAL_3:%.*]] = begin_borrow [[VAL]]
441+
// CHECK: [[VAL_COPY_3:%.*]] = copy_value [[BORROWED_VAL_3]]
440442
// CHECK: function_ref @$s10switch_var4barsSSyF
441443
// CHECK: [[BORROWED_VAL_COPY_3:%.*]] = begin_borrow [[VAL_COPY_3]]
442444
// CHECK: store_borrow [[BORROWED_VAL_COPY_3]] to [[IN_ARG:%.*]] :
@@ -472,20 +474,22 @@ func test_mixed_let_var() {
472474
// CHECK: bb0:
473475
// CHECK: [[FOOS:%.*]] = function_ref @$s10switch_var4foosSSyF
474476
// CHECK: [[VAL:%.*]] = apply [[FOOS]]()
477+
// CHECK: [[BORROWED_VAL:%.*]] = begin_borrow [[VAL]]
475478
switch foos() {
476479

477480
// First pattern.
478481
// CHECK: [[BOX:%.*]] = alloc_box ${ var String }, var, name "x"
479482
// CHECK: [[PBOX:%.*]] = project_box [[BOX]]
480-
// CHECK: [[VAL_COPY:%.*]] = copy_value [[VAL]]
483+
// CHECK: [[VAL_COPY:%.*]] = copy_value [[BORROWED_VAL]]
481484
// CHECK: store [[VAL_COPY]] to [init] [[PBOX]]
482485
// CHECK: cond_br {{.*}}, [[CASE1:bb[0-9]+]], [[NOCASE1:bb[0-9]+]]
483486
case var x where runced():
484487
// CHECK: [[CASE1]]:
485488
// CHECK: [[READ:%.*]] = begin_access [read] [unknown] [[PBOX]]
486489
// CHECK: [[X:%.*]] = load [copy] [[READ]]
490+
// CHECK: [[BORROWED_X:%.*]] = begin_borrow [[X]]
487491
// CHECK: [[A:%.*]] = function_ref @$s10switch_var1a1xySS_tF
488-
// CHECK: apply [[A]]([[X]])
492+
// CHECK: apply [[A]]([[BORROWED_X]])
489493
// CHECK: destroy_value [[BOX]]
490494
// CHECK: br [[CONT:bb[0-9]+]]
491495
a(x: x)
@@ -495,7 +499,8 @@ func test_mixed_let_var() {
495499
// CHECK: br [[NEXT_PATTERN:bb[0-9]+]]
496500

497501
// CHECK: [[NEXT_PATTERN]]:
498-
// CHECK: [[VAL_COPY:%.*]] = copy_value [[VAL]]
502+
// CHECK: [[BORROWED_VAL:%.*]] = begin_borrow [[VAL]]
503+
// CHECK: [[VAL_COPY:%.*]] = copy_value [[BORROWED_VAL]]
499504
// CHECK: cond_br {{.*}}, [[CASE2:bb[0-9]+]], [[NOCASE2:bb[0-9]+]]
500505
case let y where funged():
501506

@@ -514,7 +519,8 @@ func test_mixed_let_var() {
514519
// CHECK: br [[NEXT_CASE:bb[0-9]+]]
515520

516521
// CHECK: [[NEXT_CASE]]
517-
// CHECK: [[VAL_COPY:%.*]] = copy_value [[VAL]]
522+
// CHECK: [[BORROWED_VAL:%.*]] = begin_borrow [[VAL]]
523+
// CHECK: [[VAL_COPY:%.*]] = copy_value [[BORROWED_VAL]]
518524
// CHECK: [[BORROWED_VAL_COPY:%.*]] = begin_borrow [[VAL_COPY]]
519525
// CHECK: store_borrow [[BORROWED_VAL_COPY]] to [[TMP_VAL_COPY_ADDR:%.*]] :
520526
// CHECK: apply {{.*}}<String>({{.*}}, [[TMP_VAL_COPY_ADDR]])

0 commit comments

Comments
 (0)