Skip to content

Commit ea6abbd

Browse files
committed
Move
1 parent 62a48a5 commit ea6abbd

File tree

3 files changed

+62
-0
lines changed

3 files changed

+62
-0
lines changed

compiler/src/dmd/semantic2.d

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -696,6 +696,39 @@ private extern(C++) final class Semantic2Visitor : Visitor
696696
{
697697
td.foreachVar((s) { s.accept(this); });
698698
}
699+
700+
override void visit(EnumDeclaration ed)
701+
{
702+
//printf("EnumDeclaration::semantic2('%s')\n", ed.toChars());
703+
if (ed.semanticRun >= PASS.semantic2done)
704+
return;
705+
if (ed.semanticRun == PASS.semantic2)
706+
return;
707+
708+
ed.semanticRun = PASS.semantic2;
709+
710+
if (!ed.members || ed.errors)
711+
{
712+
ed.semanticRun = PASS.semantic2done;
713+
return;
714+
}
715+
716+
if (ed.isAnonymous() || !ed.members)
717+
{
718+
ed.semanticRun = PASS.semantic2done;
719+
return;
720+
}
721+
722+
// Process each enum member
723+
for (size_t i = 0; i < ed.members.length; i++)
724+
{
725+
EnumMember em = (*ed.members)[i].isEnumMember();
726+
if (em)
727+
em.dsymbolSemantic(sc);
728+
}
729+
730+
ed.semanticRun = PASS.semantic2done;
731+
}
699732
}
700733

701734
/**

compiler/src/dmd/statementsem.d

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1959,6 +1959,15 @@ Statement statementSemanticVisit(Statement s, Scope* sc)
19591959
ed = ds.isEnumDeclaration(); // typedef'ed enum
19601960
if (!ed && te && ((ds = te.toDsymbol(sc)) !is null))
19611961
ed = ds.isEnumDeclaration();
1962+
1963+
// Replace the above check with this better check
1964+
if (ed && (ed.semanticRun < PASS.semanticdone || ed.semanticRun < PASS.semantic2done))
1965+
{
1966+
error(ss.loc, "cannot use `final switch` on enum `%s` while it is being defined", ed.toChars());
1967+
sc.pop();
1968+
return setError();
1969+
}
1970+
19621971
if (ed && ss.cases.length < ed.members.length)
19631972
{
19641973
int missingMembers = 0;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/*
2+
TEST_OUTPUT:
3+
---
4+
fail_compilation/fix20867.d(14): Error: cannot use `final switch` on enum `E` while it is being defined
5+
---
6+
*/
7+
8+
// Test case from Issue #20867
9+
enum E
10+
{
11+
a = 3,
12+
b = () {
13+
E e;
14+
final switch (e) // This should error out instead of segfaulting
15+
{
16+
case E.a: break;
17+
}
18+
return 4;
19+
} ()
20+
}

0 commit comments

Comments
 (0)