Skip to content

Commit 93323f0

Browse files
committed
more simpler approach
1 parent 768d06c commit 93323f0

File tree

2 files changed

+8
-69
lines changed

2 files changed

+8
-69
lines changed

compiler/src/dmd/statementsem.d

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1973,30 +1973,19 @@ Statement statementSemanticVisit(Statement s, Scope* sc)
19731973
return setError();
19741974
}
19751975
}
1976-
}
1977-
1978-
if (ed && ss.cases.length < ed.members.length)
1979-
{
1980-
// Add a check for incomplete enum declaration to prevent segfault
1981-
// when the enum is being defined while it's referenced in a final switch
1982-
bool isEnumIncomplete = false;
1983-
foreach (es; *ed.members)
1984-
{
1985-
EnumMember em = es.isEnumMember();
1986-
if (em && em.value is null)
1987-
{
1988-
isEnumIncomplete = true;
1989-
break;
1990-
}
1991-
}
19921976

1993-
if (isEnumIncomplete)
1977+
// Check if enum semantic analysis is not yet complete
1978+
if (ed.semanticRun < PASS.semanticdone)
19941979
{
19951980
error(ss.loc, "cannot use `final switch` on enum `%s` while it is being defined", ed.toChars());
19961981
sc.pop();
19971982
return setError();
19981983
}
1984+
}
19991985

1986+
if (ed && ss.cases.length < ed.members.length)
1987+
{
1988+
// Remove the old check for incomplete enum members
20001989
int missingMembers = 0;
20011990
const maxShown = global.params.v.errorSupplementCount();
20021991
Lmembers:
Lines changed: 2 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
/*
22
TEST_OUTPUT:
33
---
4-
fail_compilation/fix20867.d(16): Error: cannot use `final switch` on enum `E` while it is being defined
5-
fail_compilation/fix20867.d(31): Error: cannot use `final switch` on enum `E2` while it is being defined
6-
fail_compilation/fix20867.d(63): Error: cannot use `final switch` on enum `E4` while it is being defined
4+
fail_compilation/fix20867.d(14): Error: cannot use `final switch` on enum `E` while it is being defined
75
---
86
*/
97

10-
// Test case 1: The exact scenario Issue(From Github Issue(#20867))
8+
// Test case from Issue #20867
119
enum E
1210
{
1311
a = 3,
@@ -20,51 +18,3 @@ enum E
2018
return 4;
2119
} ()
2220
}
23-
24-
// Test case 2: Variation with multiple members
25-
enum E2
26-
{
27-
x = 10,
28-
y = 20,
29-
z = () {
30-
E2 e;
31-
final switch (e) // Should also error out safely
32-
{
33-
case E2.x: return 30;
34-
case E2.y: return 40;
35-
}
36-
} ()
37-
}
38-
39-
// Test case 3: Regular use of final switch (this should still compile)
40-
enum E3
41-
{
42-
p = 1,
43-
q = 2
44-
}
45-
46-
void testE3()
47-
{
48-
E3 e = E3.p;
49-
final switch (e)
50-
{
51-
case E3.p: break;
52-
case E3.q: break;
53-
}
54-
}
55-
56-
// Test case 4: Nested circular reference
57-
enum E4
58-
{
59-
r = 5,
60-
s = () {
61-
int foo() {
62-
E4 e;
63-
final switch (e) // Should error out
64-
{
65-
case E4.r: return 6;
66-
}
67-
}
68-
return foo();
69-
} ()
70-
}

0 commit comments

Comments
 (0)