The following example compiles, but the output is wrong. It seems the initializer for a struct array is ignored; instead, the default initializer of the struct is used for the array. import std.stdio; import std.string; struct T { int g = 1; string toString() { return format("%s", g); } } class Foo { int[5] x = 4; //this doesn't work //basically, the "=T(4)" part is ignored T[5] y = T(4); } void main() { auto f = new Foo(); //both lines should output the same //but it shows f.y is [1,1,1,1,1] writefln("f.x = %s", f.x); writefln("f.y = %s", f.y); }
The bug clearly lies in todt.c, inside dt_t **TypeSArray::toDtElem(dt_t **pdt, Expression *e). If it's an array of structs, (ie, tbn->ty == Tstruct), then the 'e' value is completely ignored!! This is certainly wrong. Changing the two places where the check is: if (tbn->ty == Tstruct) into: if (tbn != e->type && tbn->ty == Tstruct) allows the test case to pass. But that may not be the correct criterion to use.
Or else, create a new version of TypeStruct::toDtElem, which doesn't have the special-case for structs members, and call it from StructDeclaration::toDt() and ClassDeclaration::toDt2()
The patch for bug 1914 fixes this.
Fixed https://github.com/D-Programming-Language/dmd/commit/0c7bd71609735814f5bb410f903e454643ac260f
AltStyle によって変換されたページ (->オリジナル) / アドレス: モード: デフォルト 音声ブラウザ ルビ付き 配色反転 文字拡大 モバイル