mirror of
https://github.com/dlang/dmd.git
synced 2025-04-27 05:30:13 +03:00
fix issue 22038 - final switch error message should report all missing members
This commit is contained in:
parent
5457695ccf
commit
51c52aa68f
5 changed files with 158 additions and 74 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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:
|
||||
{}
|
||||
}
|
||||
}
|
||||
|
96
test/fail_compilation/finalswitch.d
Normal file
96
test/fail_compilation/finalswitch.d
Normal 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)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
44
test/fail_compilation/finalswitch_verbose.d
Normal file
44
test/fail_compilation/finalswitch_verbose.d
Normal 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)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue