読者です 読者をやめる 読者になる 読者になる

【D言語】dmdのバグ【Issue 9169】

D言語erの皆さん、こんにちは。

今回は、ついこの前、間接的に(?)ぶつかったバグである、Issue 9169を軽く紹介していきます。 あまり関係ないですが、もうバグ報告数が9000を超えたんですね・・・

バグの内容


テンプレート構造体を作る際、わざわざテンプレート引数を入力するのが面倒くさい場合があります。


struct Hoge(T, U, V){
    T a;
    U b;
    V c;
}

void main(){
    auto hoge = Hoge!(int, double, string)(10, 3.14, "hoge");
}

引数からテンプレート構造体のテンプレート引数を推論してくれると嬉しいですね。 そんな時、Hogeを作るだけのテンプレート関数hogeをよく作ります。


struct Hoge(T, U, V){
    T a;
    U b;
    V c;
}

Hoge!(T, U, V) hoge(T, U, V)(T a, U b, V c){
    return Hoge!(T, U, V)(a, b, c);
}

void main(){
    auto hoge = hoge(10, 3.14, "hoge");
}

推論が効いてていい感じですね。


こんな時、以下のように書いてしまうと・・・


class C{
    Hoge!(int, double, string) hoge = hoge(10, 3.14, "hoge");
}

以下のようなコンパイルエラーが出てしまいます。


Error: struct Hoge does not overload ()

なぜ?


バグレポートによると、上の場合、右辺のhogeは関数ではなく、Cのhogeそれ自身を指していると意味解析されてしまいます。

一見わかりづらいエラーメッセージも、そう考えると辻褄が合いますね。

まとめ


Issue 9169を軽く紹介していきました。 とは言っても、このバグでつまずく人は少ないかもしれませんね・・・

担当:美馬(関数の名前を、makeHogeとかに変えれば簡単に回避できる・・・)