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

変更履歴: 2.109.0

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

Download D 2.109.0
リリース日:2024年6月1日

2.109.0には、15の主要な変更と26の修正されたBugzillaの問題が含まれている。 2.109.0を可能にした 39名の貢献者 に感謝の意を表したい。
D 2.109.0 におけるすべてのバグ修正と機能強化の一覧を追加する。 xml-ph-0000@deepl.internal
D 2.109.0 におけるすべてのバグ修正と機能強化の一覧

コンパイラの変更

  1. [次版]型インスタンスのメンバのエイリアス化はエラーとなった

    このようなエイリアスは、実際にはインスタンスの型のメンバをエイリアスするものであり、 インスタンスのメンバ自身をエイリアスするものではない。これは混乱を招く可能性があり、現在はエラーとなっている。 代わりに、型のメンバをエイリアスする。

    struct Foo
    {
        int v;
        void test(Foo that) const
        {
            alias a = this.v; // OK
            alias b = that.v; // エラー、代わりに`typeof(that).v`を使用する
            assert(&a is &b); // 合格
            assert(&b !is &that.v);
        }
    }
    
    struct Bar
    {
        Foo f;
        alias v = f.v; // エラー、`typeof(f).v`を使用する
    }
    
    ビットフィールドの自己診断機能の追加
  2. ビットフィールドの自己診断機能の追加

    追加:

    プロパティxml-ph-0000@deepl.internalを使用してビットフィールドの開始ビット番号を取得する

    • プロパティ.bitoffsetof でビットフィールドの開始ビット番号を取得する

    xml-ph-0000@deepl.internalxml-ph-0000@deepl.internal

    • プロパティ.bitwidth でビットフィールドのビット数を取得する

    • __traits(isBitfield, symbol) フィールドシンボルがビットフィールドである場合は true を返す

  3. __ctfeWrite を追加し、CTFE からメッセージを書き込めるようにした

    特殊関数__ctfeWrite は、pragma(msg, ...) と同様に、 CTFE中にメッセージを書き込むために使用できるようになった。メッセージがユーザにどのように提示されるかは処理系定義である。 推奨される方法は、 メッセージをstderr (標準エラーストリーム)に 出力することである。この関数はobject.d で使用可能であり、const(char)[] に暗黙的に変換できる任意の値を受け入れる。 "implementation defined"処理系定義

    例えば:

    xml-ph-0003@deepl.internalxml-ph-0003@deepl.internal
    int greeting()
    {
        __ctfeWrite("Hello from CTFE. Today is ");
        __ctfeWrite(__DATE__);
        __ctfeWrite("\n");
        return 0;
    }
    
    enum forceCTFE = greeting();
    

    このプログラムをコンパイルすると、以下の出力が生成される。

    Hello from CTFE. Today is <current date>
    
  4. 非推奨の警告も-verrors で制限されるようになった

    デフォルトでは、コンパイラは20個のエラーメッセージを表示した時点で停止する。ただし、例えば-verrors=50-verrors=0 を指定して無制限にすることも可能である。 このエラー表示の制限は、非推奨メッセージにも適用されるようになったため、まだすべての非推奨を修正していない大規模なプロジェクトをコンパイルする場合でも、何百もの非推奨メッセージがコマンドラインに表示されることはない。

    deepldeepl
    deprecated void f()
    {
    }
    
    void main()
    {
        f();
        f();
        f();
        f();
    }
    
    internalinternal

    > dmd -verrors=3 app.d
    app.d(7): Deprecation: function app.f is deprecated
    app.d(8): Deprecation: function app.f is deprecated
    app.d(9): Deprecation: function app.f is deprecated
    1 deprecation warning omitted, use -verrors=0 to show all
    

    dtohはxml-ph-0000@deepl.internalとxml-ph-0001@deepl.internalの関数のシグネチャを生成する。
  5. dtohはextern(Windows) およびextern(System) 関数のシグネチャを生成する

    -HC スイッチを使用すると、extern(C) およびextern(C++) 関数に加えて、extern(Windows) およびextern(System) 関数も .h ファイルに出力される。

    例 D モジュール:

    example D module例Dモジュール
    extern(Windows) int hello()
    {
        return 0;
    }
    
    extern(System) int myFriend()
    {
        return 0;
    }
    

    -HC スイッチ付きの出力:

    // (フルヘッダー省略)
    
    #ifndef _WIN32
    #define EXTERN_SYSTEM_AFTER __stdcall
    #define EXTERN_SYSTEM_BEFORE
    #else
    #define EXTERN_SYSTEM_AFTER
    #define EXTERN_SYSTEM_BEFORE extern "C"
    #endif
    
    int32_t __stdcall hello();
    
    EXTERN_SYSTEM_BEFORE int32_t EXTERN_SYSTEM_AFTER myFriend(x);
    
  6. foreach size_t より小さいインデックス型を持つことができる

    配列の長さは、以下の場合はコンパイル時に判明する。

    • 配列がリテラルである場合
    • 配列がスライス式であり、その上限がコンパイル時に既知である

    配列a の場合、インデックスの型は任意の整数型I であり、a.length <= I.max

    その他のケースはまだ実装されていない

  7. foreach_reverse デリゲート上ではエラーとなる

    foreach_reverse が使用された場合、デリゲートによって返された結果の逆走査をコンパイラが実装しようとしなかった。 その結果、コードが 読みづらくなる可能性があったため、長年にわたって非推奨とされていた。foreach_reverse をデリゲートと共に使用すると、現在エラーとなる。

  8. 識別子テーブルの拡張により、C23に一致する新しい文字が許可されるようになった。CLIの構成変更性とともに、C23が追加された

    現在、DとImportCの両方について、c99c11UAX31 (C23)およびall (最も制限の少ないセット)から選択できる。

    これは、-identifiers=<table> および ImportC については-identifiers-importc=<table> を使用して行うことができる。

    Dのデフォルトテーブルは現在、xml-ph-0000@deepl.internalに設定されており、ImportCはxml-ph-0001@deepl.internalに設定されている。 以前は、DとImportCの両方が

    Dのデフォルトのテーブルは現在、all に設定されており、ImportCはc11 に設定されている。 以前は、DとImportCの両方がc99 のテーブルを使用していた。

    Dのテーブルは、後日、UAX31に切り替わる予定である。これは2.117で行われるべきである。 もし、現在、c99 の特定の文字を使用しており、変更したくない場合は、all に戻すこともできる。 しかし、そのような必要が生じることはまずないはずである。

  9. ImportCはUnicodeサポートを改善した

    ユニバーサル文字名がサポートされるようになったため、\uXXXX および\UXXXXXXXX の構文を使用できるようになり、X が識別子の一部として16進数で表されるようになった。

    DigitalMars sppnはC99より新しいものはサポートしていない。 制限があることが知られており、これらの範囲外のUnicode文字を使用するとエラーが発生する。

  10. シンボルエラーが少なくなる

    ライブラリへのリンクを忘れたり、.dファイルをコマンドラインにリストアップしたり、main 関数を含めたりすることは珍しくない。 例:

    example例
    module app;
    
    unittest
    {
        import assertions;
        assertEquals('D', 'D');
    }
    
    example例
    module assertions;
    
    void assertEquals(char a, char b)
    {
        assert(a == b);
    }
    
    これを以下のようにコンパイルする場合:

    以下のようにコンパイルする場合:

    toだ

    > dmd -unittest app.d
    

    コンパイラはエラーを検知しないが、リンク時にシンボルが欠落している。 以前は、シンボル名が文字化けした不可解なリンカーエラーが発生していた。

    symbolシンボル

    /usr/bin/ld: /usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/../../../../lib/Scrt1.o: in function `_start':
    (.text+0x1b): undefined reference to `main'
    /usr/bin/ld: app.o: in function `_D3app16__unittest_L5_C1FZv':
    app.d:(.text._D3app16__unittest_L5_C1FZv[_D3app16__unittest_L5_C1FZv]+0xc): undefined reference to `_D10assertions12assertEqualsFaaZv'
    collect2: error: ld returned 1 exit status
    

    経験豊富なユーザーであれば、シンボルをデマングルして読みやすくする方法を知っているかもしれない。

    symbolシンボル

    > echo _D10assertions12assertEqualsFaaZv | ddemangle
    void assertions.assertEquals(char, char)
    

    しかし、毎回手作業でやるのは不便だ。 コンパイラがリンカプログラムを呼び出すと、その出力が読み込まれ、未定義シンボルエラーがスキャンされ、名前がデマングリングされる。

    to read読む

    Error: undefined reference to main
    Error: undefined reference to void assertions.assertEquals(char, char)
           referenced from void app.__unittest_L5_C1()
           perhaps define a void main() {} function or use the -main switch
           perhaps .d files need to be added on the command line, or use -i to compile imports
    Error: linker exited with status 1
    

    これにより、コマンドの修正が容易になる。 xml-ph-0000@deepl.internal

    これにより、コマンドの修正が容易になる。

    > dmd -unittest -main -i app.d
    

    現在サポートされているリンカーは、ld、bfd、gold、mold、Microsoft LINK である。 お使いのリンカーのエラーが検出されない場合は、問題を報告してほしい。

  11. Windows OMF サポートは削除された

    PE-COFFをWindowsのデフォルトとしてサポートするようになってから2年が経過したが、OMFのサポートは現在削除されている。

    これには、スイッチ (-m32omf) も含まれる。

    xml-ph-0000@deepl.internalxml-ph-0000@deepl.internal

実行時の変更

  1. モジュールcore.sys.linux.sys.mount を追加する

    新しいモジュールcore.sys.linux.sys.mount は、 Linux のヘッダー<sys/mount.h> にある定義に対応する

  2. druntimeからcollectNoStack 関数とAPIをすべて削除する

    DガベージコレクタのcollectNoStack 関数は、 スレッドスタックやスレッドローカルストレージのルートを使用せずに、収集を実行した。 このメカニズムを実行する危険性は、 スレッドからの参照のみを持つメモリブロックが、スレッドが実行中であり、 メモリを使用している可能性があるにもかかわらず、収集される可能性があることである。 "関数""関数"

    この関数が呼び出されるのは、GCの終了時だけである。GCの 終了時には、GCが破棄されようとしているため、できるだけ多くの デストラクタを実行したい。しかし、GCによって割り当てられたメモリをスレッドが使用している場合、 そのメモリをクリーンアップしても問題の解決にはならない。GCがメモリをクリーンアップした後にクラッシュするか、 GCが破棄された後にクラッシュするかの

    この関数の本来の目的(D1より)は、 このメカニズムはシングルスレッドのプログラム(そしてもちろん、プログラム終了時)でのみ使用されていたため、小規模なテストプログラムで GC が確実にクリーンアップされるようにすることが、この関数の当初の目的であった。 また、当時、 D1 は 32 ビットであり、偽ポインタは今よりもずっと一般的であった。 スタックのスキャンを回避することで、クリーンアップ時の一見ランダムな動作を回避できる。 しかし、以下に示すように、データを確実に 常にクリーンアップする

    今日では、そのような関数が呼び出される可能性ははるかに高い。 そのような関数が呼び出されると、実行中のスレッドすべてにおいて、使用後解放メモリ破壊が即座に開始される。 したがって、私たちはその機能を完全に削除し、標準のGCクリーンアップ(スタックのスキャン など)のみを行う。プログラム終了時のGCクリーンアップの保証が少なくなることで、潜在的な危険性が一つ減るという利点がある。

    さらに、現在のGCは有効なスタックの場所について少し賢くなっているため、 ブロックが未確定のままになる可能性はさらに低くなっている。

    これまで通り、GC実行終了時にすべてのブロックをクリーンアップすることを保証するものではない。 以前はブロックのクリーンアップを行っていたコードの動作が変更され、 クリーンアップされなくなった場合でも、それは仕様内である。また、 すべてのブロックを確実にクリーンアップする動作を希望する場合は、--DRT-gcopt=cleanup:finalize の実行時構成オプションを使用することで、 スキャンを行わずにすべてのブロックをクリーンアップすることが

  3. Thread.sleep@trusted としてマークする

    静的メソッドcore.thread.Thread.sleep は現在、@trusted としてマークされており、@safe のコードから直接呼び出すことができる。

ライブラリの変更

  1. std.process.Config.preExecDelegate を追加する

    std.process.Config.preExecDelegatestd.process.Config.preExecFunction、 しかし、環境をキャプチャすることもできる。例えば:

    xml-ph-0000@deepl.internalxml-ph-0000@deepl.internal
    import core.sys.linux.sys.prctl : PR_SET_PDEATHSIG, prctl;
    import std.process : Config, execute;
    
    void runProgram(int pdeathsig)
    {
        execute(
            ["program"],
            config: Config(
                preExecDelegate: () @trusted =>
                    prctl(PR_SET_PDEATHSIG, pdeathsig, 0, 0, 0) != -1,
            ),
        );
    }
    
    後方互換性を保つために保持される。 xml-ph-0000@deepl.internalとxml-ph-0001@deepl.internalの両方が指定された場合、両方が呼び出される。

    preExecFunction 後方互換性を維持するために保持されます。 と の両方が指定された場合、両方が呼び出されます。preExecFunction preExecDelegate

    emailemail
D 2.109.0 のすべてのバグ修正と機能強化の一覧:
D 2.109.0 のすべてのバグ修正と機能強化の一覧:

DMDコンパイラの回帰修正

  1. Bugzilla 24560: デフォルトパラメータを含むインポート関数でdmdがクラッシュする問題を修正したnew

DMDコンパイラのバグ修正

  1. Bugzilla 14128: AliasDeclarationが式を許可し、ThisExpの偽のコードの原因となる
  2. Bugzilla 20148: voidで初期化されたboolはtrueにもfalseにもなり得る
  3. Bugzilla 21854: @liveは整数のforeachを中断する
  4. Bugzilla 21923: "@live"はデストラクタのコードを考慮しない。
  5. Bugzilla 22977: [dip1000] ネストした関数から返されたスコープポインタをエスケープできる
  6. Bugzilla 23530: immutableのキャストを許可する
  7. Bugzilla 24434: cast() を使用した const のキャストは "l値" を生成すべきではない
  8. Bugzilla 24477: "@safe"では、"bool"の共用体アクセスは許可すべきではない
  9. Bugzilla 24485: コピーコンストラクタを持つ構造体に対する無効な暗黙の参照戻り値の再解釈キャスト
  10. Bugzilla 24493: FreeBSD_14 バージョン識別子が欠落している
  11. Bugzilla 24504: ImportC:int リテラル値とuint リテラル値が混在する列挙型の宣言は、Windows をターゲットとし、デバッグ情報の生成が有効になっている場合、エラーの原因となる。
  12. Bugzilla 24520: [REG] 型 (値) に同義語 (型) (値) がある
  13. Bugzilla 24525: 式文の最も左の式として使用された場合、自動参照ラムダ式は解析されない

DMD コンパイラの機能強化

  1. Bugzilla 5573: コンパイラ(リンカではない)は、main() が欠落している場合にエラーを生成すべきである
  2. Bugzilla 21718: プレビュースイッチの説明が不十分
  3. Bugzilla 24111: [ImportC] 致命的なエラー C1034: stdio.h: インクルードパスが設定されていない
  4. Bugzilla 24450: 配列の長さが既知の場合、foreach のインデックスに VRP を適用する
  5. Bugzilla 24452: 実行時にカバレッジを無効にできない

Phobosのバグ修正

  1. Bugzilla 15708: std.range.chooseは、hasElaborateCopyConstructorが「has __postblit」を意味すると仮定している
  2. Bugzilla 24478: 行のサイズがヘッダを超えると、std.csv配列が境界外になる
  3. Bugzilla 24549: std.process.environment.get(null) がセグメンテーションエラーを起こす

実行時バグ修正

  1. Bugzilla 24517: FreeBSD 14でdruntimeのテストが失敗する
  2. Bugzilla 24546: importC musl setjmp.h の失敗

dlang.org のバグ修正

  1. Bugzilla 24472: __traits(fullyQualifedName)は仕様書に記載されていない

dlang.orgの機能強化

  1. Bugzilla 24488: 貢献者ガイドがホームページから見つけにくい

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

このリリースを可能にしてくれた素晴らしい人々に感謝の意を表したい。

以前のバージョン: — 次のバージョン: