Skip to content

Commit db7580f

Browse files
authored
Merge pull request #73426 from drexin/wip-127379960
[Runtime] Mask out spare bits after copying for Error in CVW
2 parents bf6058b + 101f8a4 commit db7580f

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)