kubo39's blog

ただの雑記です。

D言語の八進数リテラルの特殊扱い

D言語はかつて八進数リテラルを定義していたが、現在は仕様上Invalidとなっており std.conv.octal を使うようにエラーメッセージが出現する。

(dmd-2.081.1)$ cat octal.d
void main()
{
    auto _ = 010;
}
(dmd-2.081.1)$ dmd octal.d
octal.d(3): Error: octal literals 010 are no longer supported, use std.conv.octal!10 instead

ところが 00 ~ 07 の八進数リテラルのみ特殊扱いしており、以下のコードは評価可能であり実行もされる。 (実はある時点で 0809 というそもそも不正なリテラルをうけつけるバグが混入してしまったのだが、これは修正しておいたので2.082.0以降では正しくエラーとなる)

void main()
{
    assert(01 == 1);
}

これは特殊扱いというより過去そのまま残ったバグなのであるが、phobosをはじめ2文字で表す八進数リテラルは広く使われているために今後修正は(おそらく)行われないだろう。

つまりD言語には隠れた仕様上不正だが許容されている構文が存在しているということである。