File tree Expand file tree Collapse file tree 2 files changed +8
-69
lines changed
Expand file tree Collapse file tree 2 files changed +8
-69
lines changed Original file line number Diff line number Diff 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:
Original file line number Diff line number Diff line change 11/*
22TEST_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
119enum 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- }
You can’t perform that action at this time.
0 commit comments