diff --git a/src/V3Case.cpp b/src/V3Case.cpp index 8a4f471b7..54ce1ff7e 100644 --- a/src/V3Case.cpp +++ b/src/V3Case.cpp @@ -285,6 +285,7 @@ class CaseVisitor final : public VNVisitor { bool checkExhaustiveEnum(const AstCase* const nodep, const AstEnumDType* const enump) { const uint32_t numCases = 1UL << nodep->exprp()->width(); bool fullyCovered = true; + string missingItems; for (AstEnumItem* eip = enump->itemsp(); eip; eip = VN_AS(eip->nextp(), EnumItem)) { const auto& match = matchPattern(nodep, VN_AS(eip->valuep(), Const)); const uint32_t mask = match.first.toUInt(); @@ -294,15 +295,16 @@ class CaseVisitor final : public VNVisitor { for (uint32_t i = 0; i < numCases; ++i) { if ((i & mask) != bits) continue; // This case is not for this enum value if (m_caseDetails.records[i].itemp) continue; // Covered case - // Warn unless unique0 case which allows no-match - if (!nodep->unique0Pragma()) { - nodep->v3warn(CASEINCOMPLETE, - "Enum item " << eip->prettyNameQ() << " not covered by case"); - } + if (!missingItems.empty()) missingItems += ", "; + missingItems += eip->prettyNameQ(); fullyCovered = false; break; } } + if (!missingItems.empty() && !nodep->unique0Pragma()) { + nodep->v3warn(CASEINCOMPLETE, + "Enum item(s) not covered by case: " << missingItems); + } return fullyCovered; // enum is fully covered } diff --git a/test_regress/t/t_case_enum_incomplete_bad.out b/test_regress/t/t_case_enum_incomplete_bad.out index b1a0c8b1f..6f3986c1d 100644 --- a/test_regress/t/t_case_enum_incomplete_bad.out +++ b/test_regress/t/t_case_enum_incomplete_bad.out @@ -1,9 +1,6 @@ -%Warning-CASEINCOMPLETE: t/t_case_enum_incomplete_bad.v:18:12: Enum item 'S1' not covered by case +%Warning-CASEINCOMPLETE: t/t_case_enum_incomplete_bad.v:18:12: Enum item(s) not covered by case: 'S1', 'S2' 18 | unique case (state) | ^~~~ ... For warning description see https://verilator.org/warn/CASEINCOMPLETE?v=latest ... Use "/* verilator lint_off CASEINCOMPLETE */" and lint_on around source to disable this message. -%Warning-CASEINCOMPLETE: t/t_case_enum_incomplete_bad.v:18:12: Enum item 'S2' not covered by case - 18 | unique case (state) - | ^~~~ %Error: Exiting due to diff --git a/test_regress/t/t_case_enum_incomplete_wildcard_bad.out b/test_regress/t/t_case_enum_incomplete_wildcard_bad.out index ec731329c..59e2f5b81 100644 --- a/test_regress/t/t_case_enum_incomplete_wildcard_bad.out +++ b/test_regress/t/t_case_enum_incomplete_wildcard_bad.out @@ -1,24 +1,12 @@ -%Warning-CASEINCOMPLETE: t/t_case_enum_incomplete_wildcard_bad.v:26:12: Enum item 'S10' not covered by case +%Warning-CASEINCOMPLETE: t/t_case_enum_incomplete_wildcard_bad.v:26:12: Enum item(s) not covered by case: 'S10', 'SX0' 26 | unique case (state) | ^~~~ ... For warning description see https://verilator.org/warn/CASEINCOMPLETE?v=latest ... Use "/* verilator lint_off CASEINCOMPLETE */" and lint_on around source to disable this message. -%Warning-CASEINCOMPLETE: t/t_case_enum_incomplete_wildcard_bad.v:26:12: Enum item 'SX0' not covered by case - 26 | unique case (state) - | ^~~~ -%Warning-CASEINCOMPLETE: t/t_case_enum_incomplete_wildcard_bad.v:30:12: Enum item 'S00' not covered by case +%Warning-CASEINCOMPLETE: t/t_case_enum_incomplete_wildcard_bad.v:30:12: Enum item(s) not covered by case: 'S00', 'SX0', 'S0X' 30 | unique case (state) | ^~~~ -%Warning-CASEINCOMPLETE: t/t_case_enum_incomplete_wildcard_bad.v:30:12: Enum item 'SX0' not covered by case - 30 | unique case (state) - | ^~~~ -%Warning-CASEINCOMPLETE: t/t_case_enum_incomplete_wildcard_bad.v:30:12: Enum item 'S0X' not covered by case - 30 | unique case (state) - | ^~~~ -%Warning-CASEINCOMPLETE: t/t_case_enum_incomplete_wildcard_bad.v:35:12: Enum item 'S10' not covered by case - 35 | unique casez (state) - | ^~~~~ -%Warning-CASEINCOMPLETE: t/t_case_enum_incomplete_wildcard_bad.v:35:12: Enum item 'SX0' not covered by case +%Warning-CASEINCOMPLETE: t/t_case_enum_incomplete_wildcard_bad.v:35:12: Enum item(s) not covered by case: 'S10', 'SX0' 35 | unique casez (state) | ^~~~~ %Warning-CASEINCOMPLETE: t/t_case_enum_incomplete_wildcard_bad.v:40:5: Case values incompletely covered (example pattern 0x3)