を作ってみた。あとpragma(msg,...)もついでに修正した。dmdfeではうまく動くけど、gdcでちゃんと動かないっぽ。arrayliteral.diff
バグの修正に利用したのテストケースは以下。
module test_bug; //const char[] test = ['a','b','c']; //const char[] test5 = test[0..2];//err(fix) //const char test2 = test[0];//err(fix) //const char test6 = (['a','b','c'])[0];//ok //const char[] test7 = (['a','b','c'])[0..1];//err(fix) //const char[] test8 = (['a','b','c'])[0..$];//err(fix) //const char test8 = test7[0]; //pragma(msg, test2); //pragma(msg,[cast(wchar)'t','e']~"st"w);//wrong(fix) //pragma(msg,"te"w~[cast(wchar)'s','t']);//wrong(fix) //pragma(msg,['t','e']~"st");//err(fix) //pragma(msg,"te"~['s','t']);//err(fix) //const char[] test = cast(char[])['a','b','c'];//err(fix?) //static assert("test" == ['t','e','s','t']);//err(fix) //static assert(['t','e','s','t'] == "test");//err(fix)
gdcにパッチ当てたら六箇所ぐらい衝突した。typinfにもArrayInitializerがあるので適当に変更する必要あり。それとArrayLiteralでも最後のカンマが置けるようにしたので構文的副作用あり。int[6] test = [0]が通らなくなってる…がこれ何だっけ? static ubyte[2] test2 = [0,1]も通らなくなってるが、non-constant expressionって言われてもdmdfeではうまくいってるのでシランガナ。
適当にimplicitConvToとtoDtを追加してうまくいったと思ったら
const Struct[] test = [ {1,"test"}, {2,"test"}, {3,"test"}, ];
のようなのでエラー。こればかりはstruct literalが無いとどうしようもないなぁ。array initializerは復活させるしかないのか…。
ってかこれ
const void delegate()[] test=[
{},
{},
];
と衝突してね? v1.0と互換させるとなるとややこしい事になるわな。
うげ、Initializerって古すぎ。多分この構造だと某所で話題にされた
struct Point{int x,y;} const Point p = {1,2}; const int x = p.x;
は綺麗に書けないと思う。StructExpが絶対に必要だなぁ。v1.0と互換になるまで弄ってみるか。でも{y:1,x:2}とか名前によって順番も変えられるからtupleliteralにもできないんだよな。ってか名前付きと名前無しを混ぜたときの挙動が面倒だな。
arrayliteralのpragma以外のバグはdmd 2.009の時点では既に修正されてるようだ。