変更ログ 2.063
Download D 2.063
2013年5月28日リリース
言語の変更
- 初期化子を持つコンストラクタと不変のフィールドが警告されるようになった。
- オブジェクトの構築時にコンストラクタ修飾子が考慮されるようになった。
- ビット比較以外の比較を必要とする構造体メンバが適切に比較されるようになった。
- 配列のコピー操作で、常にスライス構文を使用しなければならなくなった。
- 型が typeof 式の引数として機能しなくなった。
- foreach 範囲のインデックス変数が暗黙の参照でなくなった。
- 連想配列のエントリが代入前にデフォルトで初期化されなくなった。
- const 属性がオーバーライドされたメソッドで継承されなくなった。
- typeof(null) が暗黙的に T[] に変換されなくなった。
- テンプレート化された "This Parameter"がメンバ関数の修飾子を変更するようになった。
- 配列スライスがr値になった。
- this 参照なしで非静的フィールドにアクセスすることが、特定のコンテキストでのみ許可されるようになった。
- 配列が暗黙的にポインタに変換されなくなった。
言語機能の強化
- 一意なオブジェクトを返す "式"を暗黙的にimmutableにキャストできるようになった。
- void の静的配列をユーザが初期化できるようになった。
- 集約に複数の不変量を含めることができるようになった。
- テンプレート化された集約のメソッドが属性を推測できるようになった。
- is expression 識別子が不要になった。
- 既知のサイズの動的配列を、いくつかのコンテキストで暗黙的に静的配列にキャストできるようになった。
- タプルをvoid初期化できるようになった。
- タプルが等しいかどうかを比較できるようになった。
- テンプレート制約を継承リストの後に置くことができるようになった。
- 初期化子を持つフィールドを const コンストラクタで再初期化できるようになった。
- コンテキスト・ポインタを持つ集約と関数を発見するためのisNested 特性が追加された。
- テンプレート化された関数をネストできるようになった。
- UFCSがスコープ付きローカル・インポートで動作するようになった。
- __FUNCTION__ 、__PRETTY_FUNCTION__ 、__MODULE__ を追加した。
- DDoc: 非推奨宣言がDEPRECATED マクロでラップされるようになった。
- 検証可能なコード例生成のためのドキュメント化されたunittest機能が追加された。
コンパイラの強化
phobosの変更点
Phobos の機能強化
D 2.063における全てのバグ修正と機能強化のリスト。
言語の変更
- 初期化子を持つconstフィールドと不変のフィールドが警告されるようになった:
最終的には非推奨となり、エラーが発生する。そのようなフィールドは をenumかstaticに変更すべきである。
将来のリリースでは、このようなフィールドの新しい動作が有効になる予定だ:
静的でない集約のフィールドは常にアドレス可能である。 つまり、それらはオブジェクト内のスペースを占有することになる:
struct S { // 2.062では暗黙的にstaticであったが、現在は警告している。将来のリリースではstaticでなくなる。 immutable int[] arr = [1, 2]; // 同上 const int[] arr2 = [1, 2]; }
これは、このような宣言に参照なしでアクセスしたコードはコンパイルできなくなることを意味する。this にアクセスするコードはコンパイルできなくなる。さらに、このようなフィールドを持つ に依存していたコードも修正しなければならない:
struct S { immutable int[] arr = [1, 2]; } void main() { auto x = S.arr; // 将来のリリースではエラーとなり、'arr'は'this'参照を必要とする。 // 2.062と2.063では、Sはサイズ1である。将来のリリースでは、これは変更され、以下のstatic assertが通るようになる。 static assert(S.sizeof == size_t.sizeof + size_t.sizeof); // ptr + length for the array }
フィールドを再び静的にするには、単にstaticキーワードを使えばよい。あるいは フィールドをenum にしてマニフェスト定数にする:
struct S { static immutable int[] arr = [1, 2]; enum arr2 = [1, 2]; }
ただし、配列であるマニフェスト定数は、各使用時に割り当てられることに注意されたい、 の代わりにstatic を使用することを好むかもしれない。
根拠: マニフェスト定数は配列である:
const/不変のフィールドかどうか、イニシャライザを持つかどうかに基づいて、フィールドを暗黙的に静的にすることは混乱を招く。static キーワードを使用すると、どのフィールドも明示的に静的にすることができる。
- コンストラクタ修飾子は、オブジェクトを構築するときに考慮される:
修飾されたコンストラクタは、const/immutable/shared 集約オブジェクトがインスタンス化されるときに呼び出される。 がインスタンス化されるときに、修飾されたコンストラクタが呼び出されるようになった:
import std.stdio; class C { this() { writeln("1"); } this() const { writeln("2"); } this() immutable { writeln("3"); } this() shared { writeln("4"); } } void main() { auto a = new C; // "1"を書き込む auto b = new const C; // "2"を書き込む auto c = new immutable C; // "3"を書き込む auto d = new shared C; // "4"を書き込む }
この結果、immutable またはshared コンストラクタ "しか持たない集合体は、変更可能なオブジェクトのインスタンス化に使用できなくなる:
class C { this() immutable { } this() shared { } } void main() { auto c1 = new C; // 不許可 auto c2 = new immutable C; // OK auto c3 = new shared C; // OK }
一方、shared またはimmutable コンストラクタを持たない集合体は、それぞれ または オブジェクトを構築するために使用できなくなる。 を持たない集合体は、それぞれshared またはimmutable オブジェクトを構築するために使用できなくなる:
class C { this() { } } void main() { auto c1 = new C; // OK auto c2 = new immutable C; // 不許可 auto c3 = new shared C; // 不許可 }
しかし、集合体がpure コンストラクタを持つ場合、任意の型コンストラクタでオブジェクトを構築するために使用できる:
class C { this() pure { } } void main() { auto c1 = new C; // OK auto c2 = new immutable C; // OK auto c3 = new shared C; // OK }
- ビット比較以外の比較を必要とする構造体メンバが適切に比較されるようになった。
以前のリリースでは、配列のような一部の構造体メンバは比較操作でビット単位で比較されていた。 これが構造体比較に変更された:
struct S { char[] data; } void main () { auto s1 = S("foo".dup); auto s2 = S("foo".dup); assert(s1.data !is s2.data); // どちらもユニークなデータである assert(s1 == s2); // 2.063では合格 assert(s1.data == s2.data); // 上記と同等 }
opEquals 関数が存在しない場合、コンパイラーは式を書き換える。 s1 == s2 をs1.tupleof == s2.tupleof に書き換える。.tupleof 式の比較は、2.063リリースのDに追加された機能である。 式の比較も2.063リリースのDに追加された機能である。
- 配列のコピー操作では、常にスライス構文を使用する必要がある:
配列コピー操作の右辺では、スライス構文を使用する必要がある:
void main() { int[][2] x; int[] y; int[] z; x[] = z; // z (ポインタ + 長さ)をxに2回コピーする y[] = z; // zの各要素をyにコピーする(コンパイラは警告を出す) }
もしユーザーがそのようなコードを書くつもりなら、ソース配列とターゲット配列の両方にスライス構文を使わなければならない:
void main() { int[][2] x; int[] y; int[] z; y[] = z[]; // zの各要素をyにコピーする(警告は出ない) }
根拠:このような理由で、このような決断を下したのである:
理由:コンパイラは、コピー操作が恣意的に高価であることを警告する。
- 型がtypeof 式で引数として機能しなくなった:
型をその型の値として関数に渡すことができなくなった:
T[] foo(T)(T t) { return null; } void main() { alias int Int; // 以前は動作していた(エイリアスを使った場合のみ)、現在はコンパイラーエラー alias typeof(foo(Int)) IntArray; }
ユーザーが特定の型の引数を渡したい場合は、.init " プロパティを使用することができる:
T[] foo(T)(T t) { return null; } void main() { alias typeof(foo(int.init)) IntArray; // OK }
根拠:このような理由で、このような決断を下したのである:
理由:特殊な文脈で型を "式"として扱うことは混乱を招くだけである。 その代わりに、.init " プロパティをそのような目的に使うことができる。
- foreach範囲のインデックス変数は、もはや暗黙の参照ではない:
foreach範囲のインデックス変数は、デフォルトで値型になった:
void main() { size_t count; foreach (n; 0 .. 10) { ++n; ++count; } assert(count == 10); // 合格 }
もしユーザーがインデックス変数を変更したい場合は、ref キーワードを使わなければならない:
void main() { size_t count; foreach (ref n; 0 .. 10) { ++n; ++count; } assert(count == 5); }
根拠:このような理由で、このような決断を下したのである:
インデックス変数を暗黙的にref にすると、追跡が困難なバグが発生する可能性がある。
- 連想配列のエントリは、代入前にデフォルトで初期化されなくなった:
連想配列のエントリーは、代入される前にデフォルトで初期化されていた:
void main() { int[int] aa; aa[1] = aa[1] + 1; // 2.062ではエラーはスローされなかった assert(aa[1] == 1); // 2.062では動作していた }
2.063では、存在しないエントリーにアクセスするとRangeErrorがスローされるようになった:
void main() { int[int] aa; aa[1] = aa[1] + 1; // 2.063ではRangeErrorがスローされる }
根拠:このような理由で、このような決断を下したのである:
代入時のデフォルト初期化はバグの原因になる。
- const属性は、オーバーライドされたメソッドでは継承されなくなった。
メソッドのオーバーライドで、ベース・メソッドの const 属性が継承されなくなった:
class A { void foo() const { } } class B : A { // 2.062では動作していた、現在はエラー override void foo() { } // 'const'がないことに注意 }
ユーザーがconstメソッドをオーバーライドしたい場合は、オーバーライドするメソッドをconstとしてマークしなければならない。 メソッドをconstとしてマークしなければならない:
class A { void foo() const { } } class B : A { override void foo() const { } // OK }
この機能により、メソッドの定数に基づいて新しいオーバーロードを導入することができる:
class A { void foo() const { } } class B : A { // 新しいオーバーロードを導入する(オーバーライドではない!) void foo() { } // 上記のオーバーロードが導入された場合、ユーザーは以下のいずれかを行わなければならない: // a: 関数のハイジャックを防ぐため、constオーバーロードを再度導入する alias super.foo foo; // これをしないとコンパイラーエラーになる // もしくはb: 適切に型付けされたオーバーライドを提供する: override void foo() const { } }
- typeof(null) は暗黙的にT[]に変換されなくなった:
以前は次のようなコードが許されていた:
void f(int[] function() del) { assert(!del()); // 失敗 } typeof(null) g() { return null; } void main() { f(&g); f(() => null); }
しかし、暗黙の変換は間違ったコードを生成してしまう。 これを回避するには、return型が適切に型付けされていることを確認する、 あるいは、ラムダ式の戻り値式で(T[]).init :
void f(int[] function() del) { assert(!del()); // 合格 } int[] g() { return null; } // 戻り値の型を修正した void main() { f(&g); // OK f(() => (int[]).init); // OK }
- テンプレート化された "This Parameter"はメンバー関数の修飾子を変更する:
テンプレートThisパラメータを使うことで、this のメンバ関数の修飾子を推測できるようになった。 関数に推論できるようになった:
struct S { void foo(this T)() { } } void main() { immutable S s; s.foo(); // S.fooを不変にする }
- アレイのスライスがr値になった:
配列スライスはもはやl値ではない。これは、スライスからアドレスを取ることができなくなったことを意味する。 スライスは関数にrefで渡すことはできない:
void foo(ref int[] arr) { arr = new int[10]; } void main() { int[] arr; foo(arr); // OK assert(arr.length == 10); foo(arr[]); // 2.063では不許可、スライスはr値である auto ptr = &arr[1..2]; // 2.063では不許可、r値のアドレスを取ることができない }
これを回避するには、スライスの再割り当てやサイズ変更が必要なく、その内容を読み取ったり変更したりするだけでよい場合は、関数にr値を取らせるようにすればよい。 を取るようにすればよい。 そうでない場合は、l値とr値の両方を受け取る関数にすればよい。 の引数をauto ref :
void take(int[] arr) { } void takeRef(ref int[] arr) { } void takeAutoRef(T)(auto ref T[] arr) { } void main() { int[] arr = [1, 2, 3, 4]; take(arr); // OK takeRef(arr); // OK takeAutoRef(arr); // OK int[] arr2 = arr[1 .. 2]; take(arr2); // OK、arr2は変数である takeRef(arr2); // 同上 takeAutoRef(arr2); // 同上 take(arr[1 .. 2]); // OK takeRef(arr[1 .. 2]); // エラー、r値を参照渡しできない takeAutoRef(arr[1 .. 2]); // OK }
根拠:このような理由で、このような決断を下したのである:
理由:スライスを参照渡しすることは、呼び出し先でそのようなスライスを再割り当てまたはサイズ変更する際に観測可能な効果がなかった。 従って、そのようなスライスはデフォルトでr値にすべきである。 例えば、以下のコードは以前は許可されていたが、現在はコンパイル時のエラーとなる:
void reAssign(ref int[] arr) { arr = new int[2]; } void reSize(ref int[] arr) { arr.length = 10; } void main() { int[] arr = [1, 2, 3, 4]; reAssign(arr[0 .. 4]); // 再割り当ては、呼び出し元で観測可能な効果をもたらさない assert(arr == [1, 2, 3, 4]); reSize(arr[0 .. 4]); // サイズ変更は呼び出し元で観測可能な効果を持たない assert(arr.length == 4); }
- this 、参照なしで非静的フィールドにアクセスすることは、特定のコンテキストでのみ許される:
静的でないフィールドへのアクセスは、以前は多くのコンテキストで許可されていたが、現在はいくつかのコンテキストに限定されている:
- offsetof init その他の組み込みプロパティは許可されている:
struct S { int field; } void main() { auto a = S.field.offsetof; // OK、statically known auto c = S.field.max; // 同上 auto d = S.field; // 不許可、`this`参照はない }
- 非静的フィールドの静的メソッドを呼び出す場合:
struct Foo { static struct Bar { static int get() { return 0; } } Bar bar; } void main() { static assert(Foo.bar.get() == 0); // OK、`typeof(Foo.bar).get()`と等価である }
- を使用して暗黙的に静的フィールドにアクセスする場合は、以下のようになる。 alias this式を使って暗黙的に静的フィールドにアクセスする:
struct Foo { static struct Bar { static int get() { return 0; } } Bar bar; alias bar this; } void main() { static assert(Foo.get() == 0); // OK、'typeof(Foo.bar).get()'と等価である }
- 配列が暗黙的にポインタに変換されなくなった:
配列の暗黙のポインタ変換は非推奨の機能だった:
void foo(int* p) { } void main() { int[] arr = [1, 2]; foo(arr); // コンパイル時に-dスイッチが使用されていればOK }
この機能は現在完全に削除されている。回避策としては .ptr プロパティを使うか、明示的に最初の要素へのポインタを渡すことである:
void foo(int* p) { } void main() { int[] arr = [1, 2]; foo(arr); // コンパイルエラー foo(arr.ptr); // OK foo(&arr[0]); // OK }
言語の強化
- 一意なオブジェクトを返す式は、暗黙的にimmutableにキャストできる:
オブジェクトや配列に対するnew 、配列に対するdup のような式が、一意であると推測できるようになった。 これにより、コンパイラーはこのような式を暗黙のうちにimmutableに変換することができる:
class C { } void main() { immutable int[] arr1 = new int[](3); // OK immutable int[] arr2 = [1, 2, 3].dup; // 2.063ではOK immutable C[] arr3 = [new C, new C].dup; // 2.063ではOK }
- voidの静的配列をユーザーが初期化できるようになった。
void の静的配列はユーザー・コードで初期化できなかった:
void main() { void[2] varr1; // 2.062ではエラー void[2] varr2 = (void[2]).init; // 2.062ではエラー void[2] varr3 = void; // 2.062ではOK }
2.063では、明示的なイニシャライザーが使用できる:
void main() { void[2] varr1; // 2.063ではまだエラー void[2] varr2 = (void[2]).init; // 2.063ではOK void[2] varr3 = void; // 2.063ではOK }
.init プロパティは、配列を実質的にゼロ初期化する。
根拠:配列はゼロ初期化される:
理由:静的ボイド配列に特化することなく、一般的なコードで.init 。 を使用できるようにするためである。
- 集約が複数の不変量を含むことができるようになった:
集約型が複数の不変量を持つ場合、不変量の本体は単一の不変量関数にマージされ、実行される。 にマージされ、順番に実行される。1つのインバリアント内のコードは、コードやインバリアントを参照することはできない。 のコードは、別の不変量のコードやデータを参照できないことに注意すること:
struct S { int x; void foo() { } invariant() { int local; assert(x != 0); } invariant() { // local = 1; // 変異体はもう一方の変異体にアクセスできない assert(x % 2 == 0); } } void main() { S s = S(2); s.foo(); // パブリック関数を呼び出すと、両方の変数が順番にトリガーされる }
- テンプレート化された集合体のメソッドは、属性を推測できるようになった:
いくつかの属性を持つ関数がテンプレート化された集約をインスタンス化する場合、そのメンバ関数はそれらの属性を推論する、 ある属性を持つ関数がテンプレート化された集約をインスタンス化する場合、そのメンバ関数はそれらの属性を推論する:
struct S(T) { T square(T x) { return x * x; } } void main() pure { S!int s; // S!int.squareが純粋になり、main()から呼び出せるようになる assert(s.square(2) == 4); // OK }
- is expression はもはや識別子を必要としない:
場合によっては is式 が識別子を必要とする場合があった:
void main() { alias AA = string[int]; static if (is(AA _ == V[K], V, K)) { pragma(msg, _); // string[int]を表示 pragma(msg, K); // intを表示 pragma(msg, V); // stringを表示 } }
識別子はもはや必要ないので、上記は次のように書き換えることができる:
void main() { alias AA = string[int]; static if (is(AA == V[K], V, K)) { pragma(msg, AA); // string[int]を表示 pragma(msg, K); // intを表示 pragma(msg, V); // stringを表示 } }
- サイズが既知の動的配列は、文脈によっては暗黙的に静的配列にキャストできる:
あるコンテキストでは、コンパイラーは動的配列や配列のスライスのサイズを知っている。 このような場合、コンパイラは同じサイズの静的配列への暗黙の変換を許可する:
void foo(int[4] x) { } void main() { int[] arr = [1, 2, 3, 4, 5, 6, 7, 8]; foo(arr[0 .. 4]); // OK }
別の例では、文字列が静的配列への参照に変換される:
string str = "aaaabbbbccccdddd"; void foo(ref const(char)[16] buf) { assert(buf.ptr is str.ptr); } void main() { foo(str[0..16]); // OK }
制限事項がある:
- この機能は、スライスのサイズを仮定するのが妥当な複雑な式ではまだ使えない。 スライスの大きさを仮定するのが妥当であるような複雑な式ではまだ機能しない:
void foo(int[4] x) { } void main() { int[] arr = [1, 2, 3, 4, 5, 6, 7, 8]; foreach (i; 0 .. 4) { foo(arr[i .. i + 4]); // 未サポート } }
- タプルをvoid初期化できるようになった:
タプル変数をvoid初期化できるようになった:
template Tuple(T...) { alias T Tuple; } void main() { Tuple!(int, int) tup1 = void; // OK }
このような初期化では、タプルの値は未定義である。
- テンプレート制約は、継承リストの後に置くことができる:
以前は、テンプレート制約は継承リストの前にしか置けなかった。 テンプレート制約を継承リストの後に置くことができるようになった:
class Foo(T1, T2) if (is(T1 == int) && is(T2 == string)) : Base { }
この制限は解除され、書けるようになった:
class Foo(T1, T2) : Base if (is(T1 == int) && is(T2 == string)) { }
- タプルが等しいかどうかを比較できるようになった:
例:
struct Tuple(T...) { T field; alias field this; } void main() { auto tup1 = Tuple!(int, int)(1, 2); auto tup2 = Tuple!(int, int)(1, 2); auto tup3 = Tuple!(int, int)(1, 3); assert(tup1 == tup2); // 2.063以降で動作 assert(tup1 != tup3); // 2.063以降で動作 }
これは、std.traitのParameterStorageClassTuple インスタンスを比較できるようになったことも意味する:
import std.traits; void func1(ref int x, ref int y) { } void func2(ref float x, ref float y) { } void main() { alias Storages = ParameterStorageClassTuple; assert(Storages!func1 == Storages!func2); }
それに加えて、組み込みの.tupleof 式を使えば、集約のフィールドを簡単に比較することができる:
struct S { char[] a, b; // この型の別のインスタンスに対する等値テストを実装する。 bool opEquals(S rhs) { return this.tupleof == rhs.tupleof; } } void main() { S s1 = S("a".dup, "b".dup); S s2 = S("a".dup, "b".dup); assert(s1 == s2); }
これにより、別の型のインスタンスに対する構造的な等質性テストを実装することもできる。 を実装することもできる:
struct S1 { char[] a, b; // 他の型Tに対する構造的等値テストを実装する bool opEquals(T)(T rhs) { return this.tupleof == rhs.tupleof; } } struct S2 { string x, y; } void main() { auto s1 = S1("123".dup, "456".dup); auto s2 = S2("123", "456"); assert(s1 == s2); }
タプルはスライスできるので、この機能を使ってタプルのサブセットを比較することができる:
struct S { int a, b, c, d, e; bool opEquals(S rhs) { // a, b, d, eを比較する return this.tupleof[0..2] == rhs.tupleof[0..2] && this.tupleof[3..5] == rhs.tupleof[3..5]; } } void main() { S s1 = S(1, 2, 0, 3, 4); S s2 = S(1, 2, 1, 3, 4); assert(s1 == s2); }
- 初期化子を持つフィールドは、constコンストラクタで再初期化できるようになった:
constコンストラクタでフィールドを初期化できるようになった。 コンストラクタでフィールドを初期化できるようになった:
struct S { bool field = true; this(int v) const { field = false; // OK } }
- コンテキスト・ポインターを持つ集約と関数の発見のために、isNested 特性を追加した:
新しいisNested形質によって、以下のことが可能になる。 新しいisNested traitは、集約や関数がコンテキスト・ポインタを含んでいるかどうかを発見することができる:
void main() { int x; struct S1 { void f() { x++; } } static struct S2 { } void f1() { x++; } static void f2() { } static assert(__traits(isNested, S1)); static assert(__traits(isNested, f1)); static assert(!__traits(isNested, S2)); static assert(!__traits(isNested, f2)); }
- テンプレート化された関数は、関数の中に入れ子にすることができる:
- UFCSがスコープ付きローカル・インポートで動作するようになった:
ローカル・インポートによって利用可能になった関数は、Uniform Function Call Syntaxを使用する際にピックアップされるようになった:
module foo; string concat(string arg1, string arg2) { return arg1 ~ arg2; }
module test; void main() { import foo; assert("foo".concat("bar") == "foobar"); // UFCSが動作するようになった }
この機能は、アグリゲート内のインポートでも機能する。ローカル・インポートは、モジュール・スコープのインポートよりも優先順位が高いことに注意されたい。 よりも優先される。
- __FUNCTION__ 、__PRETTY_FUNCTION__ 、__MODULE__ を追加した:
新しい キーワードが追加された。 追加された。__FILE__ 、__LINE__ とともに、コードのデバッグに役立つ完全な機能セットを形成している。 を形成している:
module test; import std.stdio; void test(string file = __FILE__, size_t line = __LINE__, string mod = __MODULE__, string func = __FUNCTION__, string pretty = __PRETTY_FUNCTION__) { writefln("file: '%s', line: '%s', module: '%s',\nfunction: '%s', pretty function: '%s'", file, line, mod, func, pretty); } int main(string[] args) { test(); return 0; }
上記のように出力される:
file: 'test.d', line: '13', module: 'test', function: 'test.main', pretty function: 'int test.main(string[] args)'
- DDoc: 非推奨宣言はDEPRECATED マクロでラップされるようになった:
module test; /// sum関数 deprecated int sum(int x, int y) { return x + y; }
デフォルトでは、マクロは引数に展開される。これは、例えばユーザーによってオーバーライドすることができる:
macros.ddoc:
DEPRECATED=<del>$0</del>
上記のddocファイルは、ドキュメンテーションを作成するときに使用できる:
$ dmd -D -o- test.d macros.ddoc
- 検証可能なコード例生成のためのドキュメント化されたunittest機能を追加した:
シンボル宣言の後に続くドキュメント化されたunittestは、DDOCドキュメントを生成する際に、シンボルの例セクションを生成するために使用されるようになった。 の例セクションを生成するために使われるようになった。例:」と表示される:
/// sum関数 int sum(int x, int y) { return x + y; } /// unittest { assert(sum(2, 2) == 4); }
unittestの本体はsum関数のドキュメントの一部となる。これにより 関数の実装者は、常にその例を最新に保つことができる。
詳しくは ドキュメントページ を参照のこと。
void test() { template ArrayOf(T) { alias ArrayOf = T[]; } static assert(is(ArrayOf!int == int[])); }
関数の内部でtemplateを許可することで、より良いカプセル化が可能になり、モジュール・スコープのシンボル名の汚染を避けることができる。 モジュール・スコープのシンボル名の汚染を避けることができる。
コンパイラの機能強化
- 空のmain関数を追加する-mainスイッチを追加した:
-main ・スイッチは、主にライブラリーのunittest時に便利である:
module test; int sum(int a, int b) { return a + b; } unittest { assert(sum(2, 2) == 4); }
上記のライブラリでは、unittestsを実行するためにmain() 関数が必要になる、 -main :
$ dmd -unittest -main -run test.d
- 最小カバレッジ・テスト用に-cov=percentageスイッチを追加した。
-cov スイッチにオプションのパーセンテージ設定が追加された。 これは、カバレッジが指定された要件を満たさない場合に実行ファイルをエラーにするものである:
module test; void test1() { int x = 5; } void test2() { int x = 5; } void test3() { int x = 5; } void main() { test1(); test2(); }
カバレッジテストの例:
$ dmd -cov=90 test.d $ test Error: test.d is 80% covered, less than required 90%
- コンパイラのプラグマでシンボルのマングリングを上書きする機能を追加した:
新しいpragma(mangle, ...) ディレクティブにより、任意のシンボルにカスタム・マングリングを設定できる:
pragma(mangle, "module") extern(C) void module_();
上記は、通常 "module"という名前のC関数にリンクすることを可能にする。 module "は予約されたDキーワードなので、通常は直接リンクすることはできない。
phobosの変更点
- std.typecons.scopedの実装が変更され、いくつかのユーザーコードが壊れる可能性がある:
scoped 呼び出しの型を取得するためにstd.traits.ReturnType トレイトを使っていたユーザーコードは、代わりに 演算子を使うように変更しなければならない。 代わりにtypeof 演算子を使うように変更しなければならない:
class A { this() {} this(int) {} } class B { // ReturnType!(scoped!A) a; // 2.063では許可されていない typeof(scoped!A()) a; // 書き直され、2.063ではコンパイルされる this() { a = scoped!A(1); // 2.062ではコンパイルされなかったが、2.063で使用された構文で動作する。 } }
この変更の理由は、クラスが複数のコンストラクタを持つ場合、ReturnType "トレイト"が間違った型を取得してしまい、フィールドの初期化に失敗してしまうからである。 が複数のコンストラクタを持つ場合、間違った型を取得してしまい、フィールドの初期化に失敗してしまうからである。
新しい実装のもう1つの利点は、scoped 、ユーザビリティのためにエイリアスを作成できるようになったことである:
class A { this(int) { } } void main() { alias scoped!A scopeA; auto a = scopeA(1); }
フォボスの機能強化
- std.process はゼロから再設計され、新しいAPIと機能を導入した:
新しい std.process新しいモジュールでは、カスタムパイプリダイレクトでプロセスを呼び出す機能が導入されている、 プロセスの終了を待つ機能、プロセスを kill する機能などが導入されている。機能の全リストは は std.processドキュメントにある。
- std.getopt ブール値を false に設定できるようになった:
例:":
void main(string[] args) { bool flag = true; getopt(args, &flag); }
--flag=false 経由で呼び出されると、flag をfalse に設定する。
- std.concurrency に ownerTid プロパティを追加した:
子スレッドからオーナー・スレッドにメッセージを送るのが簡単になった。 オーナー・スレッドにメッセージを送るのが簡単になった。ownerTid "プロパティを使って、オーナー・スレッドのTid識別子を取得するだけだ。 スレッドのTid識別子を取得する:
void fun() { string res = receiveOnly!string(); assert(res == "Main calling"); ownerTid.send("Child responding"); // new } void main() { auto child = spawn(&fun); child.send("Main calling"); string res = receiveOnly!string(); assert(res == "Child responding"); }
オーナースレッドが終了した場合、子スレッドからownerTidにアクセスすると、。 にアクセスすると、TidMissingException がスローされる。
D 2.063のすべてのバグ修正と機能強化のリスト:
DMDコンパイラのリグレッション
- Bugzilla 9130: コンパイル時に構築された構造体のコードジェネが正しくない。
- Bugzilla 9258: opAssignが基底クラスで "identity assignment operator overload "エラーを引き起こす。
- Bugzilla 9526: unittestsでプロジェクトをコンパイルする際のICE
- Bugzilla 9536: staticメンバをconstメンバから呼び出すとIFTIに失敗する
- Bugzilla 9538: リグレッション (2.062):静的配列の .ptr で typeid が使えない。
- Bugzilla 9539: 配列からポインタへの暗黙の変換が間違っている。
- Bugzilla 9545: [REG 2.063a] メンバーテンプレートのインスタンス化でICEが発生する
- Bugzilla 9552: DMDが"__traits(getOverloads)"からメンバーデリゲートを取得する際にクラッシュした。
- Bugzilla 9566: リグレッション (2.062):struct .init が単一の要素から初期化された静的配列を含む場合に使用できない。
- Bugzilla 9568: [64bit] scope(exit)のコードが間違っている。
- Bugzilla 9633: オブジェクトのメソッド呼び出しが実際にはコンパイルされない場合でも、コンパイルトレイトが誤って真を返す
- Bugzilla 9650: traits(コンパイル) + ミックスイン(ミックスイン)
- Bugzilla 9663: [REG2.063a] issue 7444の変更によりICEが発生した。
- Bugzilla 9672: 循環インポート内の"ミックスイン"が未定義のプロパティを引き起こす。
- Bugzilla 9689: std.typecons.Proxyが"@disable this(this)"で壊れてしまう。
- Bugzilla 9694: opEqualsが変更可能なメンバ構造体は奇妙なエラーメッセージを報告する。
- Bugzilla 9739: リグレッション(1.077 git-head):DMDがデフォルトの引数を持つctorをデフォルトのctorと見なさない。
- Bugzilla 9759: 無効なコードに対する StructLiteral::implicitConvTo(Type*) でコンパイラがセグメンテーションフォールトを起こす。
- Bugzilla 9764: Ddoc:Ddocファイル名が正しく強調されていない
- Bugzilla 9775: 変数が明示的に型付けされている場合、CTFE で const Date を作成できなくなった。
- Bugzilla 9806: struct.c:668 でアサーションに失敗していた。
- Bugzilla 9834: ラムダの局所性が正しく検出されない。
- Bugzilla 9846: 前方参照の後退
- Bugzilla 9858: opAssign が存在する場合、const エイリアスが失敗する。
- Bugzilla 9865: 偽のインポート/循環参照でクラッシュする。
- Bugzilla 9890: エイリアスthis + エイリアスフィールド
- Bugzilla 9903: std.typeconsとetc.c.sqlite3でddocが壊れている
- Bugzilla 9919: リグレッション (2.062):public import と mixin でシンボル検索に失敗する。
- Bugzilla 9952: 回帰(HEAD):仮想関数の属性推論でサブクラスが壊れる。
- Bugzilla 9957: [2.061 -> 2.062] 列挙型float配列のポインタを取るとゴミが出る。
- Bugzilla 9974: 不変のコンストラクタが壊れる。
- Bugzilla 9984: inout修飾子がコンストラクタの引数でスキップされる(テンプレートコンストラクタのみ)
- Bugzilla 9987: 構造体 ModuleInfo の宣言は許可されるべきである。
- Bugzilla 10002: 2.062 -> 2.063 の"remove" 呼び出しは不純である。
- Bugzilla 10003: void* UFCS回帰
- Bugzilla 10016: RefCountedを使ったエラーギャグの不正確さ
- Bugzilla 10040: 構造体関連 ICE
- Bugzilla 10041: 連想配列の ufcs 書き込み
- Bugzilla 10043: traits(compiles)によるICE
- Bugzilla 10044: TemplateParameterListによるIsExpの間違ったdi生成
- Bugzilla 10047: opDispatchのインスタンス生成の失敗はUFCSのためにギャグにすべきである。
- Bugzilla 10049: 範囲集合に対するforeachの内部で "Label already defined "という偽のエラーが発生する
- Bugzilla 10050: リグレッション(git-head):RDMDがDMDからエラーメッセージを出さなくなった。
- Bugzilla 10053: 構造体メンバが純粋なdtorを持つ場合、宣言されたdtorも純粋でなければならない。
- Bugzilla 10055: dtor/postblitビルディングで属性のマージが正しくない。
- Bugzilla 10056: テンプレートとstring.formatの奇妙なエラー
- Bugzilla 10067: [REG] テンプレートの再帰的インスタンス化
- Bugzilla 10073: デフォルトのopEqualsはDMD HEADのクラス宣言順序に依存する。
- Bugzilla 10076: expression.c:4310: virtual Expression* TypeExp::semantic(Scope*):アサーション0 に失敗した。
- Bugzilla 10089: 指定されたモジュールで奇妙な関数呼び出しエラーメッセージが表示された。
- Bugzilla 10091: [HEAD] 構造体メンバ文字列enumを同じサイズの静的ubyte配列にキャストできない。
- Bugzilla 10096: リグレッション (git-head):__traits(allMembers)は境界外エラーを引き起こす。
- Bugzilla 10101: static if 条件をミックスインテンプレートを使ってグローバルスコープに置くことはできない。
- Bugzilla 10106: [ICE] glue.c:1215のIce + 行のない2つのエラーメッセージ
- Bugzilla 10134: テンプレートの相互参照エラー
- Bugzilla 10142: [REG2.063a] クラスメンバで宣言された "列挙型値"のセマンティックな問題
- Bugzilla 10144: finalクラス内部でenumを使用すると奇妙なエラーが発生する
- Bugzilla 10148: regression 062=>063: 不当な "safe function cannot call system function"が発生する。
- Bugzilla 10151: final: enumの前がエラーになった。
- Bugzilla 10160: 行番号がない。"unot modify struct ... with immutable members" 構造体を変更できない。
- Bugzilla 10166: XXXはテンプレートではない
- Bugzilla 10178: 長さゼロのタプル比較でコンパイラがセグメンテーション・エラーを起こす
DMDコンパイラのバグ
- Bugzilla 1520: TypeInfo_Const.opEqualsが正しくない。
- Bugzilla 1804: 配列の繰り返し確保で深刻なGCリークが発生する。
- Bugzilla 2356: 配列リテラルを非静的イニシャライザとして使用すると、非効率的なコードが生成される。
- Bugzilla 3789: [TDPL] ビット比較でない比較を必要とする構造体メンバが正しく比較されない。
- Bugzilla 4094: ICE(expression.c):型推論を伴う再帰構造体テンプレート : [TDPL] ビット毎の比較を必要としない構造体メンバが正しく比較されない : [TDPL] ビット毎の比較を必要としない構造体メンバが正しく比較されない : [TDPL] ビット毎の比較を必要とする構造体メンバが正しく比較されない : ICE(expression.c): 型推論を伴う再帰構造体テンプレート
- Bugzilla 4247: コンストラクタが定義されている場合、ヒープ上にデフォルト構造体を作成できない
- Bugzilla 4414: ICE(cgcs.c) 関数によって返される静的配列の項目を取る。
- Bugzilla 4436: Tuple.initに関する二重バグ
- Bugzilla 4479: モジュール Foo が複数のファイルに存在する Foo
- Bugzilla 4617: エイリアスのthis'edシンボルはテンプレートに渡せない
- Bugzilla 4814: rdmd:ofを使用し、-LリンカーオプションをON/OFFしてもリビルドされない。
- Bugzilla 5450: コンストラクタの暗黙の super() 呼び出しにマッチしない。
- Bugzilla 5625: std.formatのunittestが無効になった。
- Bugzilla 6070: CTFE UFCS 前方参照エラー
- Bugzilla 6089: 静的な2D配列でない__gsharedを持つ
- Bugzilla 6153: 配列!(配列!T)の中に配列!Tを挿入するとセグメンテーションフォールトが発生する。
- Bugzilla 6312: テンプレートのインスタンスは、それを囲むテンプレートの引数を使用できない。
- Bugzilla 6431: [RDMD] ライブラリを変更してもリビルドが実行されない
- Bugzilla 6535: RDMDが壊れたライブラリファイルを出力する
- Bugzilla 6539: テンプレートのインスタンス化に失敗した場合の分かりにくいエラーメッセージ
- Bugzilla 6545: [CTFE] ハードコードされた配列操作はまだサポートされていない
- Bugzilla 6578: コンストラクタを持つ構造体の const は無視される。
- Bugzilla 6795: ICE(cgcs.c):列挙型配列項目のインクリメント
- Bugzilla 6852: ParameterStorageClassTuple のインスタンスを比較できない。
- Bugzilla 7068: ポインタの配列をコピーする際に -d で memcpy の代わりに memset を呼び出す
- Bugzilla 7437: DMDがオーバーロード解決中に無限ループに入る
- Bugzilla 7569: タプルの宣言をvoidで初期化できない
- Bugzilla 7572: f.fn!(void)はl値ではない
- Bugzilla 7719: enumが中括弧内にある場合、enum前方参照エラーが発生する。
- Bugzilla 7980: スタックオーバーフロー / 別名のthisを使った再帰的展開
- Bugzilla 8041: __gshared/staticの問題
- Bugzilla 8081: 生成された "header"ファイルにおける純粋なnothrow unittest問題
- Bugzilla 8130: DMDがDLLをコンパイルする際に、*.defファイルがないと仮定してコンパイルするため、メモリが破壊される。_tls_index = 0
- Bugzilla 8213: ubyte[]へのポインタと前方へのポインタのエラーメッセージが正しくない。
- Bugzilla 8238: テンプレートはゴーストフィールドを生成できる
- Bugzilla 8245: UFCSがポインタに対して機能しない
- Bugzilla 8294: 64ビットDMDで複雑な呼び出しが壊れる
- Bugzilla 8347: declの~this()の後に置かれたconstによるパーサーのバグ
- Bugzilla 8366: constメンバ関数をmutableオーバーロードと一緒にオーバーライドすると奇妙なエラーが発生する。
- Bugzilla 8589: typeof(null) を返す関数から配列を返す関数への変換が正しくない。
- Bugzilla 8609: 静的配列の前方参照エラー
- Bugzilla 8668: public selective importは、そうでなければ衝突しない関数を衝突させてしまう。
- Bugzilla 8670: エイリアスからIFTIに失敗する
- Bugzilla 8697: 無効なエラーメッセージインターフェースの前方参照
- Bugzilla 8698: インターフェイスの前方参照エラー
- Bugzilla 8827: R12の内容を移動できない。
- Bugzilla 8828: 大きな固定サイズの行列に対するdestroy()の長いコンパイル時間
- Bugzilla 8833: 式タプルで奇妙なエラーが発生する。
- Bugzilla 8902: Xの"共用体初期化の重複"エラー。
- Bugzilla 8945: 静的構造体のイニシャライザまたはコンストラクタを、テンプレート化された内部構造体の修飾子なしで呼び出せない。
- Bugzilla 8953: パーサーがデストラクタの後の修飾子を拒否する。~this() <qualifier> { }
- Bugzilla 8989: cfloat 引数パッシングが壊れた
- Bugzilla 8998: "inout pure"はimmutableを返すが、実際にはmutableである。
- Bugzilla 9091: テンプレート化された関数で__traits(getMember)を使うとメンバ関数内で失敗する。
- Bugzilla 9144: synchronized CRITSECSIZEはターゲット定数であるべきである。
- Bugzilla 9199: モジュールレベルの修飾関数は拒否されるべきである。
- Bugzilla 9209: ice(symbol.c)でconst structヒープ割り当てを使用する。
- Bugzilla 9231: 属性推論でinout関数をオーバーライドすると変なエラーが出る
- Bugzilla 9232: テンプレート化されたメソッド呼び出しの解析エラー
- Bugzilla 9241: 2.061:プロパティ呼び出しのエラーメッセージが消えた。
- Bugzilla 9280: 正規表現における名前付きキャプチャグループの実行時範囲違反
- Bugzilla 9311: 共有ライブラリファイルの拡張子が正しく変更されない
- Bugzilla 9345: インポートされた文字列列列挙型で std.string.format を使用すると CTFE に失敗する。
- Bugzilla 9346: ネストされた構造体呼び出しがポストブリットで無効になった。
- Bugzilla 9386: 構造体のデストラクタが誤って呼び出された。
- Bugzilla 9393: 部分テンプレート特殊化とテンプレートラムダが機能しない
- Bugzilla 9401: デストラクタとnothrow構文
- Bugzilla 9413: 契約" 内の不正な変更が正しく検出されない。
- Bugzilla 9414: 仮想関数において、契約(contract)内部の不正な変更が検出されない。
- Bugzilla 9415: デリゲート推論は関数リテラルを純粋でない関数にすべきである。
- Bugzilla 9417: ネストされた構造体で「前方参照用のサイズがまだない」エラーが発生する
- Bugzilla 9428: 間違った配列連結
- Bugzilla 9441: 構造体コンストラクタが自動/型推論変数定義でミスする
- Bugzilla 9445: interpret.c:151:アサーションv->ctfeAdrOnStack >= 0 && v->ctfeAdrOnStack < stackPointer() に失敗した。
- Bugzilla 9451: 診断で抽象関数をリストアップする場合、完全なシグネチャを表示すべきである。
- Bugzilla 9473: Unittestのドキュメントはそれぞれのセクションにまとめるべき
- Bugzilla 9474: Ddocされたunittestはversion(none)を挟んでも正しく動作するようにする。
- Bugzilla 9475: ddocのunittestではソースのフォーマットを保持する。
- Bugzilla 9480: JSON出力のテンプレート名はテンプレートと関数の引数を含む。
- Bugzilla 9494: 無効な連想配列でコンパイラのスタックオーバーフローが発生する
- Bugzilla 9495: 最初の引数が8バイトを超える場合のWin64のvarargの問題
- Bugzilla 9508: ファイル変更時にRDMDが新しい依存性リストを生成しない。
- Bugzilla 9540: デリゲート・コンテキスト・フレームの割り当てでコンパイラがクラッシュする
- Bugzilla 9561: std.formatからのエラーメッセージが多い。
- Bugzilla 9590: UFCSはvoid lazy式では動作しない。
- Bugzilla 9613: 型コンストラクタで.initを使用した場合のパーサバグ
- Bugzilla 9617: "ulong.max"が小さい符号付きパラメータで誤って受け取られる。
- Bugzilla 9619: 内部関数で構造体フィールドのtypeofに失敗する。
- Bugzilla 9622: rdmdの範囲違反
- Bugzilla 9649: DMDが有効なPostfixExpression .NewExpression構文。
- Bugzilla 9652: __traits(getAttributes)がマニフェスト定数で動作しない。
- Bugzilla 9654: テンプレート化された関数はref T[len]で文字列を受け取ることができない。
- Bugzilla 9656: 可能であれば、組み込みのdupの結果は一意な配列のように振る舞うべきである。
- Bugzilla 9658: 修飾コンストラクタで初期化済みフィールドを設定できるようにする。
- Bugzilla 9677: VC 2012 64ビットで配列のlengthプロパティを設定するとクラッシュする。
- Bugzilla 9679: 条件付き代入でconst/immutable代入が拒否される
- Bugzilla 9692: パッケージのないモジュールで"__traits(allMembers)"に失敗する
- Bugzilla 9700: std.typecons.Proxyの無効化とインプレース操作でアクセス違反が発生する
- Bugzilla 9712: IFTIは配列リテラル引数からの静的配列型の推測をサポートしていない。
- Bugzilla 9713: Ddoc:空の記述は自動生成例を抑制する : Ddoc: 空の記述は自動生成例を抑制する
- Bugzilla 9714: Ddoc:Dと-unittestの組み合わせは隠れたunittest関数を明らかにする。
- Bugzilla 9720: OSX で -O を使ったコードが間違っている。
- Bugzilla 9722: オプティマイザがGOTからEBXへのロードを殺す
- Bugzilla 9729: インタフェースサンクがEBXをGOTに設定しない
- Bugzilla 9735: デリゲートのvoid*へのキャストは不正であるべきである。
- Bugzilla 9736: VS2010のプロジェクトファイルは毎回完全にリビルドされる
- Bugzilla 9743: IFTIと多相の文字列リテラルは静的配列型への暗黙の変換をサポートすべきである。
- Bugzilla 9744: コンパイル時にスレッドローカル変数のアドレスを取るエラーメッセージが悪い。
- Bugzilla 9747: 暗黙的に静的配列に変換されるコミットされた文字列リテラルに対してIFTIの引数推論が失敗する
- Bugzilla 9755: JSON出力にテンプレートの保護属性がない。
- Bugzilla 9757: Ddoc: dittoの後にドキュメント化されたunittestは機能するはずである。
- Bugzilla 9758: Ddoc: 空のddocコメントとunittestブロックは "例"セクションを生成しない。
- Bugzilla 9768: 間違ったforeach型の行番号がない
- Bugzilla 9773: デフォルト値のrefパラメータはコンパイルすべきでない。
- Bugzilla 9774: タプル・メンバーに==を使用した__errorのエラー・メッセージ
- Bugzilla 9777: finalインターフェイスメソッドを呼び出すと間違ったコードになる
- Bugzilla 9781: -inlineはバックエンドICEの原因になる
- Bugzilla 9788: 実行中のプログラムで例外がスローされた場合、-profileは機能しない。
- Bugzilla 9790: テンプレート内の無効な変数をコンパイルすると内部エラーが発生する(expression.cとbackendevalu8.c)。
- Bugzilla 9791: [ICE] (struct.c line 668) map with a missing tuple import (構造体.c line 668) タプルのインポートが見つからない。
- Bugzilla 9818: 静的配列の定数折りたたみが要素による初期化で機能しない
- Bugzilla 9829: rdmdがdmdに'--'を渡す
- Bugzilla 9837: IFTIは列挙型を考慮すべきである。
- Bugzilla 9844: DMD (-m64) int long 初期化のバグ。
- Bugzilla 9845: 列挙型はグローバルスコープで前方参照を含むことができるべきである。
- Bugzilla 9863: 64ビットでのSAHF命令の生成に誤りがある。
- Bugzilla 9873: 内蔵タプルは等価比較をサポートすべきである。
- Bugzilla 9874: テンプレート制約における関数呼び出し構文の不統一。
- Bugzilla 9880: 冗長なテンプレート・インスタンスがエラー・メッセージに表示される
- Bugzilla 9883: プロパティを新しい動的配列サイズとして使用する際のエラー
- Bugzilla 9885: IFTIは既知のタプル型を考慮すべきである。
- Bugzilla 9892: [ICE]列挙型宣言メンバでの前方参照がコンパイラのセグメンテーションフォールトを引き起こす
- Bugzilla 9899: 純粋/非投与デストラクタを持つ構造体を純粋/非投与関数の構造体メンバとして使用できない
- Bugzilla 9901: 内部テンプレート化された関数から文字列を返すとエラーが発生する
- Bugzilla 9907: デストラクタを持つ構造体リテラルは非参照オーバーロードにマッチすべきである。
- Bugzilla 9910: スカラー演算ベクトルが壊れている。
- Bugzilla 9928: void* と "関数"リテラルで氷を作る。
- Bugzilla 9936: opBinary/opBinaryRightの書き換えが間違っている。
- Bugzilla 9939: allMembersトレイトがネストした匿名列挙型のメンバを返さない。
- Bugzilla 9940: ICEがgetOverloadsで取得した関数にgetProtectionを適用する。
- Bugzilla 9946: 動的配列の割り当てでUFCSが禁止される
- Bugzilla 9961: UFCSプロパティを使って実際のエラーを抑制する
- Bugzilla 9965: DIL、SILレジスタの間違ったアセンブリ
- Bugzilla 9971: 同名関数がl値でない。
- Bugzilla 9985: Postblitがローカル構造体のreturnで呼び出されない。
- Bugzilla 9990: テンプレート化された関数のエイリアスは前方参照エラーを引き起こす。
- Bugzilla 9993: constオブジェクトの生成にはmutableよりconst ctorを優先すべきである。
- Bugzilla 9994: 組み込みで生成されるopAssignは代入時にdtorを呼び出すべきである。
- Bugzilla 10004: 副作用のあるタプル比較は機能するはずである。
- Bugzilla 10005: 構造体変数宣言とconst-correctness:構造体変数宣言とconst-correctnessは正しい。
- Bugzilla 10011: クラス参照イニシャライザーのJSON "init" プロパティ出力が正しくない。
- Bugzilla 10029: 予約済みバージョン識別子のリストを更新した。
- Bugzilla 10058: C++とextern(C++)間の一貫性のないマングリング。
- Bugzilla 10059: export が変数宣言に対して機能しない。
- Bugzilla 10063: inout+pureの結果、変更可能なデータへの不変の参照を生成することができる。
- Bugzilla 10066: テンプレートopEqualsが構造体コンパイルを妨害することがある。
- Bugzilla 10102: disableが不完全に実装されている。
- Bugzilla 10103: プロパティのオーバーロードを持つ"@property"テンプレートミックスイン
- Bugzilla 10105: 列挙型イニシャライザで文字列リテラルをstatic char配列に変換する際のICE
- Bugzilla 10115: より多くの@disabledホール。
- Bugzilla 10171: 予期せぬエラー "cannot infer type from overloaded function symbol" : "オーバーロードされた関数シンボルから型を推測できない"
- Bugzilla 10180: offsetofが関数呼び出しのエイリアスを介して動作しない。
DMDコンパイラの機能強化
- Bugzilla 3449: constと不変構造体のメンバが仕様通りに動作しない。
- Bugzilla 3502: Mac OS X 10.5の不具合を修正した。
- Bugzilla 3673: 継承 + if 節 = 失敗
- Bugzilla 4528: プライベート抽象メソッドのエラーメッセージを改善
- Bugzilla 5140: FUNCTION__、___PRETTY_FUNCTION__、___MODULE__の追加。
- Bugzilla 6185: UFCS解決時に非グローバル関数を含める。
- Bugzilla 6453: 構造体/クラスごとに複数の不変量を許可する。
- Bugzilla 6809: IFTIは、引数にinoutが存在し、戻り値にinoutが存在しない場合、constを意味する。
- Bugzilla 7444: 配列のコピーにも[]を要求する
- Bugzilla 7511: 属性推論はテンプレート化された関数に対しても機能すべきである。
- Bugzilla 8220: 意味解析中に無効な関数呼び出しが検出されない。
- Bugzilla 8669: TemplateThisParameterはメンバ関数の修飾子を変更すべきである。
- Bugzilla 8819: void static arrayはinit組み込みプロパティを持つべきである。
- Bugzilla 8959: IsExpressionは、すべてのケースでIdentifierを持たない構文をサポートすべきである。
- Bugzilla 9033: 言語から__threadを削除する
- Bugzilla 9136: isNestedを追加する。
- Bugzilla 9155: Ddoc: コードセクションは先頭の空白を取り除くべきである
- Bugzilla 9170: CTFE: float <-> int のキャストの再解釈を許可する。
- Bugzilla 9185: opが有用な場所についての注釈を追加した。
- Bugzilla 9574: alias this = that'の古い使い方に対する診断が必要である。
- Bugzilla 9627: UFCS使用時のエラーメッセージが不十分な場合がある。
- Bugzilla 9635: 静的メソッドから配列フィールドのプロパティへのアクセスに失敗した場合のエラーメッセージを改善した。
- Bugzilla 9676: Ddoc:非推奨宣言を(DEPRECATED)マクロで囲む
- Bugzilla 9680: dmd -v -o "出力にエントリーポイントの位置を含める
- Bugzilla 9723: デフォルトのmain()関数をインジェクトするために-mainスイッチを実装する。
- Bugzilla 9726: covテストに必要なカバレッジの最小値を追加した。
- Bugzilla 9727: ドキュメント化されたunittestのコメントは "Examples:"セクションの前に表示されるべきである。
- Bugzilla 9745: スレッド以外のローカル静的変数のアドレスを CTFE で取得できるようにした。
- Bugzilla 9778: RDMD: DMDへのリソースファイルの受け渡しをサポートする。
- Bugzilla 9789: エイリアスのDdocは新しい "alias x=y"構文を使用すべきである。
- Bugzilla 9866: movsxd はサポートされていない
- Bugzilla 9920: [Optimizer] 整数の定数除算にmul/imulを使用する
- Bugzilla 9941: [CTFE] "newed"クラスと構造体をデータセグメントに格納できるようにした。
- Bugzilla 9943: CTFE から typeid を返せるようにする。
- Bugzilla 9963: ブール述語を追加するCodegenの非効率性
- Bugzilla 9977: ローカルテンプレート化された関数を許可すべきである。
- Bugzilla 10030: ldにデフォルトのライブラリを渡すときに'-l:'スイッチをサポートする。
- Bugzilla 10077: シンボルのマングルをオーバーライドするために pragma(mangle, "...") を追加する。
- Bugzilla 10109: -transitionコンパイラー・スイッチを追加し、ブレークチェンジに対応できるようにした。
- Bugzilla 10150: プレフィックス・メソッドのthis修飾子はいつでも無視されるべきである。
- Bugzilla 10179: タプル代入で長さがゼロでも「has no effect」エラーを発生させないようにした。
phobosのリグレッション
- Bugzilla 9122: std.concurrency send()が複数の配列で失敗する
- Bugzilla 9742: std.math.floorはx > -1かつx < 0の値に対して0を返す
- Bugzilla 10122: Appender が無効化されたデフォルトの構築では動作しない。
phobosのバグ
- Bugzilla 3795: phobosのstd.variantの問題
- Bugzilla 4729: std.algorithm: iotaの奇妙な挙動
- Bugzilla 4798: std.algorithm.mapはconst要素のある範囲では使えない
- Bugzilla 4955: struct dirent.d_typeがマスクではない
- Bugzilla 5032: std.file.renameがWindowsとLinuxで異なる動作をする。
- Bugzilla 5201: std.string.indexOfとstd.algorithm.indexOfは狭い文字列に対して異なるものを返す
- Bugzilla 5310: Variant == const(Variant)はコンパイルできない。
- Bugzilla 5359: std.trait.isDelegateは "型"と "式"に対して機能すべきである。
- Bugzilla 5360: 別のフォルダからrdmdを呼び出す
- Bugzilla 5514: ドキュメントに誤りがある。
- Bugzilla 5658: std.typecons.Tupleに文書化されていないフィールドがある。
- Bugzilla 5924: Tuple!(char)[]のschwartzSort
- Bugzilla 8321: std.range.putはRefCounted出力範囲では動作しない
- Bugzilla 8613: std.typecons.Proxyは演算子'in'で動作しない
- Bugzilla 8655: bitfieldsとTypedefは混ざらない
- Bugzilla 9164: Nullableを別のNullableに簡単に代入できない
- Bugzilla 9431: 配列の配列でのタプル生成の問題
- Bugzilla 9456: decodeFrontが範囲外の要素をポップするかどうかで一貫性がない
- Bugzilla 9512: std.regex: 大文字から構成される16進数のパースが正しくない。
- Bugzilla 9553: SOCKETはWin64では64ビット幅であるべきである。
- Bugzilla 9583: std.getopt.getoptがargsリストからオプションのターミネーター"--"を消費しない。
- Bugzilla 9612: std.range.Cycle.opSliceの境界テストが抜けている。
- Bugzilla 9624: 関数のfullyQualifiedNameが失敗する。
- Bugzilla 9648: std.algorithm.topNにstd.randomのインポートがない。
- Bugzilla 9753: std.string.translateの前提条件がアサートされる
- Bugzilla 9794: std.jsonはdelete文字を扱えない
- Bugzilla 9804: std.math.FloatingPointControl が浮動小数点の状態を破損する
- Bugzilla 9812: std.conv.parse stringが特定のエスケープ文字で失敗する。
- Bugzilla 9836: std.array.popFrontがエイリアスのthisで動作しない。
- Bugzilla 9950: std.jsonは空の入力に対してnullではなく空の文字列/配列を返すべきである。
- Bugzilla 9956: hasElaborateAssignトレイトが静的配列で動作しない。
- Bugzilla 9979: を使用した正規表現のバグが修正された。
- Bugzilla 10116: stdio.File.byLineが最後の行を永遠に繰り返す、readln(ref C[],R)が不正なデータを返す
- Bugzilla 10167: std.format.d(181)の間違ったドキュメントコメント
- Bugzilla 10182: std.bitmanip ユニットテストには無意味な foreach ループがある
phobosの機能強化
- Bugzilla 4787: 標準アルゴリズム.bisectRight()
- Bugzilla 4921: std.variantドキュメントのシノプシスコードがアサーションエラーを投げる。
- Bugzilla 5013: std.typecons.Tupleは静的配列のコンストラクタを持つべきである。
- Bugzilla 5106: makeIndex は SortedRange を返すべきである
- Bugzilla 5226: indexOf()はpredを取るがneedleを取らない
- Bugzilla 5401: std.socketの更新とboostライセンス
- Bugzilla 5507: countUntilはR2の代わりにRanges...を取るべきである。
- Bugzilla 6224: std.concurrencyにownerTidプロパティを追加した。
- Bugzilla 6486: std.math.abs(BigInt)を追加した。
- Bugzilla 7405: std.algorithm.schwartzSort.releaseを追加した。
- Bugzilla 9260: getoptはブール値をfalseに設定できるようにすべきである。
- Bugzilla 9265: Null可能な固定サイズ配列のラッパー
- Bugzilla 9625: assertNotThrownはmsgが提供されない場合は例外msgを表示する必要がある
- Bugzilla 9802: std.traits.{isNested,hasNested} を追加する。
- Bugzilla 9814: std.trait.isNestedFunctionを追加する。
- Bugzilla 9839: std.trait.Selectでシンボルを選択できるようにする。
- Bugzilla 9888: 列挙型に対してstd.random.uniformにジェネレータを渡せるようにする
Druntimeのバグ
- Bugzilla 4307: spawn()されたスレッドが終了しない
- Bugzilla 6024: Windows 2000 SP4がサポートされなくなったドキュメント
- Bugzilla 10057: [2.063 beta] 共有phobosでモジュール情報が上書きされる。
- Bugzilla 10081: 間違った文字配列の比較
Optlinkのバグ
- Bugzilla 6144: EIP=00428DA3での予期せぬOPTLINK終了
インストーラーのバグ
- Bugzilla 9343: Fedora 18 での dmd-2.061-0.fedora.x86_64.rpm のインストールに問題がある
ウェブサイトのバグ
- Bugzilla 4847: std.algorithm.topN ドキュメント
- Bugzilla 9544: Dロゴの画像がルートレベルでないページで壊れている
- Bugzilla 9609: std.string.icmpのDdocタグがおかしい。
- Bugzilla 10036: dlang.orgにcore.atomicのドキュメントがない。
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.108.0
ドキュメントのdmdのバージョン: 2.109.1
翻訳日付 :
HTML生成日時:
編集者: dokutoku