Bug 6784 – (D1 only) Compile-time constant assigned with a runtime value

Status
RESOLVED
Resolution
WORKSFORME
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D1 (retired)
Platform
All
OS
All
Creation time
2011-10-07T15:37:34Z
Last change time
2019-11-07T08:10:13Z
Keywords
accepts-invalid
Assigned to
Don
Creator
bearophile_hugs

Comments

Comment #0 by bearophile_hugs — 2011-10-07T15:37:34Z
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); }
Comment #1 by yebblies — 2012-01-31T18:09:43Z
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.
Comment #2 by clugdbug — 2012-02-22T01:14:30Z
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.
Comment #3 by clugdbug — 2012-02-22T11:59:55Z
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; }
Comment #4 by hsteoh — 2014-11-06T01:33:19Z
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.
Comment #5 by yebblies — 2014-11-06T01:38:21Z
Does it still exist in D1?
Comment #6 by hsteoh — 2014-11-06T01:59:27Z
No idea, should the bug be reopened for D1-only?
Comment #7 by yebblies — 2014-12-12T05:31:10Z
Might as well reopen until someone can confirm it's fixed for D1.
Comment #8 by razvan.nitu1305 — 2019-11-07T08:10:13Z
D1 is no longer supported. Closing as WORKSFORME.