英語版
このページの英語版を見る

変更ログ 2.072.0

前バージョン: - 次のバージョン:

Download D 2.072.0
2016年10月30日発売

ライブラリの変更

  1. TypeInfo.init は非推奨となった。
  2. 新しいdruntimeスイッチ--DRT-oncycle が追加され、モジュールのサイクル検出時の動作を指定できるようになった。
  3. 間違った @trusted 属性は から削除された。 etc.c.curl関数" から削除された。 curl_easy_escape, curl_escape, curl_easy_unescapeそして curl_unescape.
  4. MurmurHashの実装のダイジェストである。
  5. std.process でのプロセス作成が高速化された。 が追加された。
  6. algorithm.iteration.cumulativeFold が追加された。
  7. std.range.padLeft と が追加された。std.range.padRight
  8. std.regex.regex これにより が複数のパターンのマッチをサポートした。
  9. std.regex.splitter これにより が、結果の範囲内でパターン・マッチを保持することをサポートした。
  10. findLocalMin std.numeric に追加された。
  11. ptr プロパティとパブリックコンストラクタが追加された。 が に追加された。std.experimental.ndslice.slice.Slice
  12. toHash メソッドが が追加された。std.experimental.ndslice.slice.Slice
  13. slice shape ndarrayメソッドが追加された。 ユーティリティがstd.experimental.ndslice.slice に追加された。
  14. as にlazy tensorが追加された。 .std.experimental.ndslice.slice
  15. iotaSlice に遅延テンソルが追加された。 .std.experimental.ndslice.selection
  16. indexSlice 遅延テンソルが .std.experimental.ndslice.selection
  17. repeatSlice 遅延テンソルが .std.experimental.ndslice.selection
  18. mapSlice 遅延テンソルが .std.experimental.ndslice.selection
  19. 数学インデックス順序の部分的サポートがstd.experimental.ndslice.slice.Slice に追加された。
  20. std.algorithm.mutation.swapAt に追加された。 公開された
  21. std.range.iota's .length` プロパティは、イテレートされる "型"の代わりにsize_t に固定される。
  22. std.uni.isNumberに修正された。 std.uni.isPunctuationに修正された、 ASCII入力用に最適化されたパスを使用するようになった。
  23. std.uni.isAlphaNumこれは std.ascii.isAlphaNum が追加された。
  24. std.regex.regex(?#...)構文によるインライン・コメントをサポートした。
  25. std.regexに多くの最適化が適用された。 std.regex.ctRegex が一般的に高速化された。
  26. std.range.primitives.moveAtsize_t インデックス 引数のみを受け付けるようになった。
  27. std.algorithm.sorting.isStrictlyMonotonicを許さない が追加された。
  28. std.file.readLinkそして std.file.symlinkが追加された。 化された。
  29. std.conv.toImpl のオーバーロードがすべて非公開になった。以下の std.conv.to代わりに
  30. std.algorithm.searching.{min,max}Element 範囲が追加された。
  31. std.typecons.Ternaryが追加された。 ロジックを追加した。
  32. std.math.quantizeが追加された。 が追加された。
  33. std.traits に3つの新しいトレイトが追加された。
  34. std.range.generate 適切な に修正された。
  35. std.numericを検証するためにenforce を使用しなくなった。 を使用しなくなった。
  36. Final に追加された。 std.experimental.typecons
  37. std.traits.isInnerClass が追加された。 アクセス可能な ポインタを持つネストされたクラスを識別する。outer
  38. std.conv.emplace はもはや許されない。 を指定せずに、他のクラスの中に直接ネストされたクラスを配置することはできなくなった。 を指定することなく、他のクラスの内部に直接クラスを配置することができなくなった。outer
  39. 実行時に実行時にGC実装を選択するスイッチが追加された。
  40. 手動でのメモリ管理を可能にするGC実装が追加された。メモリ管理が追加された。

D 2.072.0におけるすべてのバグ修正と機能強化のリスト。

言語の変更

  1. カンマ式の結果の使用は非推奨。

    カンマ式はしばしば混乱やバグの原因となることが判明している。 例はこちらを参照のこと。

    カンマ式の結果を使用すると、非推奨メッセージが表示されるようになった。

    例:":

    void main () {
      // OK、インクリメントの結果は直接使用されない
      for (int i, j; i != 3; i++, j++) {...}
    
      auto r1 = getRange!int, r2 = getRange!int;
      // OK
      for (; !r1.empty && !r2.empty; r1.popFront, r2.popFront) {...}
      // 非推奨 - ループ条件が常に使われる
      for (; !r1.empty, !r2.empty; r1.popFront, r2.popFront) {...}
    
      MyContainerClass mc;
      // OK - 表現式、結果は使用されない
      if (!mc)
        (mc = new MyContainerClass), mc.append(new Entry);
    
      int i;
      // 非推奨
      mc = (i++, new MyContainerClass);
    }
    
  2. 暗黙のcatch文は非推奨である。

    暗黙のcatch文は、型を指定しないcatch文である。 これらはデフォルトでThrowable をキャッチする。

    例:":

    int[] arr = new int[](10);
    // これはRangeErrorをスローする
    try { arr[42]++; }
    catch { writeln("An error was caught and ignored"); }
    // 前の行は以下と等価である:
    // catch (Throwable) { writeln("An error was caught and ignored"); }
    
  3. 暗黙の文字列連結は非推奨である。

    文字列リテラルの暗黙的な連結は非常に初期の機能であり、現在では連結演算子('~')に取って代わられている。 連結演算子('~')に取って代わられた。

    その結果、配列式でカンマを見逃してしまうという見つけにくいバグが発生する可能性がある:

    void foo ()
    {
      string[] arr = [ "Hello", "buggy" "World" ];
      assert(arr.length == 3); // 失敗、配列の長さは2、中身は[ "Hello", "buggyWorld" ]
    }
    
  4. ユニオンフィールドにおけるポストブリットとデストラクタの制限が解除された。

    ポストブリット(this(this))、デストラクタ( )、または不変量( )を持つフィールドをユニオンの中に持つことができるようになった、 デストラクタ(~this())、または不変量(invariant())を持つフィールドを共用体に持つことが許されるようになった。 実際に正しいフィールドをデストラクトまたはブリットするのはプログラマーの義務である。 プログラマーの義務である。

    例:

    struct S { this(this) {} ~this() {} }
    union U
    {
        int var;
        S s;
    }
    
    unittest
    {
        U u; // uがスコープ外に出てもs.~thisを呼び出さない
        u = U(); // メモリをコピーするだけなので、代わりにフィールド単位の代入を使う
        u.s = S(); // 通常の構造体代入のように動作する
        destroy(u.s); // 現在使われているフィールドを破棄する
    }
    
  5. Align属性はCTFEable式で使用できる。

    例:

    version (D_LP64)
        enum n = 8;
    else
        enum n = 4;
    align (n) struct Data
    {
    align (n == 8 ? 2 : 1):
        ubyte[3] buffer;
        int flags;
    }
    
    version (D_LP64)
        static assert(Data.flags.offsetof == 4);
    else
        static assert(Data.flags.offsetof == 3);
    
  6. scope は、間接法のない値パラメータでは無視されるようになった。

    間接表現を持たないコピーされた値パラメータに対して、scope のストレージクラスが無視されるようになった。

    例::

    import std.traits;
    void valueParam(scope int param);
    static assert(ParameterStorageClassTuple!valueParam[0] == ParameterStorageClass.none);
    void scopeParam(scope int* param);
    static assert(ParameterStorageClassTuple!scopeParam[0] == ParameterStorageClass.scope_);
    

コンパイラの変更

  1. OS X 64ビットでのネイティブTLS。

    コンパイラがアップデートされ、OS Xの64ビット版コンパイル時にネイティブのスレッド・ローカル・ストレージ (TLS) を使用するように更新された。つまり C/C++のTLS変数とリンクできることを意味する。この変更はABI を破壊する変更であり、ライブラリーの再コンパイルが必要になる。

    コンパイラと生成されたバイナリを実行するために最低限必要なバージョンは、Mac OS X Lion (10.7)である。 Mac OS X Lion (10.7)である。

    Xcode 7.3には、いくつかのTLS変数に対してリンカー・エラーを引き起こすバグがある。 Xcode 7.3.1ではこのバグが修正されている。7.3より古いバージョンでも同様に動作する。

  2. インポートされたモジュールのエイリアスの解析が延期される。

    例:

    module lib;
    template ExpensiveApiImpl(int ver)
    {
        ...
        void func() {}
        pragma(msg, "instantiated ExpensiveApiImpl ", ver);
    }
    alias api1 = ExpensiveApiImpl!(1);
    alias api2 = ExpensiveApiImpl!(2);
    
    import lib;
    void main()
    {
        // OK、"instantiated ExpensiveApiImpl 1"と表示される
        api1.func();
    
        // インスタンス化された"instantiated ExpensiveApiImpl 2"と表示されない、
        // エイリアス名'api2'が使われていないからだ。
    }
    
  3. 特別なキーワードは、ソースファイルの絶対ファイル名に置き換えられる。

    特殊キーワード"__FILE_FULL_PATH__"は、コンパイラによって現在のソース・ファイルの絶対パスに置き換えられる。 に置き換えられる。

    例:":

    import std.stdio;
    import std.path;
    import std.file;
    void main()
    {
        writeln("The main source file lives here: ", __FILE_FULL_PATH__);
        writeln("The contents are:");
        foreach(line; File(__FILE_FULL_PATH__, "r").byLine) {
            writeln(line);
        }
        writeln();
        writeln("Other files in the same directory are:");
        foreach(entry; dirEntries(__FILE_FULL_PATH__.dirName, SpanMode.shallow)) {
            writefln("  - %s", entry.name);
        }
    }
    
  4. -verrors=spec スイッチを追加する。

    次のような投機的コンパイルによるエラーを表示する:

    void foo(int i)
    {
        int p;
        bool b = __traits(compiles, { p = &i; });
    }
    

    通常は表示されない:

    (spec:1) test.d(13): Error: cannot implicitly convert expression (& i) of type int* to int
    

    spec: の後の数字は、投機的コンパイルのネストである。

ライブラリーの変更

  1. TypeInfo.init 非推奨 は廃止された。

    これは、TypeInfo.init を削除するためのステップである。 型プロパティinitとの名前の衝突を解決するために必要である。

    代わりにTypeInfo.initializerを使用する。

  2. 新しいdruntimeスイッチ--DRT-oncycle 。 モジュールのサイクル検出時に何をするかを指定できる。

    モジュールのサイクルが検出されたときのデフォルトの動作は、サイクルを表示し、実行を中断することである。 を表示し、実行を中断することである。しかし、多くの場合、サイクル は有害ではない。新しい--DRT-oncycle スイッチを使えば、サイクルが検出されたときに サイクルが検出されたときに

    --DRT-oncycle=abort
    これはデフォルトの動作であり、最初のサイクルが検出されると、stderr にサイクルを表示して中断する。
    --DRT-oncycle=print
    検出されたすべてのサイクルをstderr にプリントするが、実行は停止しない。初期化の順序は、バイナリ内のモジュールの順序に基づいて任意に選択される。
    --DRT-oncycle=ignore
    何も表示せず、実行を停止しない。初期化の順序は、バイナリ内のモジュールの順序に基づいて任意に選択される。
    ($P このリリースの範囲内で、サイクル検出アルゴリズムの改良が行われた、 以前は検出されていなかった(無害だった)モジュール依存サイクルが、プログラムの実行を中断するようになるかもしれない。 または、モジュールの静的構築/破壊の呼び出し順序が変更されたために、プログラムが誤動作する可能性がある。 --DRT-oncycle 、コマンドライン引数を指定することなく、プログラムの動作を維持することができる、 ソースコードで以下の配列を宣言することで、リンカに指示することができる:)
    extern(C) __gshared string[] rt_options = [ "oncycle=ignore" ];
    
    ($P詳細については、D言語仕様書、第4章のサイクル検出アボートのオーバーライドのセクション、および第28.7章のガベージ・コレクタの設定を参照のこと) および第28.7章 ガベージ・コレクタの設定 を参照のこと)。
  3. std.digest.murmurhash実装

    std.digest.murmurhashの実装が追加された。MurmurHashは 一般的なハッシュベースの検索に適した非暗号化ハッシュ関数である。これは に最適化されている。

    // 便利なダイジェストテンプレートを使って、int型配列の32ビットハッシュ値を計算する。
    import std.digest.murmurhash;
    
    ubyte[4] hashed = digest!MurmurHash3_32_opt32([1, 2, 3, 4]);
    
  4. std.process 、プロセス作成がPosix上で高速化された。

    以前のPosixシステムでは、 が存在しない場合、3から最大ファイル記述子番号までのすべてのファイル記述子を閉じようとしていた。 inheritFDs を閉じようとする。 がspawnProcesspipeProcess などで指定されていない場合、Posixシステムは3から最大ファイル記述子番号までのすべてのファイル記述子を閉じようとした。 std.process現在は、poll() を使用して、どのディスクリプタを閉じる必要があるかを判断する。 ディスクリプタをクローズする必要がある。

  5. algorithm.iteration.cumulativeFold が追加された。

    std.algorithm.iteration.cumulativeFold入力範囲の連続する を返す。

    assert([1, 2, 3, 4, 5].cumulativeFold!((a, b) => a + b).array == [1, 3, 6, 10, 15]);
    assert([1, 2, 3].cumulativeFold!((a, b) => a + b)(100).array == [101, 103, 106]);
    
  6. std.range.padLeft そして が加えられた。std.range.padRight

    std.range.padLeftそして std.range.padRightは以下の関数である。 は、指定された要素を使用して指定された長さに範囲をパディングする関数である。

    import std.range;
    import std.algorithm.comparison;
    
    assert([1, 2, 3, 4, 5].padLeft(0, 7).equal([0, 0, 1, 2, 3, 4, 5]));
    
    assert("Hello World!".padRight('!', 15).equal("Hello World!!!!"));
    
  7. std.regex.regex 複数のパターンを一度にマッチングできるようになった。
    import std.regex;
    // マルチパターン正規表現
    auto multi = regex([`\d+,\d+`,`(a-z]+):(\d+)`]);
    auto m = "abc:43 12,34".matchAll(multi);
    assert(m.front.whichPattern == 2);
    assert(m.front[1] == "abc");
    assert(m.front[2] == "43");
    m.popFront();
    assert(m.front.whichPattern == 1);
    assert(m.front[1] == "12");
    
  8. std.regex.splitter パターンにマッチした パターンのマッチを結果の範囲に保持するようになった。
    import std.regex;
    import std.algorithm.comparison : equal;
    
    auto pattern = regex(`([\.,])`);
    assert("2003.04.05"
        .splitter!(No.keepSeparators)(pattern)
        .equal(["2003", "04", "05"]));
    assert("2003.04.05"
        .splitter!(Yes.keepSeparators)(pattern)
        .equal(["2003", ".", "04", ".", "05"]));
    
  9. findLocalMin が に追加された。std.numeric

    std.numeric.findLocalMin実関数f(x) の実数最小値を括弧付けによって求める。

    import std.numeric, std.math;
    
    auto ret = findLocalMin((double x) => (x-4)^^2, -1e7, 1e7);
    
    assert(ret.x.approxEqual(4.0));
    assert(ret.y.approxEqual(0.0));
    
  10. ptr プロパティとpublicコンストラクタが追加された。 .std.experimental.ndslice.slice.Slice

    ptr プロパティは、 'の下位ポインタや範囲にアクセスできる。 プロパティを使う前に の の内部バイナリ表現を参照すること。 プロパティはSlice std.experimental.ndslice.slice.Slice ptr "@property"で使用される。 プロパティを使用する。 Mirのdeveloper mirrorは LDC(LLVMのDコンパイラ)がDバージョン2.072をサポートし次第、Mirのdeveloper mirrorは削除される。 ndslice

    Slice 、パブリックコンストラクタが追加された。 std.experimental.ndslice 統合 を追加した。

  11. std.experimental.ndslice.slice.Slice.toHash メソッドが追加された。

    import std.experimental.ndslice;
    
    // ハッシュ値は、割り当てられたデータでも生成されたデータでも同じである
    auto a = iotaSlice(3, 7);
    auto b = iotaSlice(3, 7).slice;
    
    assert(a.toHash == b.toHash);
    
  12. slice shape 、 、その他のユーティリティが追加された。 が に追加された。ndarray std.experimental.ndslice.slice

    これらのユーティリティ関数は次のように追加された。 std.experimental.ndslice:

    • std.experimental.ndslice.slice.makeNdarray,
    • std.experimental.ndslice.slice.makeSlice,
    • std.experimental.ndslice.slice.makeUninitializedSlice,
    • std.experimental.ndslice.slice.ndarray,
    • std.experimental.ndslice.slice.shape,
    • std.experimental.ndslice.slice.slice,
    • std.experimental.ndslice.slice.uninitializedSlice.

    例":を使った一般的な2次元配列の転置ndslice

    import std.experimental.ndslice;
    
    auto ar = [[0, 1, 2], [3, 4, 5]];
    
    auto sh = ar.shape;         // [2, 3]型のsize_t[2]は、
    auto sl = slice!int(sh);    // 対応する形状のスライスを確保する
    sl[] = ar;                  // arからの値でslを埋める
    ar = sl.transposed.ndarray; // 共通の2次元配列を確保する
    
    assert(ar == [[0, 3], [1, 4], [2, 5]]);
    
  13. std.experimental.ndslice.slice.as 怠惰なテンソルが追加された。

    import std.experimental.ndslice;
    
    auto matrix = slice!double([2, 2], 0);
    auto stringMatrixView = matrix.as!string;
    assert(stringMatrixView ==
            [["0", "0"],
             ["0", "0"]]);
    
    matrix.diagonal[] = 1;
    assert(stringMatrixView ==
            [["1", "0"],
             ["0", "1"]]);
    
  14. iotaSlice std.experimental.ndslice.selection に遅延テンソルが追加された。

    std.experimental.ndslice.selection.iotaSlice は最速である 。Slice

    import std.experimental.ndslice;
    
    auto sl = iotaSlice([2, 3], 10);
    
    assert(sl.transposed == [[10, 13],
                             [11, 14],
                             [12, 15]]);
    
  15. std.experimental.ndslice.selection.indexSlice 怠惰なテンソルが追加された。

    import std.experimental.ndslice;
    
    auto slice = indexSlice(2, 3);
    
    assert(slice == [[[0, 0], [0, 1], [0, 2]],
                     [[1, 0], [1, 1], [1, 2]]]);
    
  16. std.experimental.ndslice.selection.repeatSlice 怠惰なテンソルが追加された。

    import std.experimental.ndslice;
    
    auto sl = iotaSlice(3).repeatSlice(4);
    assert(sl == [[0, 1, 2],
                  [0, 1, 2],
                  [0, 1, 2],
                  [0, 1, 2]]);
    
    auto m = 4.repeatSlice(2, 3);
    assert(m == [[4, 4, 4],
                 [4, 4, 4]]);
    
  17. std.experimental.ndslice.selection.mapSlice 怠惰なテンソルが追加された。

    import std.experimental.ndslice;
    
    auto s = iotaSlice(2, 3).mapSlice!(a => a * a);
    assert(s == [[ 0,  1,  4],
                 [ 9, 16, 25]]);
    
  18. Math Index Order の部分的なサポートがstd.experimental.ndslice.slice.Slice に追加された。
    import std.experimental.ndslice;
    
    auto sl = iotaSlice(3, 4);
    
    assert(sl[2, 3] == 11); // DとCのインデックス順序
    assert(sl(3, 2) == 11); // MathとFortranのインデックス順序
    
  19. std.algorithm.mutation.swapAt が公開された。

    std.algorithm.mutation.swapAtの要素を入れ替えることができる。 の要素を入れ替えることができる。

  20. std.range.iota.length プロパティは固定である。 をsize_t に固定する。

    std.range.iota'の.length プロパティは常に次のように返されるようになった。 size_t. つまり、32ビットCPUで を使用している場合、長さはsize_t に切り捨てられる。 非リリースモードでは、 への呼び出しで長さが size_t.max iota を超えると例外が発生する。

  21. std.algorithm.searching.{min,max}Element が追加された。

    std.algorithm.searching.minElementそして std.algorithm.searching.maxElement は範囲の最小値と最大値を検索する関数である。 要素を検索する関数である。これらはカスタムアクセサ(map )をサポートしている。

    import std.algorithm.searching;
    import std.range;
    import std.typecons;
    assert([3, 1, 4].minElement == 1);
    assert([4, 7, 5].enumerate.maxElement!`a.value` == tuple(1, 7));
    
  22. std.math.quantize を追加した。

    std.math.quantizeある数値の最も近い倍数に丸める。 特徴

    • 丸め方はrfunc パラメータで指定できる。デフォルトでは デフォルトでは、現在の丸めモードが使用される。 「である。
    • ある基数のN桁目を丸める一般的なケースについては、オーバーロードが含まれている。 桁に丸める場合のオーバーロードが含まれている。
    • コンパイル時に基数と指数(桁数)がわかっていれば、テンプレート・パラメータとして与えることができる。 をテンプレート・パラメータとして与えることができる。
    import std.math;
    
    assert(12345.6789L.quantize(20.0L) == 12340.0L);
    assert(12345.6789L.quantize!(10, -2) == 12345.68L);
    assert(12345.6789L.quantize!(10, floor)(-2) == 12345.67L);
    
  23. std.traits に3つの新しいトレイトが追加された。

    std.traits.isType, std.traits.isFunctionおよび std.traits.isFinalstd.traits に追加された。

    import std.traits;
    
    static assert(isType!int);
    
    struct S {}
    class C {}
    interface I {}
    
    static assert(isType!S);
    static assert(isType!C);
    static assert(isType!I);
    
    import std.traits;
    
    void func(){}
    struct S
    {
        @property int prop(){ return 0; }
    }
    
    static assert(isFunction!func);
    static assert(isFunction!(S.prop));
    
    // デリゲート型であり、関数型ではない
    static assert(!isFunction!(typeof(&S.prop)));
    
    import std.traits;
    
    class C
    {
        void nf() {}
        final void ff() {}
    }
    final class FC {}
    
    static assert(!isFinal!(C));
    static assert( isFinal!(FC));
    static assert(!isFinal!(C.nf));
    static assert( isFinal!(C.ff));
    
  24. std.range.generate を適切な範囲に固定した。

    std.range.generateが呼び出されるたびに異なる値を返すように設定されていた。 front さらに、popFront は何もしなかった。これはつまり のような操作関数は何もしなかった。 std.range.dropなどの操作関数は何もしなかった。新しい 新しいバージョンでは、範囲定義の期待に応えるため、1要素のキャッシュを使用している。 定義の期待に応えるために1要素のキャッシュを使用する。また、ジェネレーターのref-nessも維持している。

  25. Final が に追加された。std.experimental.typecons

    std.experimental.typecons.Finalは直接変異させることはできない。 しかし、参照は元の変異可能性で型付けされる。 これは Javaのfinal 、C#のreadonly に相当する。

    auto a = makeFinal([1, 2, 3]);
    assert(a[0] == 1);
    
    // a = [2, 3]; // 再代入は不正である、
    a[0] = 42; // 要素やフィールドは依然として変更可能である。
    
    assert(a[0] == 42);
    
  26. std.traits.isInnerClass が追加された。 が追加された。outer

    他のクラスの内部に入れ子になっている(関数の内部にはない)クラスは、 シンボルを定義していない。 outer シンボルを定義していないクラスは、outer フィールドを持つ。 フィールドがあり、入れ子になっている外側のクラスのインスタンスを取得したり、設定したりすることができる。 std.traits.isInnerClassこれにより、それらを識別することができる。を満たす "型"のサブセットである。 isInnerClass を満たす型は、isNested を満たす型のサブセットである。 を満たす型のサブセットである。後者には、outer を再定義したり、関数の中に入れ子になったクラスや構造体が含まれる。

    class Outer
    {
        class Inner1 { }
        class Inner2
        {
            int outer; // outerを再定義しているため、Outerインスタンスにはアクセスできない
        }
        static class Inner3 {}  // 静的なので入れ子にならない
    }
    static assert(isInnerClass!(Outer.Inner1));
    static assert(!isInnerClass!(Outer.Inner2));
    static assert(!isInnerClass!(Outer.Inner3));
    
  27. std.conv.emplace を他のクラスの中に直接入れ込むことができなくなった。 を指定することなく、他のクラスの中に直接ネストされたクラスを配置することができるようになった。 ポインタouter

    クラスが他のクラスの中に入れ子になっている場合(新しいトレイトがある std.traits.isInnerClassがある)、emplace 。 が必須パラメータとして追加された。この この変更以前は、配置にこのパラメータは必要なく、外側のクラスの変数にアクセスするとセグメンテーション・フォールトが発生した。 の変数にアクセスすると、セグメンテーション・フォールトが発生した。

    class Outer
    {
        int x;
        class Inner
        {
            auto getX() { return x; }
        }
    }
    Outer outer = new Outer();
    
    // auto inner = buf.emplace!(Outer.Inner)();   // これはもう許されない
    auto inner = buf.emplace!(Outer.Inner)(outer); // 代わりにこれを使う
    
    auto x = inner.getX();  // これはsegmentation faultを引き起こしていた;
                            // 現在は期待通りに動作する
    
  28. GCの実装を選択するためのランタイムスイッチが追加された。 が追加された。

    これにより、プログラム起動時にGCを選択できるようになった。

    ./my_d_exe --DRT-gcopt=gc:conservative # use conservative GC (default)
    ./my_d_exe --DRT-gcopt=help # list available GC options
    

    gcoptの詳細についてはgc_configを参照のこと。

    将来のリリースでは、別のGCとリンクすることで を拡張できるはずである。

  29. 手動GCが追加された。

    --DRT-gc=gc:manual オプションを使用して手動 GC を選択する。

    このGCはmallocとfreeの薄いラッパーであり、ガベージを収集しない。 ガベージを収集しない。このGCは GC.free. 配列やデリゲートのような、GCメモリを確保する可能性のある組込みの言語構文は、リークする可能性がある。 のような組み込みの言語構造はリークする可能性がある。 これはgcstubの実装に取って代わるものである。

    手動GCは、メモリを決定論的に制御するアプリケーションに有用である。 リークする可能性のある隠れた割り当てを追跡するには、dmdの-vgc スイッチを使う。

    valgrindのようなツールでメモリ破壊を見つけるのにも役に立つ。


D 2.072.0のすべてのバグ修正と機能強化のリスト:

DMDコンパイラのリグレッション

  1. Bugzilla 15726: [REG2.068.0] 循環クラス、RefCountedの前方参照エラー
  2. Bugzilla 15861: [REG 2.069] -Oによる間違ったダブルから文字列への変換
  3. Bugzilla 15925: -transition=[check]imports がミックスインテンプレートからのインポート宣言を無視する。
  4. Bugzilla 15992: [REG2.072a] インスタンス化された構造体のフィールド変数でのICE
  5. Bugzilla 16080: [REG2.071.0] 内部エラー: backendcgobj.c 3406 when building static library
  6. Bugzilla 16115: [REG2.067] コンマ演算子による誤ったコード
  7. Bugzilla 16233: [REG2.069] 誤ったコードでICEが発生する
  8. Bugzilla 16254: [REG 2.072-devel]大文字と小文字が混在した誤ったスイッチの初期化エラー
  9. Bugzilla 16292: [REG2.069] 偽のエラー: gotoが変数の宣言をスキップする
  10. Bugzilla 16536: DMDマスターがOS X 10.11.6/Xcode 7.3.1でビルドされない。
  11. Bugzilla 16570: [REG 2.072.0-b1] イニシャライザが解釈された列挙型メンバはイニシャライザの型が列挙型ではない

DMDコンパイラのバグ

  1. Bugzilla 1357: Unicode エスケープシーケンスで FFFF と FFFE を使用できない。
  2. Bugzilla 5305: 組込み関数へのポインターを取ることができない。
  3. Bugzilla 10225: XMM.STOUPSで__simd_stoを使用した場合のcore.simdの間違ったコード生成
  4. Bugzilla 10591: エラー:許可されるメインが1つしかないため、競合するメインシンボルの場所が表示されない
  5. Bugzilla 11047: UDA + getAttributesが純度/安全性チェックをバイパスする
  6. Bugzilla 11169: __traits(isAbstractClass)がクラスを抽象クラスとして設定する。
  7. Bugzilla 11585: ICE(cgcod.c)でSIMDと-Oを使用する。
  8. Bugzilla 12357: 未定義の文字列変数が無言で失敗する。コンパイラの警告は出ない。
  9. Bugzilla 12527: safeセクションで@system関数/delegateエイリアスを作れない。
  10. Bugzilla 12537: opEqualsをテンプレート化すると、コンパイラーが無限再帰を引き起こす。
  11. Bugzilla 12558: try/catchはException型を指定することなく暗黙的にエラーをキャッチすることができる。
  12. Bugzilla 12822: デリゲート.ptrの代入は@safeとみなされる。
  13. Bugzilla 12939: nothrowとnot @safe関数のエラーメッセージがより統一された。
  14. Bugzilla 13116: this'へのrefを返せないようにする。
  15. Bugzilla 13147: 裸のextern(C++)メソッドにおけるthisptrの間違ったcodegen
  16. Bugzilla 13536: デリゲートの共用体は@安全性を壊す。
  17. Bugzilla 13537: 共用体は不変性を壊す可能性がある。
  18. Bugzilla 13674: ICE(el.c)でshort8のsimd乗算を行う。
  19. Bugzilla 13698: ICE(e2ir.c)のsimd呼び出しで
  20. Bugzilla 13867: extern(C++)インターフェイスからメソッドをオーバーライドするには、メソッド定義にextern(C++)が必要である。
  21. Bugzilla 13975: ICE: -gcと列挙型メンバがimmutable intの場合にdmdがクラッシュする。
  22. Bugzilla 14162: ラムダに対する@safeの推論の誤り
  23. Bugzilla 14450: テンプレート構造体の不変のコンストラクタのオーバーロードが正しくない。
  24. Bugzilla 14496: インダイレクトを含むメンバの void 初期化は @safe であってはならない。
  25. Bugzilla 14504: Regex Optimizerが同等のスレッドをマージしない。
  26. Bugzilla 14532: スイッチ・ブロックは未初期化の変数を作成できる。
  27. Bugzilla 15116: 名前付き "ミックスイン"によるタプルフィールドアクセスの不合理な拒否。
  28. Bugzilla 15117: 名前付きミックスインによる不合理な循環参照エラー : : 名前付きミックスインによる不合理な循環参照エラー
  29. Bugzilla 15144: asm{movdqa...}のオペランドサイズが不正である。} の不正なオペランド・サイズにより、ubyte16イニシャライザ・エラーが発生する。
  30. Bugzilla 15191: DIP25: リターンのアドレスが正しく型チェックされていない。
  31. Bugzilla 15192: DIP25: 入れ子になった ref リターンの型チェックが不正である。
  32. Bugzilla 15193: DIP25 (実装):DIP25 (実装): テンポラリーの寿命が正しく追跡されない。
  33. Bugzilla 15258: DIP25 (実装): 一時的な要素の寿命が正しく追跡されない。
  34. Bugzilla 15306: コンテキストを共有するデリゲートは共有されないエイリアシングを持つことができる。
  35. Bugzilla 15326: ダングリングelse警告の誤検出
  36. Bugzilla 15333: Assertion failed: (!fd->vthis->csym), function FuncDeclaration_toObjFile, file glue.c, line 1034.
  37. Bugzilla 15372: DMDはextern(C++)自由関数のテンプレート化された関数に対して間違ったマングリングをする。
  38. Bugzilla 15399: 整列されていないポインタは@safeではない
  39. Bugzilla 15513: スレッドローカルオブジェクトのメモリ破壊
  40. Bugzilla 15573: -O -inlineはidiv命令で間違ったコードを引き起こす
  41. Bugzilla 15607: [ICE] CTFE内部エラー:デフォルトで初期化された配列の静的不変配列へのアクセス時の不正な比較
  42. Bugzilla 15672: void[]からT[]へのキャストが誤って「@safe」とみなされる
  43. Bugzilla 15680: typeof(null) の TypeInfo が壊れている。
  44. Bugzilla 15703: safeコードは特定の型の配列キャストを許可すべきではない。
  45. Bugzilla 15704: safeコードはvoid[]との間のコピーを許可すべきではない。
  46. Bugzilla 15757: D mainはネストされた関数であり、アクセスできない。
  47. Bugzilla 15760: __gsharedとselective importを使用した場合、コンパイル時にSegfaultが発生する : : __gsharedとselective importを使用した場合、コンパイル時にSegfaultが発生する : __gsharedとselective importを使用した場合、コンパイル時にSegfaultが発生する。
  48. Bugzilla 15762: const列挙型を含む配列キャストを@safeにすることができる。
  49. Bugzilla 15799: インターフェイスのセミコロンに続く契約に対する誤解を招くエラーメッセージ
  50. Bugzilla 15802: (SIGSEGV)CppMangleVisitor::ソース名
  51. Bugzilla 15816: ICE void ddmd.dclass.__assert(int) with error: 匿名クラスは許可されない
  52. Bugzilla 15835: 遅延引数からの typeid 呼び出しでセグメンテーションエラーが発生した。
  53. Bugzilla 15855: a[{for "でdmdがセグメンテーションフォールトを起こす
  54. Bugzilla 15913: 似たようなconst-codeがないと固定サイズの配列を初期化できない
  55. Bugzilla 15922: functionParameters()でDMDのセグメンテーションエラーが発生した。
  56. Bugzilla 15934: 非仮想スーパークラスのメンバ関数呼び出しが"this"型修飾子を無視する。
  57. Bugzilla 15957: postblit + テンプレートミックスインのブレークopAssignがエラーメッセージで混乱する。
  58. Bugzilla 15974: Spurious error: "ミックスイン"への引数は文字列でなければならず、文字列型の(expression())ではない
  59. Bugzilla 15999: インライン・アセンブラでエラーの代わりに拡張子が不正確であった。
  60. Bugzilla 16035: inout、テンプレート、再帰でコンパイラがクラッシュする
  61. Bugzilla 16094: エラー:重複スライス代入(CTFE)
  62. Bugzilla 16095: デリゲートが不変のデータを変更し、共有/非共有を破る可能性がある。
  63. Bugzilla 16096: 静的ライブラリへのリンク: __DATA/__objc_imageinfo を解析できない。
  64. Bugzilla 16142: dtor/postblitを追加すると(無効でも)opAssignが強制される。
  65. Bugzilla 16193: opApply()がクロージャをヒープ確保しない。
  66. Bugzilla 16195: deleteは@systemであるべきである。
  67. Bugzilla 16226: -dip25は戻り値の型が明示的でないと機能しない。
  68. Bugzilla 16228: DIP25の間違った適用に対する診断が不十分である。
  69. Bugzilla 16229: [Win64] 巨大なシンボルを生成するとクラッシュする
  70. Bugzilla 16340: version(unittest)の結果、elseがダングリングしているという不正な警告が出る場合
  71. Bugzilla 16365: デリゲートから関数ポインタを呼び出すことができない。
  72. Bugzilla 16439: タイプセーフでない可変引数関数は決して@safeになり得ない。
  73. Bugzilla 16466: 32ビットOSXでの構造体内部の実数のアラインメントは8ではなく16であるべきだ。
  74. Bugzilla 16525: C++のメンバ変数にはマングリングがない
  75. Bugzilla 16530: -O -covの相互作用は間違ったコード生成につながる
  76. Bugzilla 16534: RefRangeがlengthを定義するのであれば、opDollarを定義すべきである。

DMDコンパイラの機能強化

  1. Bugzilla 2659: カンマ演算子を削除する
  2. Bugzilla 3657: デバッグ情報のローカル変数の()()スコープをなくした。
  3. Bugzilla 3827: 隣接する文字列リテラルの暗黙の連結を警告し、非推奨とする。
  4. Bugzilla 9766: align(n)をコンパイル時定数nで指定する。
  5. Bugzilla 11886: lambdaのlambdaで "cannot access frame "エラーが発生する。
  6. Bugzilla 13242: インポートされたエイリアスは遅延的に解析されるべきである。
  7. Bugzilla 14411: switch文: docs/behaviorが異なる。
  8. Bugzilla 15323: Module.membersと.deferred3は高速なルックアップが可能なデータ構造を使用すべきである。
  9. Bugzilla 16077: [CodeView] MS-COFFのデバッグ情報に言語情報がない。
  10. Bugzilla 16394: 静的配列のTypeInfo.init()は配列全体ではなく単一の要素を返す
  11. Bugzilla 16409: assign-styleスイッチのサポートを追加

phobosのリグレッション

  1. Bugzilla 15457: シンボル未定義 __lseeki64
  2. Bugzilla 15918: [2.070] findSplitの結果を互いに代入できなくなった。
  3. Bugzilla 16179: [REG2.072] git HEAD: multiSortがコンテキスト付きのデリゲートで呼び出せなくなった。
  4. Bugzilla 16291: phobosinitが呼び出されない(EncodingScheme.createが失敗する)
  5. Bugzilla 16544: File.reopenを追加した。
  6. Bugzilla 16580: [REG 2.072.0-b1] macOSでspawnShellがセグメンテーションエラーになる。
  7. Bugzilla 16587: split("", "x") は [] であるべきである。

phobosのバグ

  1. Bugzilla 4509: std.xmlのXMLパーサーがattr値をアポストロフィで囲むとTagExceptionをスローする。
  2. Bugzilla 7972: std.file.readが上限を指定してもファイルのサイズ分のバッファを確保する
  3. Bugzilla 7989: isInputRangeとisForwardRangeは未使用の変数を宣言している。
  4. Bugzilla 11791: std.file.writeが巨大ファイルの書き込みに失敗する
  5. Bugzilla 12368: std.file.writeがstd.stdio.writeと衝突する。
  6. Bugzilla 12897: std.json.toJSONがunicode文字(>=0x80)を" \XXXXXX" に変換しない。
  7. Bugzilla 13572: etc.c.zlibはnothrowでなければならない。
  8. Bugzilla 14136: std.uni.utfMatcherは@safetyを壊す
  9. Bugzilla 14137: std.socket.getAddressInfoが@safetyを破る。
  10. Bugzilla 14485: .front of empty filtertered zip range はアクセス可能である。
  11. Bugzilla 14615: std.regex.replaceFirstIntoはマッチしないと例外を投げる
  12. Bugzilla 14966: 2つのstd.xml.Documentを比較すると無限再帰になる
  13. Bugzilla 15341: std.signalsスロットでsegfaultが発生する
  14. Bugzilla 15658: isFileはテンプレートではない
  15. Bugzilla 15773: D言語の自由形式正規表現における文字クラスの空白の扱いはPerlと同じではない
  16. Bugzilla 15791: 格納されたネストされた構造体オブジェクトをVariantから取得できない。
  17. Bugzilla 15823: opIndexはconst std.variant.Variantでは動作しない
  18. Bugzilla 15827: std.variant.Variantを構造体で初期化できない。
  19. Bugzilla 15864: std.regexでchmgenが例外をトリガーする
  20. Bugzilla 15865: std.file.copy(from,to)はfromとtoが同じファイルを指定するとファイルを削除する
  21. Bugzilla 15872: [ndslice] スライスのインデックスを配列で指定すると、ndslice内部でエラーが発生する。
  22. Bugzilla 15874: structがUDAを持たない場合、getSymbolsByUDAは失敗する
  23. Bugzilla 15884: std.json.JSONValueにchar[]を代入すると、文字列ではなく配列が作成される。
  24. Bugzilla 15885: JSONに直列化されたfloatは精度を失う
  25. Bugzilla 15917: std.concurrencyモジュールのデストラクタでMessageBoxが無駄に生成される
  26. Bugzilla 15919: [ndslice] selection.reshape()でスペルミスが検出されない。
  27. Bugzilla 15920: std.trait.MemberFunctionsTupleが間違った結果を出す
  28. Bugzilla 15960: SetUnionは重複をフィルターすべきである
  29. Bugzilla 15963: std.uniに隠された未解決の前方参照の問題
  30. Bugzilla 15964: std.uni.sicmpのテンプレート制約が寛容すぎる。
  31. Bugzilla 15973: nextPow2とtruncPow2がプロセッサ固有の動作に依存している
  32. Bugzilla 15980: std.trait.Identityは文書化されていないが公開されている
  33. Bugzilla 16010: [ndslice] byElement はアサートエラーを投げる。
  34. Bugzilla 16026: std.math.frexp!float()は非常に小さいサブノーマル値に対して間違っている
  35. Bugzilla 16036: std.net.isemail - isEmailはEmailStatusCode.none(デフォルト)のメールに対して "valid: false"を返す。
  36. Bugzilla 16046: ScopedAllocatorがprevを設定しないため、segfaultが発生する。
  37. Bugzilla 16054: std.typecons.Rebindableでimmutableを壊すことができる
  38. Bugzilla 16070: std.meta.{ApplyLeft,ApplyRight}は型と値が混在した引数で失敗する。
  39. Bugzilla 16072: std.container.binaryheapは配列用に拡張可能であるべきだ。
  40. Bugzilla 16090: popFrontは破損したutf-8文字列に対して境界外の配列インデックスを生成する
  41. Bugzilla 16192: std.conv.toChars()のopSliceが10以外の基数に対して間違っている。
  42. Bugzilla 16219: std.experimental.allocator.makeArrayが長さのある範囲に対して不要な割り当てを行う
  43. Bugzilla 16238: std.string.lastIndexOfが-de付きでコンパイルに失敗する
  44. Bugzilla 16241: std.xmlが誤ってコメント中の"=="を禁止しているが、"--"は許可している。
  45. Bugzilla 16331: std.container.arrayコンストラクタは配置の結果をチェックすべきではない。
  46. Bugzilla 16351: std.container.arrayコンストラクタがemplacementの結果をチェックしない。
  47. Bugzilla 16372: ドキュメントのリンク切れ
  48. Bugzilla 16383: 代数的訪問がハンドラと const クラスを一致させない
  49. Bugzilla 16385: std.range: string.popFrontで0xffをスキップする際の動作が未定義である。
  50. Bugzilla 16386: std.concurrency:デストラクタがMessageとして渡されたオブジェクトに対して2回呼び出される。
  51. Bugzilla 16387: getSymbolsByUDAは構造体では動作するが、クラスでは失敗する。
  52. Bugzilla 16413: multiSortは@system比較関数では動作しない。
  53. Bugzilla 16420: std.getoptドキュメントの例が正しくない。
  54. Bugzilla 16501: packed ndslicesがコンパイルされない
  55. Bugzilla 16503: [ndslice]はfastmathのLDC属性を妨げる。
  56. Bugzilla 16506: std.experimental.allocatorでsegfaultsが発生する:GCAllocatorまたはMallocatorでFreeTreeを使用する
  57. Bugzilla 16507: std.experimental.allocator:FreeTreeはあまりにも熱心にクリアする

phobosの機能強化

  1. Bugzilla 2104: std.regex: 正規表現のエスケープ関数
  2. Bugzilla 7551: 文字クラスの右括弧の正規表現解析のバグを修正。
  3. Bugzilla 10777: std.range.SortedRangeを返すようにstd.algorithm.multiSortを変更した。
  4. Bugzilla 11229: std.string.toLowerが遅い。
  5. Bugzilla 12227: std.regexで複数のパターンを一度にマッチできるようにした。
  6. Bugzilla 12367: std.regex:(?# ... ) のコメント構文を認識する
  7. Bugzilla 12379: 最初の引数をファイルに書き出す "toFile"関数を追加した。
  8. Bugzilla 13409: std.range.padLeft/Rightが追加された。
  9. Bugzilla 13422: std.asciiにはisAlphaNumがあるが、std.uniにはない。
  10. Bugzilla 13796: phobos用のシンプルな "array head const"構造体
  11. Bugzilla 15229: BigInt(文字の範囲)もある。
  12. Bugzilla 15797: std.regex.splitterにマッチを落とさないオプションを追加した
  13. Bugzilla 15800: std.conv.to!intはどのような文字型の範囲でも動作しない
  14. Bugzilla 15803: std.fileはPOSIXで秒以下のファイル時間精度をサポートすべきである。
  15. Bugzilla 15860: lockstepはforeach_reverseをサポートすべきである。
  16. Bugzilla 15991: std.datetime.StopWatchは"@nogc"ではない
  17. Bugzilla 15995: std.conv.textとその仲間はstd.array.appenderで高速化できる。
  18. Bugzilla 16308: [ndslice]は常にプリミティブを保存する必要がある。
  19. Bugzilla 16311: スライスのtoHashが定義されていない
  20. Bugzilla 16315: [] ?=演算はパックされたスライス[ndslice]では動作しない。
  21. Bugzilla 16319: std.experimental.allocator.makeがネストしたクラスで微妙に間違っている
  22. Bugzilla 16363: frontTransversalを使ってランダムアクセス範囲を構築できない
  23. Bugzilla 16364: getUDAとhasUDAは一貫した結果を返さない。
  24. Bugzilla 16443: std.getopt: 空文字列オプションでセグメンテーションフォールトが発生する

Druntimeのリグレッション

  1. Bugzilla 1180: GCが大きな割り当て要求をうまく処理できない。
  2. Bugzilla 16211: [REG 2.058] 周期的依存関係がまた壊れた

Druntimeのバグ

  1. Bugzilla 6333: capacity "関数は純粋/nothrow/@safeではない。
  2. Bugzilla 14601: pthread関数が@nogcとマークされていない。
  3. Bugzilla 15111: 動的配列へのエイリアスを持つ構造体ではhashOfに失敗する。
  4. Bugzilla 15838: 多くのWin32 APIコールバック関数がextern(Windows)を見逃す。
  5. Bugzilla 15958: core.sys.windows関数のextern(Windows)が見つからない。
  6. Bugzilla 15959: core.sys.windowsモジュールはx64用に修正されるべきである。
  7. Bugzilla 15976: コア.sys.windowsモジュールはx64用に修正されるべきである。
  8. Bugzilla 15987: core.sys.windows.msacmは疑似定義のままである。
  9. Bugzilla 15997: winhttp の ERROR_WINHTTP_CLIENT_AUTH_CERT_NEEDED の定数値が正しくない。
  10. Bugzilla 16007: いくつかの Win32 API 構造体の定義が間違っている
  11. Bugzilla 16049: core.sys.windows構造体のサイズと整列が正しくない。
  12. Bugzilla 16594: 以前に例外がスローされた場合、モジュールのデストラクタが再度呼び出される

Druntimeの機能強化

  1. Bugzilla 14117: core.atomicは"@safe"であるべきだ。

dlang.orgのバグ

  1. Bugzilla 15442: 同名テンプレートの制限はドキュメント化されるべきである
  2. Bugzilla 16004: 保護属性の変更を文書化する
  3. Bugzilla 16016: std.concurrencybaseをドキュメントから削除する。
  4. Bugzilla 16040: Dconfアナウンスを削除する。
  5. Bugzilla 16114: [ddox] "Improve this page" リンクが package.d モジュールで壊れている
  6. Bugzilla 16167: chm-nav.json の生成が壊れている
  7. Bugzilla 16186: [C プログラマのための D プログラミング] 生文字列構文の説明ではバックティックをエスケープすべきである。
  8. Bugzilla 16231: 言語仕様: std.regexp -> std.regex のリネーム

dlang.orgの機能強化

  1. Bugzilla 16141: 組織ページに到達できない
  2. Bugzilla 16152: dpl-docs/ddox が同名のテンプレートメンバーのドキュメントを表示しない。
  3. Bugzilla 16464: opCast のドキュメントが不十分

インストーラーのバグ

  1. Bugzilla 16349: install.sh スクリプトの curl リトライを改善した。
前バージョン: - 次のバージョン: