Skip to content

Commit d47cded

Browse files
committed
IRGen: Implement ResilientEnumImplStrategy::getSchema()
Turns out this is also used for address-only types.
1 parent f88afc1 commit d47cded

File tree

2 files changed

+22
-7
lines changed

2 files changed

+22
-7
lines changed

lib/IRGen/GenEnum.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4386,6 +4386,11 @@ namespace {
43864386
const override {
43874387
emitDestroyCall(IGF, T, addr.getAddress());
43884388
}
4389+
4390+
void getSchema(ExplosionSchema &schema) const override {
4391+
schema.add(ExplosionSchema::Element::forAggregate(getStorageType(),
4392+
TI->getBestKnownAlignment()));
4393+
}
43894394

43904395
// \group Operations for loadable enums
43914396

@@ -4438,10 +4443,6 @@ namespace {
44384443
llvm_unreachable("resilient enums are always indirect");
44394444
}
44404445

4441-
void getSchema(ExplosionSchema &schema) const override {
4442-
llvm_unreachable("resilient enums are always indirect");
4443-
}
4444-
44454446
unsigned getExplosionSize() const override {
44464447
llvm_unreachable("resilient enums are always indirect");
44474448
}

test/IRGen/enum_resilience.swift

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ public func constructResilientEnumPayload(s: Size) -> Medium {
136136
return Medium.Postcard(s)
137137
}
138138

139-
// CHECK-LABEL: define {{i32|i64}} @_TF15enum_resilience18indirectSwitchTestFO14resilient_enum6MediumSi(%swift.opaque* noalias nocapture)
139+
// CHECK-LABEL: define {{i32|i64}} @_TF15enum_resilience19resilientSwitchTestFO14resilient_enum6MediumSi(%swift.opaque* noalias nocapture)
140140
// CHECK: [[BUFFER:%.*]] = alloca [[BUFFER_TYPE:\[(12|24) x i8\]]]
141141

142142
// CHECK: [[METADATA:%.*]] = call %swift.type* @_TMaO14resilient_enum6Medium()
@@ -175,15 +175,29 @@ public func constructResilientEnumPayload(s: Size) -> Medium {
175175
// CHECK: ; <label>:[[END]]
176176
// CHECK: ret
177177

178-
public func indirectSwitchTest(m: Medium) -> Int {
178+
public func resilientSwitchTest(m: Medium) -> Int {
179179
switch m {
180180
case .Paper:
181181
return 1
182182
case .Canvas:
183183
return 2
184184
case .Pamphlet(let m):
185-
return indirectSwitchTest(m)
185+
return resilientSwitchTest(m)
186186
default:
187187
return 3
188188
}
189189
}
190+
191+
public func reabstraction<T>(f: Medium -> T) {}
192+
193+
// CHECK-LABEL: define void @_TF15enum_resilience25resilientEnumPartialApplyFFO14resilient_enum6MediumSiT_(i8*, %swift.refcounted*)
194+
public func resilientEnumPartialApply(f: Medium -> Int) {
195+
196+
// CHECK: [[CONTEXT:%.*]] = call noalias %swift.refcounted* @swift_allocObject
197+
// CHECK: call void @_TF15enum_resilience13reabstractionurFFO14resilient_enum6MediumxT_(i8* bitcast (void (%Si*, %swift.opaque*, %swift.refcounted*)* @_TPA__TTRXFo_iO14resilient_enum6Medium_dSi_XFo_iS0__iSi_ to i8*), %swift.refcounted* [[CONTEXT:%.*]], %swift.type* @_TMSi)
198+
reabstraction(f)
199+
200+
// CHECK: ret void
201+
}
202+
203+
// CHECK-LABEL: define internal void @_TPA__TTRXFo_iO14resilient_enum6Medium_dSi_XFo_iS0__iSi_(%Si* noalias nocapture sret, %swift.opaque* noalias nocapture, %swift.refcounted*)

0 commit comments

Comments
 (0)