1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 20:42:21 +02:00

Fixed exhaustive switch case test with const enums

This commit is contained in:
Brian Fiete 2021-10-04 07:50:05 -07:00
parent 5731b15b05
commit 63a87cbe57
2 changed files with 32 additions and 18 deletions

View file

@ -4767,31 +4767,38 @@ void BfModule::Visit(BfSwitchStatement* switchStmt)
{
if (switchValue.mType->IsEnum())
{
auto enumType = switchValue.mType->ToTypeInstance();
if (enumType->IsPayloadEnum())
if (hadConstMatch)
{
int lastTagId = -1;
for (auto& field : enumType->mFieldInstances)
{
auto fieldDef = field.GetFieldDef();
if (fieldDef == NULL)
continue;
if (field.mDataIdx < 0)
lastTagId = -field.mDataIdx - 1;
}
isComprehensive = lastTagId == (int)handledCases.size() - 1;
// Already handled
}
else
{
for (auto& field : enumType->mFieldInstances)
auto enumType = switchValue.mType->ToTypeInstance();
if (enumType->IsPayloadEnum())
{
auto fieldDef = field.GetFieldDef();
if ((fieldDef != NULL) && (fieldDef->mFieldDeclaration != NULL) && (fieldDef->mFieldDeclaration->mTypeRef == NULL))
int lastTagId = -1;
for (auto& field : enumType->mFieldInstances)
{
if (field.mConstIdx != -1)
auto fieldDef = field.GetFieldDef();
if (fieldDef == NULL)
continue;
if (field.mDataIdx < 0)
lastTagId = -field.mDataIdx - 1;
}
isComprehensive = lastTagId == (int)handledCases.size() - 1;
}
else
{
for (auto& field : enumType->mFieldInstances)
{
auto fieldDef = field.GetFieldDef();
if ((fieldDef != NULL) && (fieldDef->mFieldDeclaration != NULL) && (fieldDef->mFieldDeclaration->mTypeRef == NULL))
{
auto constant = enumType->mConstHolder->GetConstantById(field.mConstIdx);
isComprehensive &= handledCases.ContainsKey(constant->mInt64);
if (field.mConstIdx != -1)
{
auto constant = enumType->mConstHolder->GetConstantById(field.mConstIdx);
isComprehensive &= handledCases.ContainsKey(constant->mInt64);
}
}
}
}

View file

@ -114,6 +114,13 @@ namespace Tests
}
Test.Assert(val == 0);
const EnumA cea = .A;
switch (cea)
{
case .A:
val = 123;
}
ee = .B(10);
}