Skip to content

Commit 707330c

Browse files
committed
[IRGen] Emit swift_multiPayloadEnumGeneric_destructiveInjectEnumTag
Assign swift_multiPayloadEnumGeneric_destructiveInjectEnumTag as witness function on generic multi payload enums when using layout strings
1 parent 8114ecc commit 707330c

File tree

2 files changed

+32
-3
lines changed

2 files changed

+32
-3
lines changed

lib/IRGen/GenValueWitness.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -936,12 +936,13 @@ getDestructiveInjectEnumTagFunction(IRGenModule &IGM,
936936
const EnumTypeLayoutEntry *typeLayoutEntry,
937937
GenericSignature genericSig) {
938938
if ((!typeLayoutEntry->layoutString(IGM, genericSig) &&
939-
!isRuntimeInstatiatedLayoutString(IGM, typeLayoutEntry)) ||
940-
typeLayoutEntry->isSingleton()) {
939+
!isRuntimeInstatiatedLayoutString(IGM, typeLayoutEntry))) {
940+
return nullptr;
941+
} else if (typeLayoutEntry->isSingleton()) {
941942
return nullptr;
942943
} else if (!typeLayoutEntry->isFixedSize(IGM)) {
943944
if (typeLayoutEntry->isMultiPayloadEnum()) {
944-
return nullptr;
945+
return IGM.getMultiPayloadEnumGenericDestructiveInjectEnumTagFn();
945946
} else {
946947
return IGM.getSinglePayloadEnumGenericDestructiveInjectEnumTagFn();
947948
}

test/Interpreter/layout_string_witnesses_dynamic.swift

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -618,6 +618,34 @@ func testResilientSinglePayloadEnumGenericInjectTag() {
618618

619619
testResilientSinglePayloadEnumGenericInjectTag()
620620

621+
@inline(never)
622+
func matchResilientMultiPayloadEnumGenericTag(_ x: ResilientMultiPayloadEnumGeneric<AnyObject>) -> Int {
623+
return switch x {
624+
case .nonEmpty0: 0
625+
case .nonEmpty1: 1
626+
case .empty0: 2
627+
case .empty1: 3
628+
}
629+
}
630+
631+
func testResilientMultiPayloadEnumGenericInjectTag() {
632+
let x = ResilientMultiPayloadEnumGeneric<AnyObject>.nonEmpty0(SimpleClass(x: 23))
633+
let y = ResilientMultiPayloadEnumGeneric<AnyObject>.nonEmpty1(SimpleClass(x: 32))
634+
let z = ResilientMultiPayloadEnumGeneric<AnyObject>.empty0
635+
let w = ResilientMultiPayloadEnumGeneric<AnyObject>.empty1
636+
637+
// CHECK: Enum case: 0
638+
print("Enum case: \(matchResilientMultiPayloadEnumGenericTag(x))")
639+
// CHECK: Enum case: 1
640+
print("Enum case: \(matchResilientMultiPayloadEnumGenericTag(y))")
641+
// CHECK: Enum case: 2
642+
print("Enum case: \(matchResilientMultiPayloadEnumGenericTag(z))")
643+
// CHECK: Enum case: 3
644+
print("Enum case: \(matchResilientMultiPayloadEnumGenericTag(w))")
645+
}
646+
647+
testResilientMultiPayloadEnumGenericInjectTag()
648+
621649
#if os(macOS)
622650

623651
import Foundation

0 commit comments

Comments
 (0)