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

変更ログ 2.088.0

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

Download D 2.088.0
2019年09月01日リリース

2.088.0には、27の大きな変更と58のBugzilla問題の修正が含まれている。 多大なる感謝を 58人の貢献者 に感謝する。

D 2.088.0におけるバグ修正と機能強化の一覧。

コンパイラの変更

  1. D1演算子オーバーロードは非推奨となった。

    以下のD1演算子オーバーロードは非推奨となり、opUnary :

    • opNeg で置き換える。opUnary(string op)() if (op == "-")
    • opCom で置き換える。opUnary(string op)() if (op == "~")
    • opPostInc で置き換える。opUnary(string op)() if (op == "++")
    • opPostDec で置き換える。opUnary(string op)() if (op == "--")
    • opStar 置き換えるopUnary(string op)() if (op == "*")

    以下のD1演算子オーバーロードは非推奨となり、opBinary :

    • opAdd で置き換える。opBinary(string op)(...) if (op == "+")
    • opSub で置き換える。opBinary(string op)(...) if (op == "-")
    • opMul で置き換える。opBinary(string op)(...) if (op == "*")
    • opDiv で置き換える。opBinary(string op)(...) if (op == "/")
    • opMod 置き換えるopBinary(string op)(...) if (op == "%")
    • opAnd 置き換えるopBinary(string op)(...) if (op == "&")
    • opXor 置き換えるopBinary(string op)(...) if (op == "^")
    • opOr 置き換えるopBinary(string op)(...) if (op == "|")
    • opShl 置き換えるopBinary(string op)(...) if (op == "<<")
    • opShr 置き換えるopBinary(string op)(...) if (op == ">>")
    • opUShr 置き換えるopBinary(string op)(...) if (op == ">>>")
    • opCat 置き換えるopBinary(string op)(...) if (op == "~")
    • opIn 置き換えるopBinary(string op)(...) if (op == "in")

    以下のD1演算子オーバーロードは非推奨となり、opBinaryRight :

    • opAdd_r で置き換える。opBinaryRight(string op)(...) if (op == "+")
    • opSub_r で置き換える。opBinaryRight(string op)(...) if (op == "-")
    • opMul_r で置き換える。opBinaryRight(string op)(...) if (op == "*")
    • opDiv_r で置き換える。opBinaryRight(string op)(...) if (op == "/")
    • opMod_r 置き換えるopBinaryRight(string op)(...) if (op == "%")
    • opAnd_r 置き換えるopBinaryRight(string op)(...) if (op == "&")
    • opXor_r 置き換えるopBinaryRight(string op)(...) if (op == "^")
    • opOr_r 置き換えるopBinaryRight(string op)(...) if (op == "|")
    • opShl_r 置き換えるopBinaryRight(string op)(...) if (op == "<<")
    • opShr_r 置き換えるopBinaryRight(string op)(...) if (op == ">>")
    • opUShr_r 置き換えるopBinaryRight(string op)(...) if (op == ">>>")
    • opCat_r 置き換えるopBinaryRight(string op)(...) if (op == "~")
    • opIn_r 置き換えるopBinaryRight(string op)(...) if (op == "in")

    以下のD1演算子オーバーロードは非推奨となり、opOpAssign :

    • opAddAssign で置き換える。opOpAssign(string op)(...) if (op == "+")
    • opSubAssign で置き換える。opOpAssign(string op)(...) if (op == "-")
    • opMulAssign で置き換える。opOpAssign(string op)(...) if (op == "*")
    • opDivAssign で置き換える。opOpAssign(string op)(...) if (op == "/")
    • opModAssign 置き換えるopOpAssign(string op)(...) if (op == "%")
    • opAndAssign 置き換えるopOpAssign(string op)(...) if (op == "&")
    • opOrAssign 置き換えるopOpAssign(string op)(...) if (op == "|")
    • opXorAssign 置き換えるopOpAssign(string op)(...) if (op == "^")
    • opShlAssign 置き換えるopOpAssign(string op)(...) if (op == "<<")
    • opShrAssign 置き換えるopOpAssign(string op)(...) if (op == ">>")
    • opUShrAssign 置き換えるopOpAssign(string op)(...) if (op == ">>>")
    • opCatAssign 置き換えるopOpAssign(string op)(...) if (op == "~")

    このリリースから、D1演算子オーバーロードを下げるトリガーとなるDコードは、非推奨の警告を発するようになった。

    非推奨警告の例:

    struct S
    {
        int opAdd(int i) { ... }
    }
    
    void main()
    {
        S s;
        int i;
        i = s + 1;  // 非推奨: `opAdd`は非推奨である。変わりに`opBinary`を使用する。
    }
    

    是正措置の例:

    struct S
    {
        int opBinary(string op)(int i) if (op == "+") { ... }
    }
    
    void main()
    {
        S s;
        int i;
        i = s + 1;  // OK
    }
    
  2. 静的ブロック内でのコンストラクタ宣言の許可は廃止される。

    言語仕様では、静的コンストラクタは次のように定義されている。 static this()を使用して定義する。静的ブロック内で 静的ブロック内でコンストラクタを定義しても、コンストラクタには何の影響もない。 コンストラクタに影響を与えない。次のコードはコンストラクタに影響を与えない。 コンストラクタに影響を与えない:

    static:
        this() {}
    
    static
    {
        this() {}
    }
    

    コンパイラーは、上記のコード・サンプルに対して警告やエラーを発しない。 の前に実行されない通常のコンストラクタを生成する。 main "関数の前には実行されない。このため コンパイラーは問題を正しく示すことができない:

    class A
    {
        static
        {
            this() {}
        }
    
        this() {}
    }
    
    void main()
    {
        new A();
    }
    

    このコードでは、次のようなエラーメッセージが表示される。 コンストラクタが複数定義されているthis() という誤解を招くメッセージが表示される。

    このリリースから、静的コンテキストでコンストラクタ が静的コンテキストで遭遇するたびに というエラーメッセージが出力される。static キーワードはコンストラクタに影響を与えない。 解決策は、コンストラクタを の外側でコンストラクタを宣言することだ。 コンストラクタ (static this()) として宣言することである。

  3. deprecated alias this にも適用される。

    このリリース以前は、alias this 上のdeprecated はパーサーに受け入れられていた。 によって受け入れられたが、使用時に非推奨のメッセージが表示されることはなかった。

  4. コンストラクタ内での不変のフィールドの二重初期化は廃止された。

    コンストラクタのスコープ内では、集約宣言(クラス/構造体)メンバへの代入は、最初の代入を初期化とみなして行われる。 メンバへの代入は、最初の代入を初期化とみなし、それ以降の代入を最初に構築されたオブジェクトの変更とみなすことによって行われる。 それ以降の代入は、最初に構築されたオブジェクトの修正とみなされる。 const/immutable フィールドの場合、初期化はコンストラクタ内で受け入れられる、 しかし、それ以降の変更は受け付けられない。例:

    class A
    {
        int a;
        immutable int b;
        this(int a, int b)
        {
            this.a = a;
            this.b = b;
    
            this.a = 7; // OK、aは変更可能
            this.b = 9; // エラー: 不変のフィールドbが複数回初期化された
        }
    }
    

    しかし、Bugzilla 18719 、このルールは、コンストラクタ・スコープ内で別のコンストラクタが呼び出されている場合には適用されないことがわかった。 コンストラクタ・スコープの中に別のコンストラクタへの呼び出しがある場合、このルールは適用されない:

    class A
    {
        immutable int a;
        this()
        {
            this(42);
            this.a = 5;  // 不変のフィールドの2回目の初期化
        }
    
        this(int a)
        {
            this.a = a;
        }
    }
    

    このパッチを適用する前、上記のコードは間違ってコンパイルされていた。 immutable aの二重初期化を受け入れていた。このリリースから、this.a = 5a が複数回初期化されるというエラーが発生する。

  5. 追加__traits(getLocation, symbol)

    シンボルを1つ引数に取る。引数が宣言されたファイル名、行番号、列番号に対応するエントリーを持つtuple(string, int, int) を返す。 を返す。

    オーバーロードの曖昧さをなくすには、getOverloadsの結果に希望するインデックスを付けてgetLocationに渡す:

    module m;
    int foo();
    int foo(int);
    enum loc = __traits(getLocation, __traits(getOverloads, m, "foo")[0]);
    
  6. 型が構造体またはクラスの場合、「read-modify-write」エラーを抑制する。

    共有型を持つ構造体またはクラスがopUnaryまたはopOpAssignを実装している場合、"read-modify-write "操作は可能である。 演算子を実装している場合、"read-modify-write "操作が可能である。 なぜなら、演算子の実装はアトミック操作を行うことになっているからである。

    この変更の目的は、アトミック演算を無音で実行するラッパーを(構造体やクラスを使って)作成できるようにすることである。 (構造体やクラスで)アトミック演算を静かに実行するためのラッパーの作成を可能にすることである:

    shared struct Atomic {
        int a;
    
        int opUnary(string s)() if (s == "++")
        {
            import core.atomic : atomicOp;
            return atomicOp!"+="(a, 1);
        }
    }
    
    Atomic atomicvar;
    atomicvar++; // 安全! アトミック構造体はopUnaryを実装する
    
  7. ポストブリットやデストラクターは、匿名組合のメンバーには呼ばれなくなった。

    dmdのバグにより、struct 宣言内の匿名unions のメンバは 型のオブジェクトがコピー/破棄されたときにポストブリット/デストラクタが呼び出された。 struct 型のオブジェクトがコピー/破棄されると、そのポストブリット/デストラクタが呼び出された。このリリースでは、ポストブリット/デストラクタ が呼び出されなくなった。

    修正: https://issues.dlang.org/show_bug.cgi?id=19122

ランタイムの変更

  1. core.atomic : msync 削除された

    2.061で非推奨となり、MemoryOrderが採用された。

  2. 結果を破棄しないcore.atomic.cas のオーバーロードを追加した。

    既存のcore.atomic.cas 関数は結果を破棄するため、特定の操作を実装することができない。 ifThis 、ポインタで受け取り、結果を引数に書き戻すオーバーロードの新しいセットが追加された。

  3. core.atomic.atomicExchange を追加した。

    アトミック・スイートに欠落していたcore.atomic.atomicExchange 関数を追加した。

  4. 非POSIXのCLOCK 列挙型メンバが削除された。core.sys.posix.time

    すなわち、CLOCK_MONOTONIC_RAWCLOCK_MONOTONIC_COARSE (linux)、 CLOCK_MONOTONIC_PRECISE CLOCK_MONOTONIC_FAST (FreeBSD、DragonflyBSD)、 およびCLOCK_MONOTONIC_COARSE (CRuntime_Glibc) から削除された。 これらは2.067で非推奨となった。 これらはそれぞれのプラットフォーム・モジュールで利用できる。

  5. druntimeオプションcallStructDtorsDuringGC は非推奨となった。

    このリリースから、callStructDtorsDuringGC ランタイム・オプションを使用すると、 に非推奨メッセージが出力される。 stderrこのオプションは将来のリリースで削除される予定である。

  6. core.sys.posix.dlfcn : dladdr, dlvsym, Dl_info 削除された

    これらはPOSIXではなくlinuxの拡張であるため、core.sys.linux.dlfcn 。 2.063以降、非推奨となっていた。

  7. core.exception:onHiddenFuncError / を削除する。HiddenFuncError

    これらは2.068以降非推奨となっている、 という言語機能に関連している。

  8. core.exception : setAssertHandler は削除された

    2.064で非推奨となり、assertHandler

  9. core.thread : Fiber.call(bool) は削除された

    これは2.068以降非推奨となり、Fiber.call(Rethrow.[Yes|No])

  10. モジュールcore.sys.linux.sys.netinet.tcp は削除された。

    このモジュールは2.077.0から非推奨となった。 core.sys.linux.netinet.tcp を代わりにインポートすべきである。

  11. core.runtime : Runtime.initialize, Runtime.terminate ExceptionHandler を取る関数は削除された。

    これらの関数は2.065から非推奨となり、rt_init C関数が使われるようになった、 Cコードからランタイムを初期化できるようになった。

  12. core.stdcpp.string を追加した。

    core.stdcpp.string を追加した。std::basic_string

    既知の問題:

    現在、GCC (libstdc++) の実装には、最新の__cxx11 ABIとの間に既知の問題がある。なぜなら、C++構造体にはDで不正な内部ポインタが含まれており、Dの移動セマンティクスと互換性がないからである。 linux/GCCでcore.stdcpp.string を使うには、-D_GLIBCXX_USE_CXX11_ABI=0g++ に、さらに-version=_GLIBCXX_USE_CXX98_ABI をDコンパイラに供給して、古い文字列ABIを使わなければならない。 Dムーブ・コンストラクタを定義する作業が進行中であり、それが実現すればこの問題は解決されるだろう。

  13. core.stdcpp.vector を追加した。

    core.stdcpp.vector を追加した。std::vector

ライブラリの変更

  1. std.array.AppenderとRefAppender: data()の代わりに.opSlice()を使う。

    これまでは、Appender.data() はAppenderの配列のスライスを抽出するために使われていた。 今は代わりに[]スライス演算子を使う。 RefAppenderも同様だ。

    std.array.Appender std.array.RefAppender

  2. ErrnoException.errnoがnothrowになった。

    以前は@systemだけだった。結局のところ、これは整数フィールドの値を返すだけだ。 だから、これらの属性をすべて持つことができる。

  3. Nullable alias get this は非推奨となった。

    Nullable'sの暗黙的に含まれる値に変換する機能は、非推奨とされた。

    Nullable!T が暗黙のうちにT に変換され、実行時にエラーを投げる可能性のあるすべてのサイト、 は、-de で非推奨の警告またはエラーを出すようになった。

    この問題を解決するには、.get を明示的に使用して、Nullable の含まれる値にアクセスする。

    alias get this は、Dにおいてエラーを投げる可能性のある唯一の暗黙的変換である。これは暗黙の変換である、 であるため,簡単に誤って使用され,予期しない実行時エラーにつながる可能性がある。明示的に 、 を明示的に呼び出すことで、開発者はその操作にエラーの可能性があることを認める。逆に、暗黙のうちに を に変換しないことで、コンパイラは開発者に、 のチェック忘れを発見するチャンスを与える。 getNullable!T T isNull

    この機能はリリース2.096以降削除される。

  4. std.file.getAvailableDiskSpace 機能を追加した。

    std.file.getAvailableDiskSpaceは、ファイルシステム内のファイルまたはディレクトリのパスをパラメータとして受け取り、マウントされたファイルシステム上の利用可能なディスク容量を返す。 ディレクトリのパスを受け取り、マウントされたファイルシステムで利用可能なディスク容量を返す。 与えられたパスが存在しない場合、例外がスローされる。

    import std.file;
    ulong size = getAvailableDiskSpace(".");
    assert(size > 0);
    
    import std.file;
    assertThrown(getAvailableDiskSpace("NonExistentFile"));
    
  5. std.jsonが末尾のカンマを見落とさないようにする

    JSONの文法は末尾のカンマを許容しないが、多くのJSONパーサーは許容する。 std.json現在では、末尾のカンマも無視される。この動作を無効にするには JSONOptions.strictParsingを使ってこの動作を無効にする。

    import std.json;
    import std.exception : assertThrown, assertNotThrown;
    
    // Before
    assertThrown(parseJSON(`{ "a" : { } , }`));
    
    // After
    assertNotThrown(parseJSON(`{ "a" : { } , }`));
    

インストーラの変更

  1. バンドルされている libcurl がDONT_USE_RECV_BEFORE_SEND_WORKAROUND

    バンドルされた libcurl は現在 DONT_USE_RECV_BEFORE_SEND_WORKAROUND.詳細は#399を参照のこと。

dubの変更点

  1. ルートパッケージレベルでのdubのグローバル設定ファイルのサポート

    dub設定ファイルをプロジェクトのルートフォルダにも追加できるようになった にも追加できるようになった。


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

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

  1. Bugzilla 20021: static if が評価されない。opCast(T : bool)
  2. Bugzilla 20057: ローカルテンプレートとインポートテンプレートが競合するとコンパイラがハングする。
  3. Bugzilla 20136: AAキーでopEqualsが認識されない。

DMDコンパイラのバグ

  1. Bugzilla 1142: .stringof が意味解析を行う
  2. Bugzilla 7443: 間違った静的コンストラクタの診断が改善された。
  3. Bugzilla 9884: モジュール static this() で const 配列の初期化を拒否する。
  4. Bugzilla 15795: 宣言の順序によって "conflicts with" エラーが発生する。
  5. Bugzilla 15818: 定義のない複数の"関数"宣言は、あいまいなオーバーロードエラーを引き起こす。
  6. Bugzilla 18719: フォワーディング・コンストラクタを使用している場合、メンバに対してコンストラクタが二重に呼び出される
  7. Bugzilla 18729: dmd -run が異なる環境で実行される。
  8. Bugzilla 19122: 無名共用体のメンバに対してポストブリットとデストラクタが呼び出される。
  9. Bugzilla 19315: トークン文字列内の#行が外部コードに影響する
  10. Bugzilla 19534: 間違ったエラーメッセージ "only one index allowed to index int"
  11. Bugzilla 19646: グローバルの初期化で@safeがチェックされない
  12. Bugzilla 19919: 最初のメンバがvoidとマークされていない共用体の初期化が正しくない。
  13. Bugzilla 19925: WithStatementでstatic opDispatchが考慮されない。
  14. Bugzilla 19931: ポストブリット、r値コンストラクタ、コピー・コンストラクタの定義時にエラー・メッセージが表示されない。
  15. Bugzilla 19968: safeコードによって無効なboolが作成され、メモリ破壊が発生する可能性がある。
  16. Bugzilla 20001: エラー:構造体は_error_の有効なイニシャライザではない。
  17. Bugzilla 20033: このエイリアスはdeprecated 属性をサポートしていない。
  18. Bugzilla 20047: 静的入れ子関数の呼び出しは純度を無視する。
  19. Bugzilla 20050: 純粋な関数は、純粋でない静的入れ子関数への関数ポインタを返すことができるべきである。
  20. Bugzilla 20073: 戻り値の暗黙の変換が間違っている。
  21. Bugzilla 20074: ヘッダーファイルの生成にCallExpの属性が含まれていない。
  22. Bugzilla 20096: エラーメッセージ「t cannot goto into try block」の後にseg faultが続く
  23. Bugzilla 20100: 構造体比較のcheckaction=contextでsegfaultが発生した。
  24. Bugzilla 20108: -dip1000 が auto に負ける
  25. Bugzilla 20113: パスに'~'が含まれている場合、ランタイム・ライブラリ・ファイル'object.d'のソース・コードが見つからない。

DMDコンパイラの機能強化

  1. Bugzilla 1252: インラインアセンブラがBasicTypeプロパティをサポートできるようになった。
  2. Bugzilla 18665: 文書化されていない "演算子オーバーロード"を非推奨とする。
  3. Bugzilla 19917: 共用体はすべてのメンバが= void で初期化されることを要求すべきである。
  4. Bugzilla 19969: 文字列に(誤って)追加しようとすると、役に立たないエラーが発生する
  5. Bugzilla 20000: safeコードでインターフェイスへのキャストを禁止する
  6. Bugzilla 20024: "Y型にプロパティxはありません"というエラーはあまり役に立たない。
  7. Bugzilla 20037: モジュール情報における "重要"は重複排除されるべきである。
  8. Bugzilla 20053: ミックスイン型を追加する。
  9. Bugzilla 20059: 関数の戻り値の型推論が不一致の場合、推論された型の場所を示すべきである。

phobosのバグ

  1. Bugzilla 19823: std.algorithm.iteration.filterのpopFrontが常に最初の要素をポップするとは限らない。
  2. Bugzilla 19980: File.byLineはmap!()の中で使われると、場合によっては最初の行をスキップする。
  3. Bugzilla 19986: std.Variant.VariantNに大きなconst Tを代入できない。
  4. Bugzilla 19987: std.VariantNはスペースを無駄にする
  5. Bugzilla 20064: フォーマットセパレータが先頭のゼロで失敗する
  6. Bugzilla 20097: SysTimeをstd.concurrency.sendで使用できない。
  7. Bugzilla 20129: object.dでFile値でのAA requireが"Error:return expression expected "となる。

phobosが機能強化した

  1. Bugzilla 16487: 利用可能なディスク容量を取得する関数を追加した。
  2. Bugzilla 19834: Windowsの[std.file.copy]のファイル例外がソースファイルではなくターゲットファイルを表示するようになった。
  3. Bugzilla 19979: std.regexはマッチしないキャプチャに対してゼロ長のスライスの代わりにnullを返すべきである
  4. Bugzilla 19983: std.internal.cstring.tempCStringにスライス代入による高速パスを追加した。
  5. Bugzilla 19994: 自己参照の代数型をネストできない
  6. Bugzilla 20069: std.formatの桁区切りセパレータ(別名、千区切りセパレータ)を見直す必要がある
  7. Bugzilla 20098: std.regexでコンパイルされたパターンの表示結果を改善する

Druntimeのバグ

  1. Bugzilla 20066: void[]のアサーションが-checkaction=contextでコンパイルされない。
  2. Bugzilla 20088: 新しい__ArrayCastテンプレートにより、BetterCでvoid[]キャストが使用できなくなった。

Druntimeの機能強化

  1. Bugzilla 19976: floatとdoubleのstd.internal.convert.toUbyteのCTFEパスを簡素化した。
  2. Bugzilla 20104: core.atomicは交換関数を持たない。
  3. Bugzilla 20122: core.atomic.casは失敗時に結果を破棄する。

dlang.orgのバグ

  1. Bugzilla 19402: shift expの昇格ルールの仕様が間違っている
  2. Bugzilla 19944: std.fileドキュメントページのいくつかの例でFileExceptionが発生する。

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

このリリースを可能にしてくれたすべての素晴らしい人々に心から感謝する。

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