【D言語】エラーの行数がおかしいバグ【Issue 8825】

D言語erの皆さん、こんちには。 今回は、最近見つけたバグについて語っていきます。

うまく動くコード



template t(alias a){
    alias int t;
}
void main(){
    t!foo i;
    return;
}

D言語では、定義されていないシンボルを使うと、


foo.d(5): Error: undefined identifier foo

というようにコンパイラに怒られてしまいます。 この場合は、ちゃんと5行目にfooがあります。

うまく動かないコード


以下の場合はどうでしょう?


template t(alias a){
    alias int t;
}
void main(){
    t!(
        foo
    ) i;
    return;
}

D言語ではよく見る、テンプレート引数の括弧をインデントした形です。 この時のエラーメッセージは以下のようになります。


foo.d(7): Error: undefined identifier foo

7行目! エラーメッセージは7行目と言っていますが、実際にはfooは6行目にあります!!

更に上手く動かないコード


さらに、以下のような場合はどうでしょう?


template t(alias a){
    alias int t;
}
void main(){
    t!(
        foo




    ) i;
    return;
}

D言語ではよく見る、テンプレート引数にインデントしてたくさん引数を渡した時の形です。(上のコードでは渡していませんが) この時のエラーメッセージは以下のようになります。


foo.d(11): Error: undefined identifier foo

これはひどい・・・ 11行目は、fooがある6行目と大きく異なっています。

どういうことか?


色々と試してみた結果、次のようなことがわかりました。

テンプレート引数の中でシンボルが見つからなかった時、 エラーメッセージがテンプレート引数の閉じ括弧の位置で出力される。

このことについてツイッターで訊いてみると、

とのことでした。

というわけで


Bugzillaに投げました。 http://d.puremagic.com/issues/show_bug.cgi?id=8825 英語力不足のため、閉じ括弧うんぬんのことには言及できませんでした・・・

まとめ

意外に、このような単純なところにもバグは潜んでいます。 みなさんも、バグに遭遇したら、ぜひBugzillaに投げてみてください。

担当:美馬(alias B = A;構文が追加されてテンション上がってる)