@@ -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