Bug 9425 – Static struct initializer fails to init array

Status
RESOLVED
Resolution
WORKSFORME
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2013-01-29T09:14:00Z
Last change time
2013-11-23T00:42:36Z
Assigned to
nobody
Creator
SebastianGraf

Comments

Comment #0 by SebastianGraf — 2013-01-29T09:14:41Z
I found this when fixing a bug in ldc on Win8 x64. I'm pretty sure all platforms are concerned, because the linux CI server complained for the same reason. import std.conv; struct S { int array[4]; } void main() { int array[4] = 67; // array = [67, 67, 67, 67] static S s = S(67); // s.array = [67, 0, 0, 0] assert(array == s.array, "s.array (actual): " ~ to!string(s.array) ~ ", array (expected): " ~ to!string(array)); } When initializing array in S' initializer, only the first element of the array takes the value, the others are zero'd. I expected the array to be filled with the value. Note that this is the case when you don't declare s as static, so I assume it is a bug.
Comment #1 by SebastianGraf — 2013-01-30T08:53:52Z
This is related to Bug2931. There's a dmd testcase for that in http://github.com/D-Programming-Language/dmd/blob/e7eff4deef0fb5ec9a89cee4716785832fc41fb9/test/runnable/test42.d#L3193 . The actual test case bug2931_2 conflicts with what I expected it to assert: Only the first element is initialized with the value, all other elements are assumed to be zero. This however contradicts dmd's behavior for the non-static case.
Comment #2 by k.hara.pg — 2013-02-02T05:49:34Z
(In reply to comment #1) > This is related to Bug2931. There's a dmd testcase for that in > http://github.com/D-Programming-Language/dmd/blob/e7eff4deef0fb5ec9a89cee4716785832fc41fb9/test/runnable/test42.d#L3193 > . The actual test case bug2931_2 conflicts with what I expected it to assert: > Only the first element is initialized with the value, all other elements are > assumed to be zero. > This however contradicts dmd's behavior for the non-static case. For the one level block initializing of static array, current dmd generates correct code. static int[3] x = 1; // block initializing void main() { import std.stdio; writeln(x); // print [1, 1, 1]; } It is from dmd0.98. https://github.com/d-programming-language/dmd/commit/15d4546d07d5dedb7424677ae4dc0b18e57ef6da#L11R799 So, the test case for bug 2931 is wrong, IMO.
Comment #3 by clugdbug — 2013-02-04T02:41:11Z
I did quite a lot of work (In reply to comment #2) > (In reply to comment #1) > > This is related to Bug2931. There's a dmd testcase for that in > > http://github.com/D-Programming-Language/dmd/blob/e7eff4deef0fb5ec9a89cee4716785832fc41fb9/test/runnable/test42.d#L3193 > > . The actual test case bug2931_2 conflicts with what I expected it to assert: > > Only the first element is initialized with the value, all other elements are > > assumed to be zero. > > This however contradicts dmd's behavior for the non-static case. > > For the one level block initializing of static array, current dmd generates > correct code. > > static int[3] x = 1; // block initializing > void main() { > import std.stdio; > writeln(x); // print [1, 1, 1]; > } > > It is from dmd0.98. > https://github.com/d-programming-language/dmd/commit/15d4546d07d5dedb7424677ae4dc0b18e57ef6da#L11R799 > > So, the test case for bug 2931 is wrong, IMO. I agree. Note that it behaves as expected in CTFE: --- struct S { int array[4]; } enum S s = S(67); int tain() { return s.array[2]; } static assert(tain()==67); ---- Though I get a CTFE ICE if I change that to a 2D array :-(.
Comment #4 by yebblies — 2013-11-23T00:42:36Z
Seems to work.