Skip to content

Commit 3854205

Browse files
authored
Merge pull request #85745 from blevine1/address-only-enum-trivial-load-payload
[SILGen] Fix load ownership for trivial tuple elements in consuming switch
2 parents 4f35419 + e93ea1d commit 3854205

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

lib/SILGen/SILGenPattern.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2672,7 +2672,9 @@ void PatternMatchEmission::emitDestructiveCaseBlocks() {
26722672
for (unsigned i = 0, e = p->getNumElements(); i < e; ++i) {
26732673
SILValue element = SGF.B.createTupleElementAddr(p, baseAddr, i);
26742674
if (element->getType().isLoadable(SGF.F)) {
2675-
element = SGF.B.createLoad(p, element, LoadOwnershipQualifier::Take);
2675+
element =
2676+
SGF.getTypeLowering(element->getType())
2677+
.emitLoad(SGF.B, p, element, LoadOwnershipQualifier::Take);
26762678
}
26772679
visit(p->getElement(i).getPattern(),
26782680
SGF.emitManagedRValueWithCleanup(element));
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// RUN: %target-swift-emit-silgen %s | %FileCheck %s
2+
// RUN: %target-swift-emit-sil %s -sil-verify-all
3+
4+
// Test that consuming switch on address only enum with trivial payload case correctly use load [trivial]
5+
// instead of load [take].
6+
7+
protocol AProtocol {}
8+
9+
enum AddressOnly: ~Copyable {
10+
case unloadableAndInt(any AProtocol, Int)
11+
}
12+
13+
// CHECK-LABEL: sil hidden [ossa] @$s33address_only_enum_trivial_payload14consumeTheEnum
14+
func consumeTheEnum(_ value: consuming AddressOnly) -> Int {
15+
// CHECK: switch_enum_addr {{.*}}AddressOnly.unloadableAndInt
16+
switch consume value {
17+
case .unloadableAndInt(_, let count):
18+
// CHECK: [[ADDR:%[0-9]+]] = unchecked_take_enum_data_addr
19+
// CHECK: [[TRIVIAL_ADDR:%[0-9]+]] = tuple_element_addr [[ADDR]], 1
20+
// CHECK: load [trivial] [[TRIVIAL_ADDR]]
21+
return count
22+
}
23+
}

0 commit comments

Comments
 (0)