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

変更履歴: 2.105.0

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

Download D 2.105.0
2023年8月1日リリース

2.105.0には、12の主要な変更と59の修正されたBugzillaの問題が含まれている。 2.105.0を可能にした 34名の貢献者 に感謝の意を表したい。

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

コンパイラの変更

  1. 代入形式の構文がalias this 宣言で許可されるようになった

    alias this 宣言は、他の 宣言と同じ 構文を使用して記述できるようになった。alias alias new = old;

    struct S
    {
        int n;
        alias this = n;
        // 同等のもの:
        //alias n this;
    }
    
  2. キャッチ句は、const または変更可能な例外のみを受け入れる必要がある

    2.104では、修飾された型のスローは 非推奨となった

    例外をimmutableinout 、またはshared として捕捉することも安全ではない。 例外が、別の変更可能または共有でない参照を通じてアクセス可能である可能性があるためである。 これらの修飾子を持つ例外を捕捉することは 現在では非推奨となっている。

    auto e = new Exception("first");
    try {
            throw e;
    } catch(immutable Exception ie) { // 今、エラーが
            e.msg = "second";
            assert(ie.msg == "first"); // 発生すると失敗する
    }
    
  3. 関数にenum ストレージクラスを指定することはできなくなった

    enum 関数宣言で使用しても効果はなく、 戻り値の型が指定されていない場合の ストレージクラスと同等であった。 この構文は マニフェスト定数と混同される可能性があり、 現在はエラーとなっている。auto enum

    xml-ph-0001@deepl.internalxml-ph-0001@deepl.internal
    enum void f1() { }  // エラー
    enum f2() { }       // エラー
    

    代わりに、enum を削除し、必要に応じてauto を使用する。

    void f1() { }
    auto f2() { }
    
  4. extern(C) 関数のオーバーロードはエラーとなる

    2.095.0 以降、リンク時にシンボル衝突が発生するため、モジュール内で同じ関数を複数回定義することはできなくなった。 異なるパラメータ型を持つ関数のオーバーロードは、もちろん依然として許可されており、Dがパラメータ型を含むシンボル名をマングル(連結)するため、動作する。 しかし、一部の外部リンク(extern(C)extern(Windows) など)では、この処理が行われないため、オーバーロードするとリンク時にシンボル衝突が発生する可能性がある。 そのため、このリリースでもこの処理は非推奨となった。 "function"関数"

    この非推奨化は、現在ではエラーに変更されている。 修正措置として、関数に D または C++ リンクを指定するか、一意の関数名を使用すること。

    // エラー:
    extern(C) float square(float x) { return x * x; }
    extern(C) double square(double x) { return x * x; }
    
    // 是正措置:
    extern(C) float squaref(float x) { return x * x; }
    extern(C) double squared(double x) { return x * x; }
    
    // もしくは:
    float square(float x) { return x * x; }
    double square(double x) { return x * x; }
    
  5. パブリックメソッドでオーバーロードされたプライベートメソッドへのアクセスの非推奨化フェーズが終了した

    プライベートメソッドが、後に続くパブリックメソッドとオーバーロードされている場合、 プライベートオーバーロードをパブリックであるかのようにアクセスすることができた。

    2.094から始まる非推奨期間の後、このコードは現在エラーとなる。

    例:

    struct Foo
    {
        private void test(int) { }
        public void test(string) { }
    }
    ...
    Foo().test(3);
    
  6. 追加された定義済みのバージョン識別子VisionOS

    これは、AppleのVR/ARデバイス「Vision Pro」用の新しいオペレーティングシステムである。

  7. 呼び出しまたは構築時に、"型"または"式"を括弧で囲む際にC言語のキャストを使用しない

    このバージョンより前のバージョンでは、(IdentifierOrBasicType)(Expression) のような式は"C言語のスタイル"のキャストとみなされ、IdentifierOrBasicType が呼び出し可能であっても許可されなかった。しかし、このバージョンでは、式が呼び出しまたは構造である限り、許可されるようになった。

    struct S { int x; }
    int foo(int x) { return x; }
    auto bar = &foo;
    
    // これらは以前は許可されていなかった
    auto s = (S)(5);   // S(5)に相当する
    auto f = (foo)(5); // foo(5)に相当する
    auto b = (bar)(5); // bar(5)に相当する
    auto i = (int)(5); // int(5)に相当するもので、キャストではない。
    
    // これは許可されていない
    auto bad = (int)5; // エラー: C言語のスタイルのキャストは不正である。`cast(int)5`を使用する
    auto bad2 = (ubyte)(12345); // エラー: 型`int`の式`12345`を`ubyte`に暗黙的に変換できない
    
    callablecall

    Bugzilla 24025 を参照:括弧で囲まれた式は、C言語のキャストであると想定すべきではない

実行時の変更

  1. Linux 入力ヘッダーの翻訳が druntime に追加された

    これらのヘッダーは、Linux Input Subsystem ユーザー空間 API へのアクセスを提供し、 キーボード、タッチスクリーン、ゲームコントローラーなどからの入力の読み取りや、入力デバイスのエミュレーションに使用される。core.sys.linux からインポートすることができるようになった。

    import core.sys.linux.input; // linux/input.h
    import core.sys.linux.input_event_codes; // linux/input-event-codes.h
    import core.sys.linux.uinput; // linux/uinput.h
    
  2. Valgrindmemcheck ツールとの統合がガベージコレクタに追加された

    Valgrindのmemcheck ツールとの統合を有効にするコンパイル時のオプションがガベージコレクタに追加された。 有効にすると、GCはValgrindと通信し、どのメモリアクセス操作が有効で、どの操作が無効であるかをValgrindに通知する。

    この統合により、例えば、安全(GC)と非安全(手動)のメモリ管理が混在するDプログラムにおけるメモリエラーを検出できるようになる。

    GCGC
    import core.memory;
    
    void main()
    {
        auto arr = new int[3];
        GC.free(arr.ptr);
        arr[1] = 42; // freeの後に使う
    }
    

    これを使用するには、DMDのソースコードを入手し、ご使用のプログラムのコンパイルにガベージコレクタとライフタイム実装を含め、-debug=VALGRIND オプションでコンパイルする。

    xml-ph-0000@deepl.internalxml-ph-0000@deepl.internal
    git clone -b v2.105.0 --depth=1 https://github.com/dlang/dmd
    dmd -g -debug=VALGRIND program.d -Idmd/druntime/src dmd/druntime/src/{core/internal/gc/impl/conservative/gc,rt/lifetime,etc/valgrind/valgrind}.d
    valgrind --tool=memcheck ./program
    

    このオプションは、MEMSTOMPSENTINEL などの他の GC デバッグビルドオプションと互換性がある。

    Dubユーザーは、以下の同等のレシピを試すことができる。

    git clone -b v2.105.0 --depth=1 https://github.com/dlang/dmd
    cat >> dub.sdl <<EOF
    debugVersions "VALGRIND"
    sourceFiles "dmd/druntime/src/core/internal/gc/impl/conservative/gc.d"
    sourceFiles "dmd/druntime/src/rt/lifetime.d"
    sourceFiles "dmd/druntime/src/etc/valgrind/valgrind.d"
    importPaths "dmd/druntime/src"
    EOF
    dub build
    valgrind --tool=memcheck ./program
    
    GCDub

ライブラリの変更

  1. std.algorithm.iteration.permutations の static assert メッセージの改善

    これまで、permutations は渡された型が使用可能かどうかをチェックするためにテンプレート制約を使用していた。 使用できない場合、その理由を突き止めるのは非常に面倒だった。

    テンプレート制約はオーバーロード解決には使用されないため、 制約は、表現力豊かなエラーメッセージを持つ"static assert"に移動された。

    xml-ph-0000@deepl.internal と xml-ph-0001@deepl.internal を追加した。
  2. std.system.instructionSetArchitecturestd.system.ISA を追加した

    対象システム用のインストラクションセットアーキテクチャを表す新しい列挙型が追加された。 これは、対象CPUのISAが 実行時にのみ必要となる場合、例えば以下に示されているような人間が読めるメッセージの提供を 目的としている。

    import std.stdio;
    import std.system;
    
    void main()
    {
        writeln("Hello ", instructionSetArchitecture, " world!");
    }
    
    ISAISA

変更点

  1. --d-versions CLI フラグを公開

    --d-versions=Xyz を指定すると、基本的にversion = Xyz; をすべての D ソースファイルに挿入することができる。 これは、dub.sdl / dub.json ファイルでversions を指定することと同じであるが、CLI から指定するものであり、ビルドの型や構成とは無関係である。


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

DMDコンパイラの回帰修正

  1. Bugzilla 22427: 文字列比較において、配列のキャストがリンカーエラーを引き起こす。
  2. Bugzilla 24018: デフォルトのコンストラクションが無効になっていると、配列の結合が機能しない

DMDコンパイラのバグ修正

  1. Bugzilla 7184: *(x)++の構文エラー
  2. Bugzilla 11612: 負の新しい配列サイズに関する一貫性のないエラー
  3. Bugzilla 13063: enum が関数の記憶クラスとして許可される
  4. Bugzilla 16384: 複数の定義で呼び出されない不変
  5. Bugzilla 18528: dmdは同一のエラーを重複排除すべきである
  6. Bugzilla 20008: パッケージの__traits(allMembers)はまったく無意味だ
  7. Bugzilla 20687: メンバ関数のアドレスをconst初期化子として許可する
  8. Bugzilla 21415: 不変例外をキャッチすると、不変が破られる
  9. Bugzilla 21425: va_start を 2 回使用すると、間違った値になる
  10. Bugzilla 23719: runnable/test22071.c:22:16: エラー: 'abc' はポインタである。'-&gt;' を使用するつもりだったのか?
  11. Bugzilla 23857: バックエンドのインライン展開が再帰関数の呼び出しに時間がかかりすぎる
  12. Bugzilla 23870: ImportCは改行文字に続く''を受け入れないが、VCは受け入れる
  13. Bugzilla 23875: ImportC: キャストでの__attribute__は動作しない
  14. Bugzilla 23879: ImportC: Windows システムヘッダーでは __alignof を使用する
  15. Bugzilla 23880: ImportC: __attribute__((vector_size(N))) は実装されていない
  16. Bugzilla 23885: [CI] g++ との C++ 相互運用テストが失敗する
  17. Bugzilla 23900: inline asm 内で @safe が許可されている
  18. Bugzilla 23908: 循環インポートにおける存在しないインポートヒントが混乱を招く
  19. Bugzilla 23912: デストラクタによりスコープ推論が無効になる
  20. Bugzilla 23914: 戻り値の「自動参照」解決がnoreturn(ボトム型)によって妨げられる
  21. Bugzilla 23935: ImportC: 構造体とタグ名の間に__pragmaは許可されていない
  22. Bugzilla 23936: ImportC: 構造体に対しては、pragma pack が機能しない
  23. Bugzilla 23947: クラスがプライベートとパブリックを混在させたメソッドをオーバーロードし、最後のオーバーロードがパブリックの場合、そのメソッドは常にパブリックとなる。
  24. Bugzilla 23968: UFCSでテンプレート化された関数のエイリアスで非推奨が発行されない
  25. Bugzilla 23988: 条件付き実行では、片方がconstの場合、列挙型を正しい共通型に変換できない
  26. Bugzilla 24010: タプルのスコープが終了する前にデストラクタが呼び出される
  27. Bugzilla 24017: [UFCS]debug を使用したnothrow の回避策が機能しない
  28. Bugzilla 24024: クラスをrefクラスに渡すことができない
  29. Bugzilla 24025: 括弧で囲まれた式は、C言語のキャストであると想定すべきではない
  30. Bugzilla 24029: ImportC: 文式におけるシンボル名の衝突

DMD コンパイラの機能強化

  1. Bugzilla 4663: 間違った「static」の位置を示すエラーメッセージ
  2. Bugzilla 15436: コンパイラは依然としてAliasSeqを「タプル」と呼んでいる(そしてTypeTuple?
  3. Bugzilla 23475: Windows上でのulong/longとprintfの非推奨化メッセージの混同
  4. Bugzilla 23871: ImportC: __attribute が認識されない
  5. Bugzilla 23877: ImportC: Importing byteswap.h results in undefined reference to core.bitop.byteswap
  6. Bugzilla 23886: ImportC プリプロセッサ指令 #ident はサポートされていない
  7. Bugzilla 23928: エラーメッセージを改善する: スコープ外の変数がスコープ外のパラメータに割り当てられている。この呼び出しでabc
  8. Bugzilla 23931: エラー:ローカル変数への参照this 非スコープメンバ関数を呼び出すthis.this()
  9. Bugzilla 23948: __FILE__ および __MODULE__ をデフォルトパラメータとして const(char)* に暗黙的に変換することはできない
  10. Bugzilla 23971: C++ 連携でスライスを返そうとした際に、より明確なエラーメッセージを表示する
  11. Bugzilla 24000: 開き括弧「{」の位置を表示する エラー:} の一致が期待されるが、一致しないEnd of File
  12. Bugzilla 24023: エラーメッセージの型に不要なモジュール接頭辞が含まれている

Phobosのバグ修正

  1. Bugzilla 23361: std.uni.normalizeは純粋であるべきである
  2. Bugzilla 23844: chain(only) は不変構造体をサポートしていない
  3. Bugzilla 23940: std.getopt は、config.caseInsensitive で大文字と小文字が異なるオプションではアサートしない
  4. Bugzilla 23997: isClose(1, -double.infinity) は true を返す
  5. Bugzilla 24028: BigIntの累乗演算子は指数部の符号を無視する

Phobosの機能強化

  1. Bugzilla 23881: std.systemにはシステムアーキテクチャ用の関数がない
  2. Bugzilla 23922: [std.socket]

実行時バグ修正

  1. Bugzilla 23312: WinMainでwritelnを呼び出すとクラッシュする

実行時環境の強化

  1. Bugzilla 23980: OpenBSD:getthrname(2) と setthrname(2) を unistd.d に追加
  2. Bugzilla 24044: 配列での float opCmp(...) をサポート

dlang.org のバグ修正

  1. Bugzilla 23692: ImportC: __pragma と __declspec はサポートされているとドキュメント化されていない Visual C 拡張機能
  2. Bugzilla 23697: ImportCの仕様で受け入れられるCコードの無効な前方参照の例がない
  3. Bugzilla 23946: 仕様では「デストラクタは1つだけ存在できる」と記載されているが、これはミックスインテンプレートと混同する可能性がある

dlang.org の機能強化

  1. Bugzilla 5636: 配列演算では、ベクトル形式の要素単位ではなく、辞書式の比較を使用する
  2. Bugzilla 23571: 列挙型のドキュメントにおけるマニフェスト定数の説明は、よく考えて書かれていない

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

このリリースを可能にしてくれた素晴らしい方々に心より感謝いたします。

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