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

変更ログ 2.102.0

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

Download D 2.102.0
2023年02月01日リリース

2.102.0には15の大きな変更と75のBugzilla問題の修正が含まれている。 多大なる感謝を 40人の貢献者 2.102.0を可能にしてくれた

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

コンパイラの変更

  1. extern (D) @system 関数定義が衝突するケースは非推奨となった。

    モジュール内に複数の関数定義があると、DMD 2.095.0ではエラーになっていた。 DMD 2.095.0ではエラーになっていた。

    しかし、2つの実装が明示的で推論される 属性によって異なっていても、コンパイラはエラーを出さなかった。 つの実装が同じマングリングであるにもかかわらず、明示的な@system 属性と推論される 属性によって異なる場合、コンパイラーはエラーを出さない。 同じマングリングである。

    void foo() {}
    void foo() @system {} // エラーなし
    

    このバグは修正され、DMDは現在、このような競合する このバグは修正され、DMDはこのような@system 関数の実装が矛盾する場合、非推奨を発行するようになった。DMD 2.112からは モジュール内で競合する他の種類の関数と同じように、多重定義エラーとなる。 関数と同じように多重定義エラーとなる。

  2. オーバーロード・セットで__traits(getAttributes)

    このリリースまで、__traits(getAttributes) は個々の関数とオーバーロード・セットの両方で呼び出すことができた。 を呼び出すことができた。しかし、後者の場合 のユーザー定義属性を収集するだけである。 のユーザー定義属性を収集するだけであった。この動作はエラーを起こしやすい。考えてみよう:

    module test;
    
    @("gigi")
    void fun() {}
    @("mimi")
    void fun(int) {}
    
    void main()
    {
        static foreach(attr; __traits(getAttributes, fun))
            pragma(msg, attr);
    

    上記のコードは "gigi"と表示される。 と表示される。常に最初のものが選ばれる。

    このリリースから、このような__traits(getAttributes) は非推奨である。特定のオーバーロードを処理する必要がある場合、__traits(getOverloads)__traits(getAttributes) と併用することで、適切な動作を実現できる:

    module test;
    
    @("gigi")
    void fun() {}
    @("mimi")
    void fun(int) {}
    
    void main()
    {
        static foreach (t; __traits(getOverloads, test, "fun"))
            static foreach(attr; __traits(getAttributes, t))
                pragma(msg, attr);
    

    上のコードはこう表示される:

    gigi
    mimi
    
  3. 空でないfor 文は非推奨インクリメント句は効果なし

    for 。 の最後の節は、何らかの意味のある副次的効果なしに値を生成してはならない。 を生成してはならない。これは非推奨メッセージで検出されるようになった。以下の 以下のfor :

    // `j`の評価に副作用はない
    int j;
    for (;; j) {...}
    
    // 不要な再参照
    for (ubyte* sp;; *sp++) {...}
    
    // 最初の節はブロック文である
    // 最後の節は関数リテラルであり、ブロック文ではない
    for({j = 2; int d = 3;} j + d < 7; {j++; d++;}) {...}
    

    注釈:void を返す関数を呼び出すことは、その関数が何もしなくても非推奨ではない。 関数を呼び出すことは非推奨である。これは一般的なコードのためである。

  4. scope 配列変数に代入された配列リテラルをスタックに確保できるようになった。

    以前は、常にガベージ・コレクターを使って割り当てられていたため、@nogc-betterC のコードでは利用できなかった。 そのため、以下の回避策が頻繁に使用されていた:

    void main() @nogc
    {
        int[3] buffer = [10, 20, 30];
        int[] arr = buffer[];
    }
    

    これで1行で書けるようになった:

    void main() @nogc
    {
        scope int[] arr = [10, 20, 30];
    }
    

    ただし、以下の制限がある:

    • 変数は、推論されるだけでなく、明示的にscopescope
    • レガシー・コードでメモリ破壊を引き起こさないように、-preview=dip1000 を渡さなければならない。
    @system@trusted コードでは、コンパイラーはscope 変数がエスケープしていないことを検証しない。
    • 配列リテラルは変数を初期化していなければならない。それ以降の配列リテラルの代入は、依然としてGCを使用する。
    • 配列要素はデストラクタを持たない。

    これらの制限のいくつかは、将来解除されるかもしれない。

  5. static assert 複数のメッセージ引数に対応した

    条件がfalseと評価された場合、それ以降の式はすべて文字列に変換され、連結される。 はそれぞれ文字列に変換され、連結される。結果の文字列 がエラー診断とともに出力される。

    enum e = 3;
    static assert(false, "a = ", e);
    

    表示:

    file.d(2): Error: static assert:  a = 3
    

  6. -preview=systemVariables が追加された

    DIP 1035 - システム変数が承認されたため、@system の変数は@safe コードからアクセスできなくなった。 コードの破損を避けるため、コンパイラーは非推奨の警告から始める。 プレビュー・スイッチはこれをエラーに変えるもので、将来のリリースではデフォルトで有効になる予定である。

    @system int* p;
    
    struct S
    {
        @system int i;
    }
    
    void main() @safe
    {
        int x = *p; // `-preview=systemVariables`でエラー、それ以外は非推奨
    
        S s;
        s.i = 0; // 同上
    }
    

    現在のところ、これは明示的に@system とマークされた変数に限定されている。変数のイニシャライザーに基づく@system の推論はまだ実装されていない。

ランタイムの変更

  1. デフォルトのThrowable.TraceInfo 生成は@nogc となった。

    この仕組みは

    1. ひとつはtraceinfoの割り当て、もうひとつはtraceinfoの割り当て解除だ。両方とも同じRuntime.traceHandler 関数を介して設定される。デアロケーション関数を設定する2番目のパラメーターはオプションである(そのため、既存のコードは影響を受けない)。
    2. Throwable 、トレース情報がまだ設定されていない場合、ランタイムは指定された関数を使用してトレース情報を割り当てる。デアロケーション関数がnullでない場合、関数ポインタはThrowable 、新しいメンバinfoDeallocator にコピーされる。
    3. Throwable が破棄されるとき、infoDeallocator メンバが設定されていれば、info メンバ上で呼び出される。

    デフォルトのアロケータとデアロケータは、TraceInfo のアロケートとデアロケートにCのmallocとfreeを使うようになった。TraceInfo オブジェクト自体のアロケート以外は、ほとんどすべてがすでにnogcされていた。

    利点がある:

    1. GCコレクション・ルーチンの内部で実行されたときにスタック・トレースを生成できるようになった。
    2. InvalidMemoryOperationErrorがスタック・トレースを持つようになった。
    3. あまり知られていないが、@nogc 関数の内部でも、Throwable をスローすると実際に GC を使用していたが、(デフォルトでは)そのようなことはなくなった。
    4. 特定のGCハングが修正された(下記のバグ修正を参照)。

    欠点として考えられるのは、Throwable がファイナライズされたときにTraceInfo がデアロケートされるため、ポインタがぶら下がる可能性があることである。Throwable からinfo をコピーする場合は、Throwable のライフタイムを超えて保持しないか、infoDeallocator メンバをnullに設定することを確認すること。

ライブラリの変更

  1. 対数関数ファミリーの単精度および倍精度の実装

    新しいfloat およびdouble のオーバーロード std.math.exponential.log, std.math.exponential.log10, std.math.exponential.log1p, std.math.exponential.log2そして std.math.exponential.logb が、対応する精度の適切な「ソフトウェア」実装で Phobos に追加された。 が追加された。さらに std.math.exponential.logbは はpure になった。

    この結果、DMDの速度が低下する場合もあるが、GDCとLDCの全体的な高速化率は、 と の両方で3倍以上である。 GDCとLDCの高速化率は、doublefloat の両方で3倍以上である。

    これはまた、特に単精度において、より精度の低い結果を意味する、 従って、もしあなたのコードが80ビット中間精度でより正確な結果に依存していたのであれば、今すぐ明示的に引数をキャストしなければならない。 このため、80ビットの中間精度によってより正確な結果を得ようとした場合、引数を明示的にキャストしなければならなくなる。

  2. Unicodeプロパティ "C"別名"Other"に間違ったプロパティが関連付けられていた。

    std.uni からunicode.c またはunicode.Other (大文字と小文字を区別しない) を使用する場合は、コードベースを軽減するか修正する必要がある。

    この変更により、Unicode Techical Report #44と一致するようになった。残念ながら、すでに以前の間違った値で使用している場合、これはあなたのコードを壊してしまうので、以下に元の値を反映した関数を示す。

    @property auto loadPropertyOriginal(string name)() pure
    {
        import std.uni : unicode;
    
        static if (name == "C" || name == "c" || name == "other" || name == "Other")
        {
            auto target = unicode.Co;
            target |= unicode.Lo;
            target |= unicode.No;
            target |= unicode.So;
            target |= unicode.Po;
            return target;
        }
        else
            return unicode.opDispatch!name;
    }
    
  3. ユニコード表ジェネレーターがphobosに導入され、表がバージョン15に更新された。

    この変更により、コードやプログラムの使用に不具合が生じる可能性がある。 これは、テーブルが大幅に更新されたことと、テーブル・ジェネレータが長年にわたってすべての変更をコミットしていないことなど、いくつかの要因によるものである。

  4. std.typecons.Unique 構造体型で 。destroy

    Uniqueがスコープ外に出ると、デストラクタが呼び出されるようになった。 以前はデストラクタは呼ばれなかった。

    static int i;
    
    struct S
    {
        ~this()
        {
            i++;
        }
    }
    {
        Unique!S u = new S;
        // S.~thisがここに呼ばれた
    }
    assert(i == 1);
    

    注釈:上記では、構造体デストラクタは、 のメモリが回収される直前にGCによって呼び出される。 new S によって呼び出される。使用する構造体 デストラクタが、構造体の値に対して再度呼び出された場合に対処できるように注意すること。.init の値に対して再度呼び出されることを処理できるように注意すること。

インストーラの変更

  1. バンドルされている VisualD パッケージの更新

    VisualDパッケージのバージョン は何年も更新されていない。これは、バージョン VisualD の最新リリースである 1.3.1 にバンプされた。

  2. Windows 64ビットでは、DMDは32ビットより64ビットを優先する。

    Windows用のNSISインストーラーには、「PATHに追加」というオプションがある。以前は DMDの32ビット版だけがPATH環境変数に追加されていた。現在は Windows 64ビット版では、DMDの64ビット版がPATHから選択される。

dubの変更

  1. バイナリ出力が中央キャッシュに置かれるようになった

    これまでdubはビルドアーチファクトをパッケージディレクトリに出力していた。

    これにより、依存関係のためにビルドアーティファクトを再利用することができた。 packagesフォルダに大量のビルドアーティファクトが存在する問題が発生した、 パッケージの保存に読み取り専用の場所を使用できない、 ビルドアーティファクトのガベージコレクションが信頼できなくなる。

    このバージョンから、ビルドの成果物はデフォルトで $HOME/.dub/cache/build/$BASE_PACKAGE_NAME/$PACKAGE_VERSION/[+$SUB_PACKAGE_NAME] に出力される。 %APPDATA%/cache/build/$BASE_PACKAGE_NAME/$PACKAGE_VERSION/[+$SUB_PACKAGE_NAME] に出力される。

  2. DUB APIの変更:Package.metadataCache のセッターとゲッターが削除された。

    これら2つの関数は、メタデータ・キャッシュ・ファイルへのアクセスをジェネレーターに提供するために使用されていた。 へのアクセスをジェネレーターに提供するために使われていた。これらは決して一般に公開されることを意図したものではない、 JSONファイルフォーマットは安定していなかった。

    ビルドキャッシュの導入に伴い、これらを削除する必要があった、 というのも、賢明な移行パスを提供する方法がなかったからだ。 もし使用例があれば、dubリポジトリにissueを開いてほしい。


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

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

  1. Bugzilla 19268: BetterCがCTFEの.dupをオフにする。
  2. Bugzilla 20520: enum内でインスタンス化されたクラスのtypeidを取る際のランタイムセグメンテーションフォールト
  3. Bugzilla 21301: 長いパラメータリストに間違った値が渡される。
  4. Bugzilla 23307: [REG][CODEGEN][SIMD]インライン化されたローカル関数+SIMDで間違ったコード生成
  5. Bugzilla 23539: [REG master] Scope C++ definition out of sync with D
  6. Bugzilla 23548: [REG 2.098] CソースファイルがインポートでDモジュールより優先される
  7. Bugzilla 23569: [REG 2.081][ICE] Segmentation fault in in AggregateDeclaration::getType() (this=0x0) at src/dmd/aggregate.d:594
  8. Bugzilla 23587: キャスト(void)がnoreturnで動作しない
  9. Bugzilla 23591: [REG 2.101] 型がnoreturnの場合、コンパイラが受け付けるキャストが無効である。
  10. Bugzilla 23607: エラーメッセージが出力されなくなりICEにつながる無効なコード
  11. Bugzilla 23626: [REG2.096] auto const ref Args...とdelegateによるテンプレート推論

DMDコンパイラのバグ修正

  1. Bugzilla 13060: nogcが連想配列を読み込む
  2. Bugzilla 15414: "__traits(getAttributes)" は関数に複数のオーバーロードがあるとエラーになる。
  3. Bugzilla 15712: extern(C) unittest 内の extern(C) 属性が正しく無視されない。
  4. Bugzilla 18026: ddmd/dtemplate.d:6241 の TemplateInstance::needsCodegen() にスタックオーバーフローがある。
  5. Bugzilla 19623: HERE 文字列識別子が Unicode 文字で始まらない。
  6. Bugzilla 19649: 重複制約に対する誤解を招くエラーメッセージ
  7. Bugzilla 21062: 宣言の識別子としてキーワードを使用するとエラーになる
  8. Bugzilla 21506: 可変長引数関数の _argptr の位置ずれ
  9. Bugzilla 21613: DMDのクラッシュ: copy ctor + templated rvalue ctor
  10. Bugzilla 22759: ImportC: 関数内で宣言されたconstポインタをdereferencingするconst式を修正できない。
  11. Bugzilla 23122: 列挙型メンバ UDA のセマンティクスが正しくチェックされない。
  12. Bugzilla 23218: ICE: src/dmd/backend/cgxmm.d:1373:アサーション `0' が失敗した。
  13. Bugzilla 23412: void init のメンバ検出が静的配列を考慮していない。
  14. Bugzilla 23418: double 引数がスタックに渡されるが、XMM0 レジスタにあると仮定される。
  15. Bugzilla 23447: テンプレートインスタンスがどのオーバーロードにもマッチしない場合、エラーメッセージに間違った式が表示される。
  16. Bugzilla 23462: dmd: src/dmd/backend/cod2.d:2158:アサーション cast(int)tysize((*e).Ety) <= REGSIZE() は失敗した。
  17. Bugzilla 23463: 表示されるオーバーロードを制限するときにスキップされた関数のオーバーロードをカウントしない
  18. Bugzilla 23465: 無効なトークンエラーが間違った行を指す
  19. Bugzilla 23470: 診断のバックティックが間違った数の引数を渡すと混乱する
  20. Bugzilla 23491: delegate使用時に無意味な非推奨メッセージが表示される。
  21. Bugzilla 23531: [DIP1000] スコープ変数がAAキーとして割り当てられる
  22. Bugzilla 23534: "__traits(isZeroInit)"が明示的な値を持つ列挙型に対して真である
  23. Bugzilla 23536: crt_constructorsとcrt_destructorsは非静的メンバ関数であるべきではない
  24. Bugzilla 23568: エラー:'float4' 型の式 'a < b' を 'int4' に暗黙的に変換できない。
  25. Bugzilla 23578: "is"式のエイリアスパラメータに型がマッチしない。
  26. Bugzilla 23586: DMDが宣言されたばかりの変数を忘れる
  27. Bugzilla 23593: core.thread: suspendAll は現在のスレッドが自分自身を切り離した場合、すべてを待たない。
  28. Bugzilla 23614: ImportC: __int128 がサポートされていない。
  29. Bugzilla 23618: unsigned shorts の右シフト等号式は unsigned right shift であるべきだ。
  30. Bugzilla 23620: 'alias this' が静的配列の長さ位置で尊重されない

DMDコンパイラの機能強化

  1. Bugzilla 9848: 型宣言が期待されなかった場合の診断が改善された
  2. Bugzilla 15368: "foreach"内の"auto"キーワードに対するエラーメッセージの改善
  3. Bugzilla 21338: テンプレートのオーバーロード解決失敗のエラーメッセージを混乱させる
  4. Bugzilla 22306: スコープ配列変数はスタック確保されるべきである
  5. Bugzilla 23410: ImportC: バイナリ定数が許可されていない。
  6. Bugzilla 23424: テンプレートのインスタンス化がオーバーロードにマッチしない場合のエラーを改善する
  7. Bugzilla 23458: OverDeclaration または OverloadSet がマッチしない場合、テンプレート候補がリストされない。
  8. Bugzilla 23466: -verrors=context は補足メッセージのために同じコンテキストを繰り返すべきではない。
  9. Bugzilla 23480: 空でないForStatement Increment句は副作用を要求すべきである。
  10. Bugzilla 23552: 関数x 、関数をオーバーライドしないが、実際にはオーバーライドする。
  11. Bugzilla 23566: ImportC: __PRETTY_FUNCTION__ が定義されていない。

Phobos のバグ修正

  1. Bugzilla 23319: std.range.Generator がミュータブルでない要素で動作しない。
  2. Bugzilla 23488: std.format.sformatが文字範囲を誤って扱う
  3. Bugzilla 23507: Windows の新しいソケットで Socket.blocking プロパティが正しくない
  4. Bugzilla 23540: Cのstd.uni loadPropertyエイリアスが正しくない。
  5. Bugzilla 23561: std.typecons.Unique!structがstructインスタンスを破壊しない。
  6. Bugzilla 23640: Nullable range iterationがimmutable値で動作しない。

Phobos の機能強化

  1. Bugzilla 19737: [std.experimental.allocator] docsのリンクテーブルにシンボルがない。
  2. Bugzilla 23453: 一般的なiotaは前方範囲であるべきだ

Druntime リグレッションの修正

  1. Bugzilla 22616: GCルーチン中にInvalidMemoryOperationErrorの代わりに無限ループが発生する。
  2. Bugzilla 23562: [REG master] core.demangleのセグメンテーションフォールト

Druntime バグ修正

  1. Bugzilla 16641: __dmd_personality_v0 のInvalidMemoryOperationErrorで無限ループが発生する。
  2. Bugzilla 19467: OSXでEV_SETをサポートする
  3. Bugzilla 23572: OpenBSD:RTLD_DEFAULT リストに OpenBSD を追加

Druntime の拡張

  1. Bugzilla 20650: ファイナライザでGCが呼び出されたときの不可解なエラーメッセージ
  2. Bugzilla 23332: core.sync.conditionのnotifyメソッドは@nogcにすべきである。

dlang.orgのバグ修正

  1. Bugzilla 23382: コピーコンストラクタの非テンプレート要件が文書化されていない
  2. Bugzilla 23436: 構造体.init内の変更可能な参照が禁止されていると誤って記述している。
  3. Bugzilla 23541: [ImportC] dlang.orgに不正なリンクがある。

dlang.orgの機能強化

  1. Bugzilla 23426: 例: 実行ボタンがエラーの行番号を間違って表示する。
  2. Bugzilla 23432: 配列の容量が0のときのドキュメントと容量のパフォーマンス
  3. Bugzilla 23511: enumでサポートされていない型をインクリメントする。
  4. Bugzilla 23553: opCmpの仕様が不完全である。

インストーラのバグ修正

  1. Bugzilla 23623: 64 bit Windows では、パスは 64 bit dmd を指すべきである。

Contributors to this release (40)

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

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