【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行目と大きく異なっています。
どういうことか?
色々と試してみた結果、次のようなことがわかりました。
テンプレート引数の中でシンボルが見つからなかった時、 エラーメッセージがテンプレート引数の閉じ括弧の位置で出力される。
このことについてツイッターで訊いてみると、
うーん、単純なパーザーのバグのように見えます。バグレポしていただけますか? RT @codelogy: bit.ly/Qi5ajt これが見つけたバグ。エラーが出る位置がおかしい・・・ #dlang
— hara kenjiさん (@9rnsr) 10月 15, 2012
とのことでした。
というわけで
Bugzillaに投げました。 http://d.puremagic.com/issues/show_bug.cgi?id=8825 英語力不足のため、閉じ括弧うんぬんのことには言及できませんでした・・・
まとめ
意外に、このような単純なところにもバグは潜んでいます。 みなさんも、バグに遭遇したら、ぜひBugzillaに投げてみてください。
担当:美馬(alias B = A;構文が追加されてテンション上がってる)