@@ -1960,7 +1960,6 @@ class EnumTypeInfoBuilder {
1960
1960
unsigned NonPayloadCases = 0 ; // `case a`
1961
1961
unsigned NonGenericEmptyPayloadCases = 0 ; // `case a(Void)` or `case b(Never)`
1962
1962
unsigned NonGenericNonEmptyPayloadCases = 0 ; // `case a(Int)` or `case d([Int?])`
1963
- unsigned IndirectPayloadCases = 0 ; // `indirect case a(T)` or `indirect case a(Int)`
1964
1963
unsigned GenericPayloadCases = 0 ; // `case a(T)` or `case a([String : (Int, T)])`
1965
1964
1966
1965
// For a single-payload enum, this is the only payload
@@ -1985,14 +1984,21 @@ class EnumTypeInfoBuilder {
1985
1984
// We don't have typeinfo; something is very broken.
1986
1985
Invalid = true ;
1987
1986
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;
1990
1992
} else if (Case.Generic ) {
1993
+ // Otherwise, we never consider spare bits from generic cases
1991
1994
++GenericPayloadCases;
1992
1995
LastPayloadCaseTR = CaseTR;
1993
1996
} else if (CaseTI->getSize () == 0 ) {
1997
+ // Needed to distinguish a "single-payload enum"
1998
+ // whose only case is empty.
1994
1999
++NonGenericEmptyPayloadCases;
1995
2000
} else {
2001
+ // Finally, we consider spare bits from regular payloads
1996
2002
++NonGenericNonEmptyPayloadCases;
1997
2003
LastPayloadCaseTR = CaseTR;
1998
2004
}
@@ -2003,7 +2009,7 @@ class EnumTypeInfoBuilder {
2003
2009
// same as cases with no payload, and generic cases are always considered
2004
2010
// non-empty.
2005
2011
unsigned EffectiveNoPayloadCases = NonPayloadCases + NonGenericEmptyPayloadCases;
2006
- unsigned EffectivePayloadCases = IndirectPayloadCases + GenericPayloadCases + NonGenericNonEmptyPayloadCases;
2012
+ unsigned EffectivePayloadCases = GenericPayloadCases + NonGenericNonEmptyPayloadCases;
2007
2013
2008
2014
if (Cases.empty ()) {
2009
2015
return TC.makeTypeInfo <EmptyEnumTypeInfo>(Cases);
@@ -2015,7 +2021,7 @@ class EnumTypeInfoBuilder {
2015
2021
// with zero-sized payloads get treated for layout purposes as non-payload
2016
2022
// cases.
2017
2023
EnumKind Kind;
2018
- switch (IndirectPayloadCases + GenericPayloadCases + NonGenericEmptyPayloadCases + NonGenericNonEmptyPayloadCases) {
2024
+ switch (GenericPayloadCases + NonGenericEmptyPayloadCases + NonGenericNonEmptyPayloadCases) {
2019
2025
case 0 : Kind = EnumKind::NoPayloadEnum; break ;
2020
2026
case 1 : Kind = EnumKind::SinglePayloadEnum; break ;
2021
2027
default : Kind = EnumKind::MultiPayloadEnum; break ;
0 commit comments