Skip to content

Commit db20b55

Browse files
authored
Merge pull request #67418 from drexin/wip-fix-simple-enum-tagoffset
[IRGen] Fix extra inhabitant offset for simple single payload enums w…
2 parents f76783d + 69c8ae6 commit db20b55

File tree

3 files changed

+43
-4
lines changed

3 files changed

+43
-4
lines changed

lib/IRGen/TypeLayout.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2225,7 +2225,7 @@ bool EnumTypeLayoutEntry::buildSinglePayloadRefCountString(
22252225
unsigned extraTagByteCount = 0;
22262226
uint64_t zeroTagValue = 0;
22272227
unsigned xiBitCount = 0;
2228-
unsigned xiOffset = 0;
2228+
unsigned xiBitOffset = 0;
22292229
bool isSimple = true;
22302230

22312231
auto &payloadTI = **cases[0]->getFixedTypeInfo();
@@ -2249,8 +2249,8 @@ bool EnumTypeLayoutEntry::buildSinglePayloadRefCountString(
22492249
isSimple = false;
22502250
} else {
22512251
xiBitCount = std::min(64u, mask.countPopulation());
2252-
xiOffset = mask.countTrailingZeros();
2253-
zeroTagValue = lowValue.extractBitsAsZExtValue(xiBitCount, xiOffset);
2252+
xiBitOffset = mask.countTrailingZeros();
2253+
zeroTagValue = lowValue.extractBitsAsZExtValue(xiBitCount, xiBitOffset);
22542254
}
22552255
}
22562256
}
@@ -2279,7 +2279,7 @@ bool EnumTypeLayoutEntry::buildSinglePayloadRefCountString(
22792279

22802280
if (isSimple) {
22812281
B.addSinglePayloadEnumSimple(zeroTagValue, xiTagValues, extraTagByteCount,
2282-
xiBitCount / 8, xiOffset, cases[0]);
2282+
xiBitCount / 8, xiBitOffset / 8, cases[0]);
22832283
} else {
22842284
auto tagFn = createFixedEnumLoadTag(IGM, *this);
22852285
B.addSinglePayloadEnumFN(tagFn, extraTagByteCount, cases[0]);

test/Interpreter/Inputs/layout_string_witnesses_types.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,14 @@ public struct ComplexNesting<A, B, C, D> {
432432
}
433433
}
434434

435+
public enum SinglePayloadAnyHashableEnum {
436+
case empty0
437+
case empty1
438+
case empty2
439+
case empty3
440+
case nonEmpty(AnyHashable)
441+
}
442+
435443
internal enum InternalEnum {
436444
case a(Int, AnyObject)
437445
case b(Int)

test/Interpreter/layout_string_witnesses_static.swift

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,37 @@ func testContainsSinglePayloadSimpleClassEnumEmpty() {
464464

465465
testContainsSinglePayloadSimpleClassEnumEmpty()
466466

467+
func testSinglePayloadAnyHashableEnum() {
468+
let ptr = UnsafeMutablePointer<SinglePayloadAnyHashableEnum>.allocate(capacity: 1)
469+
470+
do {
471+
let x = SinglePayloadAnyHashableEnum.empty0
472+
testInit(ptr, to: x)
473+
}
474+
475+
do {
476+
// CHECK: empty0
477+
if case .empty0 = ptr.pointee {
478+
print("empty0")
479+
}
480+
481+
let y = SinglePayloadAnyHashableEnum.empty0
482+
483+
testAssign(ptr, from: y)
484+
}
485+
486+
// CHECK-NEXT: empty0
487+
if case .empty0 = ptr.pointee {
488+
print("empty0")
489+
}
490+
491+
testDestroy(ptr)
492+
493+
ptr.deallocate()
494+
}
495+
496+
testSinglePayloadAnyHashableEnum()
497+
467498
func testMultiPayloadEnum() {
468499
let ptr = UnsafeMutablePointer<MultiPayloadEnumWrapper>.allocate(capacity: 1)
469500

0 commit comments

Comments
 (0)