Skip to content

Commit 689ffbe

Browse files
committed
A separate "indirect case" counter didn't properly distinguish generic indirect vs. non-generic indirect.
Counting indirect cases as regular non-empty cases is a better fit.
1 parent fe90ad5 commit 689ffbe

File tree

1 file changed

+11
-5
lines changed

1 file changed

+11
-5
lines changed

stdlib/public/RemoteInspection/TypeLowering.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1960,7 +1960,6 @@ class EnumTypeInfoBuilder {
19601960
unsigned NonPayloadCases = 0; // `case a`
19611961
unsigned NonGenericEmptyPayloadCases = 0; // `case a(Void)` or `case b(Never)`
19621962
unsigned NonGenericNonEmptyPayloadCases = 0; // `case a(Int)` or `case d([Int?])`
1963-
unsigned IndirectPayloadCases = 0; // `indirect case a(T)` or `indirect case a(Int)`
19641963
unsigned GenericPayloadCases = 0; // `case a(T)` or `case a([String : (Int, T)])`
19651964

19661965
// For a single-payload enum, this is the only payload
@@ -1985,14 +1984,21 @@ class EnumTypeInfoBuilder {
19851984
// We don't have typeinfo; something is very broken.
19861985
Invalid = true;
19871986
return nullptr;
1988-
} else if (Case.Indirect) {
1989-
++IndirectPayloadCases;
1987+
} else if (Case.Indirect) {
1988+
// An indirect case is non-empty (it stores a pointer)
1989+
// and acts like a non-generic (because the pointer has spare bits)
1990+
++NonGenericNonEmptyPayloadCases;
1991+
LastPayloadCaseTR = CaseTR;
19901992
} else if (Case.Generic) {
1993+
// Otherwise, we never consider spare bits from generic cases
19911994
++GenericPayloadCases;
19921995
LastPayloadCaseTR = CaseTR;
19931996
} else if (CaseTI->getSize() == 0) {
1997+
// Needed to distinguish a "single-payload enum"
1998+
// whose only case is empty.
19941999
++NonGenericEmptyPayloadCases;
19952000
} else {
2001+
// Finally, we consider spare bits from regular payloads
19962002
++NonGenericNonEmptyPayloadCases;
19972003
LastPayloadCaseTR = CaseTR;
19982004
}
@@ -2003,7 +2009,7 @@ class EnumTypeInfoBuilder {
20032009
// same as cases with no payload, and generic cases are always considered
20042010
// non-empty.
20052011
unsigned EffectiveNoPayloadCases = NonPayloadCases + NonGenericEmptyPayloadCases;
2006-
unsigned EffectivePayloadCases = IndirectPayloadCases + GenericPayloadCases + NonGenericNonEmptyPayloadCases;
2012+
unsigned EffectivePayloadCases = GenericPayloadCases + NonGenericNonEmptyPayloadCases;
20072013

20082014
if (Cases.empty()) {
20092015
return TC.makeTypeInfo<EmptyEnumTypeInfo>(Cases);
@@ -2015,7 +2021,7 @@ class EnumTypeInfoBuilder {
20152021
// with zero-sized payloads get treated for layout purposes as non-payload
20162022
// cases.
20172023
EnumKind Kind;
2018-
switch (IndirectPayloadCases + GenericPayloadCases + NonGenericEmptyPayloadCases + NonGenericNonEmptyPayloadCases) {
2024+
switch (GenericPayloadCases + NonGenericEmptyPayloadCases + NonGenericNonEmptyPayloadCases) {
20192025
case 0: Kind = EnumKind::NoPayloadEnum; break;
20202026
case 1: Kind = EnumKind::SinglePayloadEnum; break;
20212027
default: Kind = EnumKind::MultiPayloadEnum; break;

0 commit comments

Comments
 (0)