diff --git a/src/dmd/statementsem.d b/src/dmd/statementsem.d index 3e8dac8e5f..3aa0dc1b07 100644 --- a/src/dmd/statementsem.d +++ b/src/dmd/statementsem.d @@ -2688,7 +2688,9 @@ private extern (C++) final class StatementSemanticVisitor : Visitor ed = ds.isEnumDeclaration(); if (ed) { - Lmembers: + int missingMembers = 0; + const maxShown = !global.params.verbose ? 6 : int.max; + Lmembers: foreach (es; *ed.members) { EnumMember em = es.isEnumMember(); @@ -2696,14 +2698,25 @@ private extern (C++) final class StatementSemanticVisitor : Visitor { foreach (cs; *ss.cases) { - if (cs.exp.equals(em.value) || (!cs.exp.type.isString() && !em.value.type.isString() && cs.exp.toInteger() == em.value.toInteger())) + if (cs.exp.equals(em.value) || (!cs.exp.type.isString() && + !em.value.type.isString() && cs.exp.toInteger() == em.value.toInteger())) continue Lmembers; } - ss.error("`enum` member `%s` not represented in `final switch`", em.toChars()); - sc.pop(); - return setError(); + if (missingMembers == 0) + ss.error("missing cases for `enum` members in `final switch`:"); + + if (missingMembers < maxShown) + errorSupplemental(ss.loc, "`%s`", em.toChars()); + missingMembers++; } } + if (missingMembers > 0) + { + if (missingMembers > maxShown) + errorSupplemental(ss.loc, "... (%d more, -v to show) ...", missingMembers - maxShown); + sc.pop(); + return setError(); + } } else needswitcherror = true; diff --git a/test/fail_compilation/fail4517.d b/test/fail_compilation/fail4517.d deleted file mode 100644 index f3fe031a14..0000000000 --- a/test/fail_compilation/fail4517.d +++ /dev/null @@ -1,21 +0,0 @@ -/* -TEST_OUTPUT: ---- -fail_compilation/fail4517.d(16): Error: `enum` member `B` not represented in `final switch` ---- -*/ - -enum E : ushort -{ - A, B -} - -void main() -{ - E e; - final switch(e) - { - case E.A: - break; - } -} diff --git a/test/fail_compilation/fail9368.d b/test/fail_compilation/fail9368.d deleted file mode 100644 index f575a86ab0..0000000000 --- a/test/fail_compilation/fail9368.d +++ /dev/null @@ -1,48 +0,0 @@ -// REQUIRED_ARGS: -d -/* -TEST_OUTPUT: ---- -fail_compilation/fail9368.d(19): Error: `enum` member `b` not represented in `final switch` ---- -*/ - -enum E -{ - a, - b -} - -void main() -{ - alias E F; - F f; - final switch (f) - { - case F.a: - } -} - -/* -TEST_OUTPUT: ---- -fail_compilation/fail9368.d(40): Error: `enum` member `B` not represented in `final switch` ---- -*/ - -enum G -{ - A,B,C -} - -void test286() -{ - G e; - final switch (e) - { - case G.A: -// case G.B: - case G.C: - {} - } -} - diff --git a/test/fail_compilation/finalswitch.d b/test/fail_compilation/finalswitch.d new file mode 100644 index 0000000000..634700940a --- /dev/null +++ b/test/fail_compilation/finalswitch.d @@ -0,0 +1,96 @@ +/* +TEST_OUTPUT: +--- +fail_compilation/finalswitch.d(37): Error: missing cases for `enum` members in `final switch`: +fail_compilation/finalswitch.d(37): `B` +fail_compilation/finalswitch.d(55): Error: missing cases for `enum` members in `final switch`: +fail_compilation/finalswitch.d(55): `b` +fail_compilation/finalswitch.d(69): Error: missing cases for `enum` members in `final switch`: +fail_compilation/finalswitch.d(69): `B` +fail_compilation/finalswitch.d(87): Error: missing cases for `enum` members in `final switch`: +fail_compilation/finalswitch.d(87): `m3` +fail_compilation/finalswitch.d(87): `m4` +fail_compilation/finalswitch.d(87): `m5` +fail_compilation/finalswitch.d(87): `m6` +fail_compilation/finalswitch.d(87): `m7` +fail_compilation/finalswitch.d(87): `m9` +fail_compilation/finalswitch.d(92): Error: missing cases for `enum` members in `final switch`: +fail_compilation/finalswitch.d(92): `m1` +fail_compilation/finalswitch.d(92): `m2` +fail_compilation/finalswitch.d(92): `m3` +fail_compilation/finalswitch.d(92): `m4` +fail_compilation/finalswitch.d(92): `m5` +fail_compilation/finalswitch.d(92): `m6` +fail_compilation/finalswitch.d(92): ... (4 more, -v to show) ... +--- +*/ + +// https://issues.dlang.org/show_bug.cgi?id=4517 +enum E : ushort +{ + A, B +} + +void test4517() +{ + E e; + final switch(e) + { + case E.A: + break; + } +} + +// https://issues.dlang.org/show_bug.cgi?id=9368 +enum E1 +{ + a, + b +} + +void test9368() +{ + alias E1 F; + F f; + final switch (f) + { + case F.a: + } +} + +enum G +{ + A,B,C +} + +void test286() +{ + G e; + final switch (e) + { + case G.A: +// case G.B: + case G.C: + {} + } +} + +// https://issues.dlang.org/show_bug.cgi?id=22038 + +enum H { + m1, m2, m3, m4, m5, + m6, m7, m8, m9, m10, +} + +void test22038() +{ + final switch (H.init) + { + case H.m1, H.m2, H.m8, H.m10: break; + } + + final switch (H.init) + { + + } +} diff --git a/test/fail_compilation/finalswitch_verbose.d b/test/fail_compilation/finalswitch_verbose.d new file mode 100644 index 0000000000..4bf5d46f84 --- /dev/null +++ b/test/fail_compilation/finalswitch_verbose.d @@ -0,0 +1,44 @@ +/* +REQUIRED_ARGS: -v +TRANSFORM_OUTPUT: remove_lines("^(predefs|binary|version|config|DFLAG|parse|import|semantic|entry|\s*$)") +TEST_OUTPUT: +--- +fail_compilation/finalswitch_verbose.d(40): Error: missing cases for `enum` members in `final switch`: +fail_compilation/finalswitch_verbose.d(40): `m1` +fail_compilation/finalswitch_verbose.d(40): `m2` +fail_compilation/finalswitch_verbose.d(40): `m3` +fail_compilation/finalswitch_verbose.d(40): `m4` +fail_compilation/finalswitch_verbose.d(40): `m5` +fail_compilation/finalswitch_verbose.d(40): `m6` +fail_compilation/finalswitch_verbose.d(40): `m7` +fail_compilation/finalswitch_verbose.d(40): `m8` +fail_compilation/finalswitch_verbose.d(40): `m9` +fail_compilation/finalswitch_verbose.d(40): `m10` +fail_compilation/finalswitch_verbose.d(40): `m11` +fail_compilation/finalswitch_verbose.d(40): `m12` +fail_compilation/finalswitch_verbose.d(40): `m13` +fail_compilation/finalswitch_verbose.d(40): `m14` +fail_compilation/finalswitch_verbose.d(40): `m15` +fail_compilation/finalswitch_verbose.d(40): `m16` +fail_compilation/finalswitch_verbose.d(40): `m17` +fail_compilation/finalswitch_verbose.d(40): `m18` +fail_compilation/finalswitch_verbose.d(40): `m19` +fail_compilation/finalswitch_verbose.d(40): `m20` +--- +*/ + +// https://issues.dlang.org/show_bug.cgi?id=22038 +enum H { + m1, m2, m3, m4, m5, + m6, m7, m8, m9, m10, + m11, m12, m13, m14, m15, + m16, m17, m18, m19, m20 +} + +void test22038() +{ + final switch (H.init) + { + + } +}