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

変更ログ 2.106.0

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

Download D 2.106.0
2023年12月01日リリース

2.106.0には17の大きな変更と65のBugzillaの問題の修正が含まれている。 多大なる感謝を 33人の貢献者 に感謝する。

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

コンパイラの変更

  1. Catch句は、const または変更可能な例外のみを受け取らなければならない。

    2.104では、修飾子を投げることは廃止された。 非推奨となった。

    また、例外をimmutableinoutshared としてキャッチすることも安全ではない。 これは、例外がまだ別の これは、例外がまだ別の共有でない参照を通してアクセス可能かもしれないからである。これらの修飾子で例外をキャッチする で例外をキャッチすることは非推奨となった。

    auto e = new Exception("first");
    try {
            throw e;
    } catch(immutable Exception ie) { // now an error
            e.msg = "second";
            assert(ie.msg == "first"); // would fail
    }
    
  2. C++ヘッダー生成の改善

    以下の機能/バグ修正/改善が に実装された:

    • デフォルトの引数コンテキストで使用される静的変数は、完全修飾名を使用して出力されるようになった。 を使うようになった。

    注釈: ヘッダー・ジェネレーターはまだ実験的なものである。 バグがあればバグトラッカーに送ってほしい。

  3. enumストレージクラスを持つ関数は非推奨となった。

    このエラーは2.105.0で導入された。

  4. nothrowスイッチをコンパイラーに追加する

    dmd自身は(そしておそらく他のものも)例外をスローしない。 を優先する。しかし、例外がスローされない場合でも例外をサポートするにはコストがかかる。 をサポートすることにはコストがかかる。そのコストとは、RAIIオブジェクトのようなスタック・アンワインダーを追加することである。 オブジェクトのようなものに対してスタック・アンワインダーを追加し、try-catchの境界をまたぐ多くの最適化を妨げることである。

    プロジェクト内のすべてのコードにnothrow 。 になる。モジュールの先頭にnothrow: 。 クラスや構造体のメンバ関数のステータスに影響しない。nothrow: をクラスや構造体ごとに繰り返す必要がある。

    コンパイラーに-nothrowスイッチを追加すると、スタック・アンワインダーが追加されなくなり、最適化が有効になる。 最適化が有効になる。この機能は-BetterCコードにはすでにある、 この機能は-betterCのコードにはすでにある。

    このスイッチはセマンティック解析には影響せず、コード生成だけに影響する。名前のマングリング は影響を受けない。

    このスイッチは、例外処理が実行ファイルのサイズやパフォーマンスにどのような影響を与えるかを判断するのに便利である。 サイズとパフォーマンスにどのような影響を与えるかを判断するのに便利である。

  5. インテル® CET (Control-flow Enforcement Technology) IBT (Indirect Branch Tracking) プロテクションのサポートを追加した。

    CETは、攻撃者がプログラムの制御フローをリダイレクトするのを防ぐのに有効な技術である、 特にIBTは、攻撃者が間接分岐を意図しない場所に行かせることを防ぐ。

    インテルIBTは、コンパイラが特別な命令(endbr32endbr64)を出すことを期待する。 IBTをサポートしていない古いプロセッサーでは、nop 命令と等価である。 でコンパイルされたプログラムは、どのx86プロセッサーでも互換性があり、保護機能はサポートされているプロセッサーで日和見的に有効になる。

    DMDでインテルIBTプロテクションを有効にするには、-fIBT フラグをコンパイラに渡す必要がある。 その結果、コンパイラーは自分でIBTのための命令の放出を管理することになる。 インライン・アセンブリを使用する場合は注意が必要で、コンパイラーはインライン・アセンブリ内のIBTを自動的に処理しない。

    Dプログラム内でIBTが有効になっているかどうかを調べるには、次のようにgetTargetInfoを使用する:

    // IBTはアクティブ
    static assert(__traits(getTargetInfo, "CET") == 1);  // IBTがアクティブならCET == 1
    
    // IBTはアクティブでない
    static assert(__traits(getTargetInfo, "CET") == 0);  // IBTがアクティブでないならCET == 0
    
  6. scope 、非スコープコンストラクタでクラスインスタンスを作成することは、DIP1000でのみ@system

    問題23145の修正は既存のコードを壊したので、他のscope 関連のエラーと同様に、現在は-preview=DIP1000 の後ろに置かれている。

  7. グローバル変数const は、共有でない静的コンストラクタから初期化できなくなった。

    immutable データと同様に、グローバルconst データはスレッド・ローカル・ストレージ(TLS)に置かれないため、スレッド・ローカルの静的コンストラクタで初期化するとconst に違反することになる: 詳細はissue 24056を参照のこと。 これを行うと、非推奨になる:

    int x;
    const int y;
    immutable int z;
    
    static this()
    {
        x = 1;
        y = 2; // 非推奨: const変数を変更できない
        z = 3; // エラー: 不変変数を変更できない(以前と同じ)
    }
    

    是正措置として、初期化を共有の静的コンストラクタに移す:

    const int y;
    
    shared static this()
    {
        y = 4; // OK
    }
    
  8. グローバル変数が連想配列で初期化できるようになった

    これまでは、連想配列を使ってグローバル変数を初期化するには、モジュールのコンストラクタかenum 。 内部的にSteven Schveighofferのnewaa構造体の実装を下げることで、連想配列が直接使えるようになった。

    immutable string[string] table = ["key": "value"];
    
    void main()
    {
        assert(table["key"] == "value");
    }
    

    キー/値型にtoHashopEquals~this が定義されている場合、それらはコンパイル時に呼び出し可能でなければならない。 if (!__ctfe) 。デストラクタを実行時にのみ実行させるために、 分岐を使用することができる。 将来の機能拡張によって、この回避策が不要になるかもしれない。

  9. _d_newarray{U,T,iT} はテンプレートに変換される

    テンプレート_d_newarrayT は、配列の要素の型によってどのようなタイプの初期化子が必要かをチェックするために DBI を使用するようになった。 したがって、これは_d_newarrayT_d_newarrayiT の両方を置き換える。

    _d_newarrayU は上記の両方のフックの汎用実装であり、単に配列を確保するだけである。 で使用されているため、 には組み込まれていない。 現在、 はまだ非テンプレートの を使用している。 将来のPRでは、新しいテンプレートを使用するように を更新する予定である。 dup _d_newarrayT dup _d_newarrayU dup

    これで、コンパイラーは以下のように下げる:

    S[] s = new S[10]
    
    // is now lowered to:
    S[] s = _d_newarrayT!S(10);
    

    この変更により、core.internal.array.construction に新しいテンプレートが追加された。 さらに、core.internal.array.utils のテンプレート__arrayClearPad__arrayAlloc__arrayStart__setArrayAllocLength を実装する。 __arrayClearPad__arrayStartrt.lifetime から削除された。 その他のテンプレートは、TypeInfo の引数を受け取り、rt.lifetime の他のフックによって呼び出されるため、まだ削除できない。

ランタイムの変更

  1. 4core.memory.GC 関数がマークされた。@safe

    • GC.enable
    • GC.disable
    • GC.collect
    • GC.minimize

ライブラリの変更

  1. etc.c.odbcの非推奨化を元に戻し、非Windowsシステムでの使用を可能にした。

    以前は、etc.c.odbcバインディングは非推奨で、public import経由でcore.sys.windowsバージョンのバインディングを転送していた。しかし、ODBCはすべての主要なプラットフォームでサポートされており、core.sys.windowsの機械翻訳されたMinGWバインディングにはversion(Windows)が指定されているため、Windows以外のプラットフォームではこれらのバインディングを使用することができない。このバインディングはetc.c.odbcに戻され、非推奨になり、Windows以外のプラットフォームのサポートが有効になった。

  2. isInputRangeがオプションの要素型を取るようになった。

    isInputRangeにオプションの2番目のテンプレート・パラメータが追加された。 に設定される。voidでない場合、範囲の要素型がこの追加引数constと同じ型である場合にのみtrueと評価される。 型がこの追加引数と同じである場合にのみ真と評価される。例えば 例えば、isInputRange!(int[], const(int)) は真だが isInputRange!(int[], string) は偽である。

  3. std.traitにUnsharedを追加する。

    Unshared は、 に相当する。 の外側のレイヤーを取り除く。 shared Unconst shared

        static assert(Unshared!(shared int) == int);
        static assert(Unshared!(shared(int[])) == shared(int)[]);
    

    つまり、Unconst は、constimmutableinout の外層を剥ぎ取る; Unshared shared Unqual の外側のレイヤーを取り除く。 型修飾子 "を取り除く。

dubの変更

  1. dub build--deep= スイッチを追加

    このフラグを指定することで、すべての依存関係をビルドできるようになった。 をビルドできるようになった。デフォルトでは のルートディレクトリにあるライブラリのみをビルドする。 ファイルのルートディレクトリにあるライブラリのみをビルドする。これにより、ライブラリのビルドを必要とする他のビルドシステム との統合をより良くする。

    dub build --deep
    

    staticLibraryAがstaticLibraryBに依存している場合、--deep フラグが指定されている場合、dubはAとBの両方のライブラリを出力する。

  2. dub describe にdefault-config,configs,default-build,builds のデータを追加した。

    • default-config は単一の文字列で、 のような単純な呼び出しで何もコンフィギュレーションが提供されない場合に DUB が選ぶ のコンフィギュレーションとなる。dub build --config
    • configs は利用可能なすべてのコンフィギュレーション(デフォルトで生成されたアプリケーションやライブラリ、またはレシピで手動で指定されたもの)のリストである。
    • default-build は、何も提供されなかったときにDUBが選ぶ ビルド型を表す単一の文字列である(現在は常に "debug")。--build
    • builds は利用可能なすべてのビルド型のリストである(ビルトイン+カスタム定義)。

  3. Dub initにパッケージフォーマットとライセンスの選択メニューが追加された。

    dub init を使ってパッケージを作成する際に、パッケージのライセンスを選択するプロンプトが表示されるようになった。

  4. DUBに--recipe= スイッチを追加

    デフォルトの dub.sdldub.json 。つまり、複数のdub.jsonファイルを定義することができる。 を定義することができる。 CLI上で使用するものを選択できる。

    dub build --recipe=custom-dub.json
    

    これは、dub.jsonよりもdub.sdlを選ぶ場合にも使える。 を選ぶために使うこともできる。しかし、これは他の DUBをサポートする他のツールとの相互運用性や、ユーザーの一般的な混乱を避けるために推奨されない。両方が同時に存在する 同時に存在する場合も、将来このスイッチが指定されないとエラーになる可能性がある。


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

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

  1. Bugzilla 20655: [REG: 2.072] 属性推論が安全でない共用体へのアクセスを"@safe"として受け付けるようになった。
  2. Bugzilla 24066: __traits(isAbstractClass)が不透明なクラスを渡すとセグメンテーションフォールトを引き起こす
  3. Bugzilla 24159: BetterC":動的配列への追加がコンパイル時にエラーにならなくなった。
  4. Bugzilla 24184: [REG 2.103] align(N) > プラットフォーム・スタック・アライメントで変数にアクセスするセグメンテーション・フォールト

DMDコンパイラのバグ修正

  1. Bugzilla 8662: 静的foreachボディ内の重複ラベルのエラーを改善した。
  2. Bugzilla 11455: テンプレート・メソッドをオーバーライドするとコンパイル・エラーが発生するようにした。
  3. Bugzilla 14835: 定数の折りたたみはフロントエンドのフロー解析に影響しない
  4. Bugzilla 18578: EnumBaseType.initの代わりに最初の列挙型値に0が代入された。
  5. Bugzilla 19460: C言語のスタイルのキャストエラーで関数の行番号が正しくない。
  6. Bugzilla 22682: pragma(mangle) がネストされた関数に対して機能しない。
  7. Bugzilla 23103: 連想配列の静的初期化は実装されていない。
  8. Bugzilla 23522: 列挙型がintegralでなく、値にイニシャライザがない場合にエラーメッセージが表示される。
  9. Bugzilla 23733: テンプレート型パラメータをエイリアスパラメータの型として使用できない。
  10. Bugzilla 24036: CTFEのassertメッセージが、std.format.formatを使って生成された場合、['m', 'e', 's', 's', 'a', 'g', 'e'][0..7]
  11. Bugzilla 24051: enum/immut/const宣言の安全属性推論が不変の静的変数宣言と矛盾する。
  12. Bugzilla 24054: 返り関数に期待される返り値表現
  13. Bugzilla 24055: is(x == __parameters)が関数ポインタ/代行型では機能しない
  14. Bugzilla 24056: モジュール・スコープでの未初期化データはTLSに含まれない。
  15. Bugzilla 24065: __traits(getTargetInfo)は値以外を渡すとセグメンテーションフォールトを引き起こす。
  16. Bugzilla 24070: ポインタを取る際に定義が入れ子になっている不透明構造体ではセグメンテーションフォールトが発生する。
  17. Bugzilla 24071: 列挙型(enum)がtypedefされた整数定数の型が正しく決定されない。
  18. Bugzilla 24072: 配列リテラルのキャスト(__vector)が正しくないとGCエラーが発生する
  19. Bugzilla 24105: スコープとしてマークされていないDip1000 C可変長引数はスコープ引数を受け取るべきではない。
  20. Bugzilla 24107: CTFEの再帰制限を超えた場合のエラーは投機的コンパイルをバイパスする。
  21. Bugzilla 24108: importC モジュールを指定すると dmd -H と -X が失敗する。
  22. Bugzilla 24117: noreturnは式として使用できる。
  23. Bugzilla 24121: ImportC: .di ファイル生成時に typedef enum のコンパイルに失敗する。
  24. Bugzilla 24129: ImportC:MS-Linkは同じ名前の複数のCOMDATを扱えない。
  25. Bugzilla 24130: ImportC:Windowsヘッダは異なる構文でインラインasmを使用する。
  26. Bugzilla 24133: n の printf フォーマット・チェックで const ポインタへの書き込みが可能になった。
  27. Bugzilla 24154: ImportC: 無用な式が無効な変数宣言として解析される。
  28. Bugzilla 24156: ImportC: Appleは__signedをキーワードとして使用している。
  29. Bugzilla 24168: ImportC:アップル社が__signedをキーワードとして使っている。
  30. Bugzilla 24174: [CTFE] with文とcatchブロック内のgotoが無限ループを引き起こす
  31. Bugzilla 24181: XMM1ではなくRCXからダブル・パラメータを読み込む
  32. Bugzilla 24187: ImportC: _Float32が定義されていない。
  33. Bugzilla 24193: ビットフィールドを持つ共用体のサイズが正しくない。
  34. Bugzilla 24199: ImportC: 生成された.diファイルが型を参照する際にstructキーワードを使用している。
  35. Bugzilla 24208: [DIP1000] 純粋なネストされた関数の非スコープパラメータを経由してスコープポインタがエスケープできる
  36. Bugzilla 24209: 静的関数変数ICEの初期化 : static aa
  37. Bugzilla 24212: [DIP1000] スコープポインタが純粋仮想関数の非スコープパラメータを経由してエスケープできる
  38. Bugzilla 24213: [DIP1000] スコープポインタが純粋なデリゲートの非スコープパラメータを経由してエスケープできる。
  39. Bugzilla 24257: ImportC: 最後の_Boolビットフィールドへのアクセス時にICEが発生する。
  40. Bugzilla 24262: ビットフィールドのアサートエラー

DMDコンパイラの機能強化

  1. Bugzilla 5445: DMDはHOMEディレクトリの".dmd.conf"を探さない
  2. Bugzilla 10532: 静的foreachでいくつかの到達不能文の警告を消した。
  3. Bugzilla 11070: switch式で宣言文を許可する。
  4. Bugzilla 15752: 診断:不正なAA空値を代入した場合のエラーメッセージを改善した。
  5. Bugzilla 20522: 未定義変数が原因でステートメントに到達できない警告が表示される。
  6. Bugzilla 21520: dmdは環境変数NO_COLORを尊重しない
  7. Bugzilla 21852: 診断:verrors=contextの場合、フォーマットされたLocのワンライナー・エラーはコンテキストを表示すべきである。
  8. Bugzilla 23958: ImportC: 識別子が未定義である。__builtin__sprintf_chk
  9. Bugzilla 24060: "抽象クラスのインスタンスが作成できない "エラーの改善
  10. Bugzilla 24084: コンパイラーに-nothrowスイッチを追加する。
  11. Bugzilla 24173: ImportC: Microsoft iNN整数リテラル接尾辞を追加する。

Phobos リグレッションの修正

  1. Bugzilla 24267: [REG 2.106 beta] GraphemeをAAキーとして使用できない。

Phobosのバグ修正

  1. Bugzilla 24049: std.conv.to: 文字列から列挙型への変換が文書化されていない。
  2. Bugzilla 24207: std.parallelism:AbstractTask のプライベートデータが誤って利用可能になっていた。

phobosの機能強化

  1. Bugzilla 24082: std.formatをサポートするInt128.toStringを追加した。
  2. Bugzilla 24142: Int128を整数型や浮動型にキャストできるようにした。

Druntimeのバグ修正

  1. Bugzilla 24079: core.sys.windows.winnt.IMAGE_FIRST_SECTIONが不正なポインタを返す。
  2. Bugzilla 24123: macOS用にもっと多くのImportC定義が必要である。
  3. Bugzilla 24230: Solaris/x86カーネルゾーンのcore.cpuid.getCpuInfo0Bで無限ループが発生する。

dlang.orgのバグ修正

  1. Bugzilla 3396: コンパイラが実装のないスーパークラスの抽象メソッドの呼び出しを受け付ける

dlang.orgの機能強化

  1. Bugzilla 24012: [spec/cpp_interface] -HC によって生成された _d_dynamicArray がドキュメント化されていない。

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

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

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