diff --git a/IDEHelper/Compiler/BfStmtEvaluator.cpp b/IDEHelper/Compiler/BfStmtEvaluator.cpp index ac00aa62..dc406807 100644 --- a/IDEHelper/Compiler/BfStmtEvaluator.cpp +++ b/IDEHelper/Compiler/BfStmtEvaluator.cpp @@ -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); + } } } } diff --git a/IDEHelper/Tests/src/Enums.bf b/IDEHelper/Tests/src/Enums.bf index 8e6d01b3..43f139cf 100644 --- a/IDEHelper/Tests/src/Enums.bf +++ b/IDEHelper/Tests/src/Enums.bf @@ -114,6 +114,13 @@ namespace Tests } Test.Assert(val == 0); + const EnumA cea = .A; + switch (cea) + { + case .A: + val = 123; + } + ee = .B(10); }