Skip to content

Commit 599cd1f

Browse files
Merge pull request #62468 from nate-chandler/opaque-values/3/20221207
[OpaqueValues] Handle indirect resilient switch.
2 parents d5e8625 + eae4a8b commit 599cd1f

File tree

2 files changed

+31
-1
lines changed

2 files changed

+31
-1
lines changed

lib/SILGen/SILGenPattern.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1978,7 +1978,7 @@ void PatternMatchEmission::emitEnumElementObjectDispatch(
19781978
ManagedValue boxedValue =
19791979
SGF.B.createProjectBox(loc, eltCMV.getFinalManagedValue(), 0);
19801980
eltTL = &SGF.getTypeLowering(boxedValue.getType());
1981-
if (eltTL->isLoadable()) {
1981+
if (eltTL->isLoadable() || !SGF.silConv.useLoweredAddresses()) {
19821982
boxedValue = SGF.B.createLoadBorrow(loc, boxedValue);
19831983
eltCMV = {boxedValue, CastConsumptionKind::BorrowAlways};
19841984
} else {
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// RUN: %target-swift-emit-silgen -enable-sil-opaque-values -Xllvm -sil-full-demangle -enable-library-evolution %s | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-runtime
2+
3+
4+
// CHECK-LABEL: sil [ossa] @$s30opaque_values_silgen_resilient10OneOfTheseO4hash4intoys6HasherVz_tF : {{.*}} {
5+
// CHECK: {{bb[0-9]+}}({{%[^,]+}} : $*Hasher, [[ENUM:%[^,]+]] : @guaranteed $OneOfThese):
6+
// CHECK: switch_enum [[ENUM]] : $OneOfThese, case #OneOfThese.loadable!enumelt: [[LOADABLE:bb[0-9]+]], case #OneOfThese.resilient!enumelt: [[RESILIENT:bb[0-9]+]]
7+
// CHECK: [[LOADABLE]]([[LOADABLE_BOX:%[^,]+]] :
8+
// CHECK: [[LOADABLE_ADDR:%[^,]+]] = project_box [[LOADABLE_BOX]]
9+
// CHECK: load_borrow [[LOADABLE_ADDR]] : $*OneOfThese.Loadable
10+
// CHECK: [[RESILIENT]]([[RESILIENT_BOX:%[^,]+]] :
11+
// CHECK: [[RESILIENT_ADDR:%[^,]+]] = project_box [[RESILIENT_BOX]]
12+
// CHECK: load_borrow [[RESILIENT_ADDR]] : $*OneOfThese.Resilient
13+
// CHECK-LABEL: } // end sil function '$s30opaque_values_silgen_resilient10OneOfTheseO4hash4intoys6HasherVz_tF'
14+
15+
@frozen
16+
public indirect enum OneOfThese : Hashable {
17+
@frozen
18+
public struct Loadable : Hashable {
19+
var o: AnyHashable
20+
var i: Int
21+
}
22+
case loadable(Loadable)
23+
public struct Resilient : Hashable {
24+
var o: AnyHashable
25+
var i: Int
26+
}
27+
case resilient(Resilient)
28+
}
29+
30+

0 commit comments

Comments
 (0)