D issues are now
tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Summary: |
Regression: forward referenced enum |
Product: |
D
|
Reporter: |
Don <clugdbug> |
Component: |
dmd | Assignee: |
No Owner <nobody> |
Status: |
RESOLVED
FIXED
|
Severity: |
regression
|
CC: |
bugzilla
|
Priority: |
P2
|
Keywords: |
patch, rejects-valid |
Version: |
D1 (retired) |
Hardware: |
Other |
OS: |
Windows |
This code worked on 1.053, fails to compile on 1.054, and on D2.
I suspect this was caused by the fix to bug 3611.
-----
FwdEnum this_fails;
enum :int
{
E1 = 2
}
enum FwdEnum: int
{
E2 = E1
}
-----
bug.d(10): Error: undefined identifier E1
The regression is caused by this addition to Type *TypeEnum::toBasetype().
Knowing this doesn't necessarily help in fixing the problem, though.
Type *TypeEnum::toBasetype()
{
+ if (sym->scope)
+ {
+ sym->semantic(NULL); // attempt to resolve forward reference
+ }
I've fixed this by changing the code in mtype.c, line 5984:
Type *TypeEnum::toBasetype()
{
if (sym->scope)
{
- sym->semantic(NULL); // attempt to resolve forward reference
+ sym->trySemantic(NULL); // attempt to resolve forward reference
}
and adding this code to enum.c:
void EnumDeclaration::trySemantic(Scope *sc)
{
unsigned errors = global.errors;
global.gag++;
DsymbolTable *savetable = symtab;
semantic(sc);
global.gag--;
if (errors != global.errors)
{
global.errors = errors;
symtab = savetable;
}
}
Comment 3
Walter Bright
2010年01月24日 15:02:43 UTC
Changeset 353
Comment 4
Walter Bright
2010年01月30日 22:42:12 UTC
fixed dmd 1.056 and 2.040