Bug 6511 – [CTFE] Array op gives wrong result

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
x86
OS
Windows
Creation time
2011-08-16T13:49:00Z
Last change time
2011-08-23T02:10:18Z
Keywords
wrong-code
Assigned to
nobody
Creator
bearophile_hugs

Comments

Comment #0 by bearophile_hugs — 2011-08-16T13:49:05Z
T foo(T)() { T[1] a = [1]; a[] += a[]; return a[0]; } static assert(foo!ulong() == 2); // error static assert(foo!long() == 2); // error void main() { assert(foo!ulong() == 2); // OK assert(foo!long() == 2); // OK } DMD gives: test.d(6): Error: static assert (1LU == 2LU) is false
Comment #1 by bugzilla — 2011-08-22T22:47:12Z
Comment #2 by bearophile_hugs — 2011-08-22T23:21:42Z
The given code example now works. But this: T foo(T)() { T[1] a = [1]; a[] += a[]; return a[0]; } static assert(foo!long() == 2); // OK static assert(foo!int() == 2); // error void main() {} Gives: test.d(3): Error: _arraySliceSliceAddass_i cannot be interpreted at compile time, because it has no available source code test.d(7): Error: cannot evaluate foo() at compile time test.d(7): Error: static assert (foo() == 2) is not evaluatable at compile time This behaviour difference between long and int is not good. Do you prefer me to reopen this bug or to open a new one?
Comment #3 by clugdbug — 2011-08-23T01:29:13Z
(In reply to comment #2) > The given code example now works. But this: > > > T foo(T)() { > T[1] a = [1]; > a[] += a[]; > return a[0]; > } > static assert(foo!long() == 2); // OK > static assert(foo!int() == 2); // error > void main() {} > > > Gives: > > test.d(3): Error: _arraySliceSliceAddass_i cannot be interpreted at compile > time, because it has no available source code > test.d(7): Error: cannot evaluate foo() at compile time > test.d(7): Error: static assert (foo() == 2) is not evaluatable at compile > time > > This behaviour difference between long and int is not good. Do you prefer me to > reopen this bug or to open a new one? A new one. Surprisingly, it actually has *nothing* in common with this bug. This bug was actually a problem with array slicing, and didn't require array operations. The new case is that the array operations which are special-cased in the runtime don't have special case treatment in the CTFE engine, since CTFE doesn't have access to the source code of druntime. The array ops which aren't special-cased don't use druntime code, so they should all work.
Comment #4 by bearophile_hugs — 2011-08-23T02:10:18Z
(In reply to comment #3) > A new one. OK. It is bug 6545