This program compiles with no errors (DMD 2.056head), but I think it's wrong because the compile-time constant y gets assigned with a runtime value: struct Foo { immutable uint x; void foo() { enum uint y = x; } } void main(string[] args) { auto f = Foo(args.length); }
Related to Issue 2414. What differs here is that enum uint y = x Is translated to enum uint y = this.x And DotIdExp::optimize does not turn this into a constant value, and there is no error when it fails when called with result & WANTinterpret. Unfortunately adding an error causes problems with other code, presumably because DotIdExp::optimize is use from other places like CallExp::optimize that expect it to just try and finish without errors. Reassigning to Don as he fixed 2414 and understands the constfolding/interpreter code a lot better than I do. Probably applies to D1/const variables too.
The error message should only happen when result & WANTinterpret. But, the problem is, as usual, those %&/$# AAs. The builtin AA properties aren't converted into function calls. Rather than add another hack for this, it's probably better to wait for bug 5590 to be pulled in.
FWIW, this patch in optimize.c, DotVarExp::optimize() fixes the bug. But, the exclusion of TOKassocarrayliteral is just a hack. if (e && e->op == TOKstructliteral) { StructLiteralExp *sle = (StructLiteralExp *)e; VarDeclaration *vf = var->isVarDeclaration(); if (vf) { Expression *e = sle->getField(type, vf->offset); if (e && e != EXP_CANT_INTERPRET) return e; } } + else if (result & WANTinterpret && (!e || e->op != TOKassocarrayliteral)) + error("%s cannot be evaluated at compile time", e1->toChars()); return this; }
Tested on git HEAD, now the compiler correctly issues an error: ------ test.d(4): Error: value of 'this' is not known at compile time ------ The test code was modified to use size_t instead of uint, since on 64-bit platforms args.length is ulong, and the compiler will complain that you can't assign ulong to uint. But that's irrelevant to this bug.
Does it still exist in D1?
No idea, should the bug be reopened for D1-only?
Might as well reopen until someone can confirm it's fixed for D1.
D1 is no longer supported. Closing as WORKSFORME.