Skip to content

Commit 6fb2325

Browse files
committed
[Runtime] Fix SinglePayloadEnumSimple read offset in swift_resolve_resilientAccessors
The offset was off by 1, causing subsequent tags to not be resolved properly.
1 parent 1068536 commit 6fb2325

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

stdlib/public/runtime/BytecodeLayouts.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1034,7 +1034,7 @@ void swift::swift_resolve_resilientAccessors(uint8_t *layoutStr,
10341034
reader.skip(sizeof(uintptr_t));
10351035
break;
10361036
case RefCountingKind::SinglePayloadEnumSimple:
1037-
reader.skip((3 * sizeof(uint64_t)) + (4 * sizeof(size_t)));
1037+
reader.skip((2 * sizeof(uint64_t)) + (4 * sizeof(size_t)));
10381038
break;
10391039

10401040
case RefCountingKind::SinglePayloadEnumFN: {

test/Interpreter/layout_string_witnesses_dynamic.swift

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -974,6 +974,41 @@ func testResilientPayloadSinglePayloadEnum() {
974974

975975
testResilientPayloadSinglePayloadEnum()
976976

977+
struct SinglePayloadSimpleResolve {
978+
let x: ResilientSinglePayloadEnumSimple
979+
let y: ResilientSinglePayloadEnumComplex
980+
}
981+
982+
func testSinglePayloadSimpleResolve() {
983+
let ptr = allocateInternalGenericPtr(of: SinglePayloadSimpleResolve.self)
984+
985+
do {
986+
let x = SinglePayloadSimpleResolve(x: .nonEmpty(SimpleClass(x: 23)), y: .nonEmpty(.nonEmpty1(SimpleClass(x: 23))))
987+
testGenericInit(ptr, to: x)
988+
}
989+
990+
do {
991+
let y = SinglePayloadSimpleResolve(x: .nonEmpty(SimpleClass(x: 32)), y: .nonEmpty(.nonEmpty1(SimpleClass(x: 32))))
992+
// CHECK: Before deinit
993+
print("Before deinit")
994+
995+
// CHECK-NEXT: SimpleClass deinitialized!
996+
// CHECK-NEXT: SimpleClass deinitialized!
997+
testGenericAssign(ptr, from: y)
998+
}
999+
1000+
// CHECK-NEXT: Before deinit
1001+
print("Before deinit")
1002+
1003+
// CHECK-NEXT: SimpleClass deinitialized!
1004+
// CHECK-NEXT: SimpleClass deinitialized!
1005+
testGenericDestroy(ptr, of: SinglePayloadSimpleResolve.self)
1006+
1007+
ptr.deallocate()
1008+
}
1009+
1010+
testSinglePayloadSimpleResolve()
1011+
9771012
#if os(macOS)
9781013

9791014
import Foundation

0 commit comments

Comments
 (0)