謎's キッチン

謎のひとりごと。Amazon欲しい物リストはこちら: https://www.amazon.co.jp/hz/wishlist/ls/CCPOV7C6JTD2

配列リテラル周りのパッチ

を作ってみた。あと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の時点では既に修正されてるようだ。