Skip to content

Commit 101f8a4

Browse files
committed
[Runtime] Mask out spare bits after copying for Error in CVW
rdar://127379960 When the spare bits of an Error objects are used to store tag bits, this caused the enum tag to be lost, which caused the wrong enum cases to be matched.
1 parent 279f3d1 commit 101f8a4

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

stdlib/public/runtime/BytecodeLayouts.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -913,8 +913,8 @@ static void errorRetain(const Metadata *metadata, LayoutStringReader1 &reader,
913913
uintptr_t object = *(uintptr_t *)(src + _addrOffset);
914914
if (object & _swift_abi_ObjCReservedBitsMask)
915915
return;
916-
object &= ~_swift_abi_SwiftSpareBitsMask;
917916
memcpy(dest + addrOffset, &object, sizeof(SwiftError*));
917+
object &= ~_swift_abi_SwiftSpareBitsMask;
918918
addrOffset = _addrOffset + sizeof(SwiftError *);
919919
swift_errorRetain((SwiftError *)object);
920920
}

test/Interpreter/layout_string_witnesses_static.swift

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1180,6 +1180,30 @@ func testMultiPayloadError() {
11801180

11811181
testMultiPayloadError()
11821182

1183+
// Regression test for rdar://127379960
1184+
func testMultiPayloadErrorKeepsTagIntact() {
1185+
let ptr = UnsafeMutablePointer<MultiPayloadError>.allocate(capacity: 1)
1186+
1187+
// initWithTake
1188+
do {
1189+
let x = MultiPayloadError.error2(0, MyError(x: SimpleClass(x: 23)))
1190+
testInit(ptr, to: x)
1191+
}
1192+
1193+
// CHECK: Got error2!
1194+
switch ptr.pointee {
1195+
case .error1: print("Get error1!")
1196+
case .error2: print("Got error2!")
1197+
case .empty: print("Got empty!")
1198+
}
1199+
1200+
// CHECK-NEXT: SimpleClass deinitialized!
1201+
testDestroy(ptr)
1202+
ptr.deallocate()
1203+
}
1204+
1205+
testMultiPayloadErrorKeepsTagIntact()
1206+
11831207
func testCTypeAligned() {
11841208
let ptr = UnsafeMutablePointer<CTypeAligned>.allocate(capacity: 1)
11851209

0 commit comments

Comments
 (0)