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

変更ログ 2.083.0

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

Download D 2.083.0
2018年11月01日リリース

2.083.0には11の大きな変更と47のBugzillaの問題の修正が含まれている。 2.083.0を可能にしてくれた51人の貢献者に心から感謝する。

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

コンパイラの変更

  1. CppRuntime_* バージョン識別子を追加した。

    C++コードとリンクするためには、ABIがどのC++ランタイムをターゲットにしているかを知ることが重要である。

    サポートされているバージョン識別子には以下のものがある:

    • CppRuntime_Clang
    • CppRuntime_DigitalMars
    • CppRuntime_Gcc
    • CppRuntime_Microsoft
    • CppRuntime_Sun

    使用されるC++ランタイムは、一般に、リンクされるC++コードの構築に使用されるC++コンパイラに依存する。 これは、一般的にターゲット・システムに依存するCランタイムとは対照的である。

  2. 非推奨CLIスイッチ-gc は削除された。

    このスイッチはv2.075.0で非推奨となり、現在は削除されている、 つまり、DMDは認識できないスイッチがあると文句を言う。 -gc 以前はC言語のふりをしていたが、デバッガは10年ほど前から デバッガは10年ほど前からDを意識している。

  3. 公開する__traits(isZeroInit, T)

    型でなければならない引数を1つ取る。もし型の 型のデフォルト・イニシャライザーにゼロ以外のビットがない場合、 が返される。 isZeroInit ビットがない場合、true が返され、そうでない場合はfalse が返される。 C C.init は常にtrue を返す。 参照だからである。

    このプロパティはすでにコンパイラによって内部的に計算されていた。 このプロパティはコンパイラによってすでに内部的に計算されていたので、__traits 。 よりも効率的である。

    struct S1
    {
        int x;
    }
    
    struct S2
    {
        int x = -1;
    }
    
    static assert(__traits(isZeroInit, S1));
    static assert(!__traits(isZeroInit, S2));
    
    void test()
    {
        int x = 3;
        static assert(__traits(isZeroInit, typeof(x)));
    }
    
  4. 新しいC++マングリング構文を実装する

    新しい構文では、キーワードをマングリングに使うことができる。 シンボルのマングルを変更するだけである。これは C++の名前空間に似た機能は提供しない。このため、ユーザーは従来のD言語でC++を構成することができる。 C++を伝統的なD言語で構成することができる。従来の構文 extern(C++, foo) はシンボルfoo を占有する。つまり、モジュール はこの名前を使うことができず、C++の名前空間と一致しなかった。

    extern(C++, "__traits") void foo();
    
    extern(C++, "std", "chrono") void bar(); // 複数の名前空間の構文
    
    int std; // 上記のextern(C++, "std", ...)と衝突するシンボルがない
    
  5. pragma(linkerDirective) を追加し、リンカ・ディレクティブをオブジェクト・ファイルに出力する。

    カスタムリンカディレクティブをオブジェクトファイルに出力する:

    pragma(linkerDirective, "/alternatename:_pWeakValue=_pDefaultWeakValue");
    

    これはMS-COFF出力でのみサポートされる。

  6. 問題14246の修正 - RAII - 部分的に構築されたオブジェクトの適切な破棄

    オブジェクト・フィールドのデストラクタが、コンストラクタが失敗した場合にそのオブジェクトのコンストラクタから呼び出されるようになった。 オブジェクト・フィールドのデストラクタは、コンストラクタが失敗した場合にそのオブジェクトのコンストラクタから呼び出されるようになった。 でなければならない。

    つまり、コンストラクタが@safeとマークされていれば、フィールドのデストラクタも@safeでなければならない。 または@trustedでなければならない。

    この動作はこれまでチェックされていなかったため、この修正によって既存の コードを壊してしまう。したがって、この動作を有効にすることが、新しいtransition=dtorfields スイッチの背後にある。この動作はいずれデフォルトの動作になる。 デストラクタ属性の問題を修正することを推奨する。

  7. __traits(getTargetInfo, "key") を追加し、コンパイル・ターゲットの詳細を照会できるようにした。

    getTargetInfo 引数として文字列キーを受け取り、関心のあるターゲットの詳細を選択する。

    static if (__traits(getTargetInfo, "cppRuntimeLibrary") == "msvcrtd") { ... }
    
    static assert (__traits(getTargetInfo, "not_a_target_info") == "??"); // <- エラー: そのようなtargetInfo"not_a_target_info"はない!
    

    getTargetInfo キーは処理系定義であり、エキゾチックなターゲットに関連するデータを可能にする。常に利用可能な信頼できるサブセットを仕様に記載する。

ライブラリーの変更

  1. std.algorithm.iteration.each 早期停止が可能になった

    std.algorithm.iteration.eachが早期終了できるようになった。 を返す関数からNo.each std.typecons.Flagが呼び出された関数から返された場合、反復は早期に中止される。 からeach が返されると、反復は早期に中止される。 同様に、Yes.each を返すと、反復が継続される。 例:

    auto arr = [10, 20, 30];
    arr.each!((n) { arr ~= n; return (n == 20) ? No.each : Yes.each; }); // 2回目の繰り返しで中止
    assert(arr == [10, 20, 30, 10, 20]);
    
  2. toHash 関数が追加された。std.experimental.checkedint.Checked

    カスタム・ハッシュはHook で実装することができる。 組み込み関数が使われる。checkedが連想配列で使えるようになった。 配列で使えるようになった。

    import std.experimental.checkedint;
    
    static struct MyHook
    {
        static size_t hookToHash(T)(T payload)
        {
            auto h = typeid(payload).getHash(&payload);
            return h + 0x9e3779b9 + (h << 6) + (h >> 2);
        }
    }
    
    auto h = checked!MyHook(142).toHash();
    

dubの変更

  1. BetterCビルドオプションが追加された。

    このビルドオプションはDMDやLDCに-betterC 引数を渡すのに使用できる:

    dub.jsonに渡すことができる:

    "buildOptions": ["betterC"]
    

    dub.sdl:

    buildOptions "betterC"
    
  2. 環境変数 DUB_PACKAGE_VERSION が追加された。

    外部コマンドを実行する際、DUBは環境変数DUB_PACKAGE_VERSION を設定するようになった。 この変数には、dub describe の出力に表示される、ビルドされるパッケージのバージョンが格納される。

    この追加機能の1つの応用例として、プリビルド・コマンドを使用してパッケージのバージョンをソース・ファイルに保存する方法がある、 ビルドされるアプリケーションにバージョン文字列をコンパイルするためである。


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

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

  1. Bugzilla 19248: C++のconst STLクラス/構造体に対する誤ったマングル
  2. Bugzilla 19304: [Reg 2.081.0] issue 15574で変更されたリンカ引数の順序が--whole-archiveリンカ指示文の使用を妨げる

DMDコンパイラのバグ

  1. Bugzilla 11538: [ICE] 再帰的なNullableRefでスタックオーバーフローに失敗する
  2. Bugzilla 14246: RAII - 部分的に構築されたオブジェクト/構造体の適切な破棄
  3. Bugzilla 15374: [internal] 何もddmd.marsをインポートすべきではない。
  4. Bugzilla 18457: betterC - 構造体のデストラクタは常に関数のリターン時に呼び出される。
  5. Bugzilla 18771: 異なるモジュールの同一のオーバーロードセットは異なるアイデンティティを持つ
  6. Bugzilla 18955: extern(C++) デフォルトの構造体マングリングはcppmangle = class テンプレートとやりとりするときにオーバーライドされる。
  7. Bugzilla 19098: 代入不可能な構造体のエラーを改善した。
  8. Bugzilla 19181: opDispatch引数のセマンティックエラーで "no property X"となる。
  9. Bugzilla 19182: セミコロンの欠落がコンパイラをクラッシュさせる
  10. Bugzilla 19185: [ICE] 入れ子構造体で外部スコープから変数を使用するとセグメンテーションエラーが発生する。
  11. Bugzilla 19201: エラー: 引数型(ulong)で呼び出された func が"__c_long" と "__c_long" の両方にマッチする:c_long と __c_ulong の両方にマッチする。
  12. Bugzilla 19209: [ICE] ベースクラスのフィールドをオーバーライドするとICEが発生する
  13. Bugzilla 19225: のエラーメッセージが表示されるstatic else
  14. Bugzilla 19251: エイリアスの"this"は構造体修飾子型では呼び出されない。
  15. Bugzilla 19284: メソッドのネストされた関数でalias thisが使用されない。

DMDコンパイラの機能強化

  1. Bugzilla 15512: extern(C++, ns)は文字列を取ることを考慮すべきである。
  2. Bugzilla 19180: dmd.mtype.Type.isZeroInitを__traits(isZeroInit, T)として公開した。
  3. Bugzilla 19194: -mscrtlib 仕様のバージョン
  4. Bugzilla 19195: リンカディレクティブを指定するプラグマをサポートする
  5. Bugzilla 19199: CTFE時にcore.bitops intrinsicsを使用する。
  6. Bugzilla 19203: これをboolにエイリアスすると、"static assert"と矛盾した間違った動作をする。
  7. Bugzilla 19212: C++ランタイムのバージョンを追加した。
  8. Bugzilla 19292: ミックスイン式はpragma(msg)と同じように引数リストを取るべきである。

phobosのバグ

  1. Bugzilla 11431: std.file.slurpがWindowsの改行で失敗する
  2. Bugzilla 11959: phobosはversion(-unittest)ブロックでpublicシンボルを宣言すべきではない。
  3. Bugzilla 17276: BaseClassesTupleが基底クラスなしでインターフェイスを実装するextern C++クラスで失敗する。
  4. Bugzilla 18675: std.experimental.checkedint.CheckedはopEqualsを持つがtoHashを持たない
  5. Bugzilla 18683: std.containers.rbtree.RedBlackTreeはopEqualsを持つがtoHashを持たない
  6. Bugzilla 18838: セパレータでゼロをフォーマットすると幅指定に従わない
  7. Bugzilla 19085: std.experimental.allocator.makeArrayはvoidで動作するはずだ。
  8. Bugzilla 19200: 変数演算子のオーバーロードが正しく行われない。
  9. Bugzilla 19228: 静的配列でhasAliasingが失敗する。
  10. Bugzilla 19240: std.typecons.Tupleは予約識別子をチェックすべきである。
  11. Bugzilla 19275: std.process: 非コンソール・アプリケーションの出力リダイレクトに失敗する
  12. Bugzilla 19289: std.range.transposedでenforceNotJaggedがスローされない。
  13. Bugzilla 19297: 符号付きと符号なしが等しい値のJSONValueは等しくない

phobosの機能強化

  1. Bugzilla 18142: checkedint opOpAssignがcheckedintを受け付けない。
  2. Bugzilla 19236: 実行時のtypeid(T).initializer().ptr is null チェックをコンパイル時に置き換える。__traits(isZeroInit, T)
  3. Bugzilla 19257: std.array.joinがmutableに変換できないconstフィールドを扱わない。

Druntimeのバグ

  1. Bugzilla 19250: DWARF 表示時に非常に長いシンボル名を持つバックトレースが境界外に読み出される
  2. Bugzilla 19262: 連想配列のhashOfはnothrowを推論すべきである。
  3. Bugzilla 19282: C++の非NULLオブジェクトに対するhashOfのsegfaults
  4. Bugzilla 19314: スレッド・オブジェクトの破壊がUBになることがある

Druntimeの強化

  1. Bugzilla 19280: core.time.currSystemTickとcurrTimeの不要なエラーチェックを削除した。

dlang.orgのバグ

  1. Bugzilla 18104: ag娱乐注册 "Examples:"コンパイルが不正になるはずの場所でコンパイルされてしまう。

このリリースへの貢献者 (51)

このリリースを可能にしてくれたすべての素晴らしい人々に多大な感謝を捧げる。

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