fix issue 22038 - final switch error message should report all missing members

This commit is contained in:
dkorpel 2021-07-02 12:37:42 +02:00 committed by The Dlang Bot
parent 5457695ccf
commit 51c52aa68f
5 changed files with 158 additions and 74 deletions

View file

@ -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;

View file

@ -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;
}
}

View file

@ -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:
{}
}
}

View file

@ -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)
{
}
}

View file

@ -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)
{
}
}