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

変更ログ 2.086.0

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

Download D 2.086.0
2019年05月04日リリース

2.086.0は17の大きな変更と69の修正されたBugzillaの問題を含んでいる。 多大なる感謝を 51人の貢献者 に感謝する。

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

コンパイラの変更

  1. 集約宣言の内部で私的にインポートされたシンボルについて、非推奨をエラーにする。

    このリリースでは、DMDは、集約宣言のスコープで私的にインポートされたシンボルが、集約が定義されているモジュールの外部で集約のメンバーとして使用された場合にエラーを発行する。例:":

    // a.d
    class Foobar
    {
        int a;
        this(int a)
        {
            this.a = a;
        }
        static int smeth()
        {
            return 1;
        }
    }
    void fun() {}
    
    // b.d
    struct AST
    {
        import a;
    }
    
    // c.d
    void main()
    {
        import b;
        AST.Foobar t;        // 非推奨をトリガーしていたが、現在はエラーをトリガーする
        AST.Foobar.smeth();  // エラー
        AST.fun();           // エラー
    }
    
  2. 生成されたopEquals は、エイリアスされたこのメンバーよりも優先される。opEquals

    このパッチが適用される以前は、struct にエイリアスのthisメンバがあり、そのメンバが opEquals メソッドを定義するエイリアスされたthisメンバがあった場合、opEquals の方ではなく、エイリアスされたthis の方が優先されただろう。 struct が優先されていた:

    struct A
    {
        int a, b;
        bool opEquals(ref A rhs) const
        {
            return a == rhs.a && b == rhs.b;
        }
    }
    
    struct B
    {
        int n;
        A a;
        alias a this;
    }
    
    void main()
    {
        B a, b;
        assert(a == b);    // a.a.opEquals(b.a)に書き換えられた
    }
    

    コンパイラはメンバ単位の等価比較を行うstruct B 用のopEquals を生成するが ( )、このエイリアスは誤って優先されている。 等価比較 (==) を行うが、このエイリアスは誤って優先される。

    このパッチはこの問題を修正するもので、常に(コンパイラが生成したものであっても)定義されたopEquals 。 がコンパイラによって生成されたとしても)、このエイリアスの代わりに定義された。この このパッチを適用する前の動作が必要な場合は、明示的にopEquals

    参考文献 [1] https://issues.dlang.org/show_bug.cgi?id=16657 [2] https://github.com/dlang/dmd/pull/9289 [3] https://github.com/dlang/dlang.org/pull/2593

  3. コピーコンストラクタ

    このリリースで、D言語コンパイラは、このDIP [1]で広く説明されているコピーコンストラクタの全機能を実装している。 コピー・コンストラクタの全機能が実装されている。

    コピーコンストラクタは、struct インスタンスを初期化するために使われる。 struct インスタンスを初期化するために使われる。

    コンストラクタ宣言がコピーコンストラクタ宣言であるのは、次のような場合だけである。 宣言である場合に限り、コピーコンストラクタ宣言となる。 typeof(this) と同じ型であり、その後に任意の数のデフォルト・パラメータが続く:

    struct A
    {
        this(ref return scope A rhs) {}                        // コピーコンストラクタ
        this(ref return scope const A rhs, int b = 7) {}       // デフォルトのパラメータを持つコピーコンストラクタ
    }
    

    コピーコンストラクタは通常のコンストラクタとして型チェックされる。

    コピーコンストラクタが定義されている場合、暗黙の呼び出しが挿入される。 が挿入される:

    1. 変数が明示的に初期化される:
    2. struct A
      {
          this(ref return scope A rhs) {}
      }
      
      void main()
      {
          A a;
          A b = a; // コピーコンストラクタが呼び出される
      }
      
    3. パラメータが関数に値で渡されるとき:
    4. struct A
      {
          this(ref return scope A another) {}
      }
      
      void fun(A a) {}
      
      void main()
      {
          A a;
          fun(a);    // コピーコンストラクタが呼び出される
      }
      
    5. パラメータが関数から値で返され、Named Returned Value Optiomization(NRVO)が実行できない場合。 を実行できない:
    6. struct A
      {
          this(ref return scope A another) {}
      }
      
      A fun()
      {
          A a;
          return a;       // NRVO、コピーコンストラクタは呼ばれない
      }
      
      A a;
      A gun()
      {
          return a;       // NRVOを実行できないので、次のように書き換える: return (A __tmp; __tmp.copyCtor(a));
      }
      
      void main()
      {
          A a = fun();
          A b = gun();
      }
      

    struct 、コピーコンストラクタが定義されている場合、暗黙的なブリッティングはすべて無効になる。 コピーコンストラクタがstruct に対して定義されている場合、その ではすべての暗黙的なブリッティングが無効になる:

    struct A
    {
        int[] a;
        this(ref return scope A rhs) {}
    }
    
    void fun(immutable A) {}
    
    void main()
    {
        immutable A a;
        fun(a);          // エラー: コピーコンストラクタは、 (不変) 不変の型では呼び出すことができない
    }
    

    コピーコンストラクタは、パラメータ(修飾されたソースからのコピー)またはコピーコンストラクタに異なる修飾子を適用してオーバーロードすることができる。 コピーコンストラクタをオーバーロードすることができる。 そのものに適用する(修飾されたコピー先にコピーする):

    struct A
    {
        this(ref return scope A another) {}                        // 1 - コピー元が変更可能、コピー先が変更可能
        this(ref return scope immutable A another) {}              // 2 - ソースが不変、デスティネーションが変更可能
        this(ref return scope A another) immutable {}              // 3 - 変更可能なソース、不変なデスティネーション
        this(ref return scope immutable A another) immutable {}    // 4 - ソースが不変、デスティネーションが不変
    }
    
    void main()
    {
        A a;
        immutable A ia;
    
        A a2 = a;      // 1を呼び出す
        A a3 = ia;     // 2を呼び出す
        immutable A a4 = a;     // 3を呼び出す
        immutable A a5 = ia;    // 4を呼び出す
    }
    

    コピーコンストラクタのパラメータには、inout という修飾子をつけることができる。 をコピーコンストラクタのパラメータに適用することができる。これは、"mutable"、"const"、または"immutable "の型が同じように扱われることを指定するためである:

    struct A
    {
        this(ref return scope inout A rhs) immutable {}
    }
    
    void main()
    {
        A r1;
        const(A) r2;
        immutable(A) r3;
    
        // `inout`がワイルドカードのように機能するため、すべてが同じコピーコンストラクタを呼び出す
        immutable(A) a = r1;
        immutable(A) b = r2;
        immutable(A) c = r3;
    }
    

    コピーコンストラクタは、以下の条件をすべて満たせば、コンパイラによって暗黙的に生成される。struct S に対して暗黙的に生成される:

    1. S コピーコンストラクタを明示的に宣言していない;
    2. S コピーコンストラクタを持つ直接メンバを少なくとも1つ定義している。 そのメンバは( によって)他のメンバと重なっていない。union

    上記の制限を満たす場合、以下のコピーコンストラクタが生成される:

    this(ref return scope inout(S) src) inout
    {
        foreach (i, ref inout field; src.tupleof)
            this.tupleof[i] = field;
    }
    

    生成されたコピーコンストラクタが型チェックに失敗した場合、@disable

    union S 、コピー・コンストラクタを定義するフィールドがある場合、型のオブジェクトがコピーによって初期化されるたびにエラーが発生する。S 型のオブジェクトがコピーによって初期化されると、エラーが発生する。オーバーラップしたフィールド (匿名共用体)にも同じルールが適用される。

    コピーコンストラクタを定義するstruct は POD ではない。

    [1] https://github.com/dlang/DIPs/blob/master/DIPs/accepted/DIP1018.md

  4. HexStringリテラルは廃止された

    HexStringリテラルは廃止された。

    このリリース以前は、16進数文字列リテラルを使用すると非推奨の警告が表示されていた。 このリリースからはエラーとなる。

    代わりに std.conv.hexStringで代用する。

  5. インポートモジュールの選択的にインポートされたシンボルに対して、非推奨をエラーにする。

    このリリースでは、module A で私的に選択的にインポートされたシンボルが、module A を非選択的にインポートしているmodule B でアクセスされると、DMD はエラーを発行する。例:

    // a.d
    import fun : foo;
    
    // b.d
    import a;
    
    void main()
    {
        foo();     // これまでは非推奨; これからはエラーになる
    }
    

    上記のコードをコンパイルするためには、a.d のインポートをpublic にする必要がある。

  6. 関数リテラルを参照で返すことができるようになった。

    このリリース以前は、無名関数を使用して参照を返す関数を宣言する方法はなかった。
    (ポインターを返すことは可能だったが、言及する価値はない)。

    ここでは、この関数は値で返す:

    alias fn = () => a += 2;
    

    参照で返すためには、代入元となる名前付き関数を定義する必要があった:

    ref int func()        // `function`リテラルを模倣する静的関数または非静的ネスト関数、
    {                     // あるいは`delegate`リテラルを模倣する非静的ネスト関数である
        return a += 2;
    }
    alias fn = func;
    

    現在では、ref キーワードを使って、参照による復帰を示すことができる:

    function ref () { return x; }    // 省略記法の`=>`も存在する
    delegate ref () { return x; }
    ref () { return x; }
    

    例えば:

    int x = 1;
    alias add2 = ref () => x += 2;
    add2() += 7;    // l値としてのadd2
    assert(x == 10);
    
  7. 新しいコマンドラインオプション-lowmem 、コンパイラのメモリ要件を削減する。

    これは、コンパイラのガベージ・コレクタを有効にし、コンパイル時間を(場合によっては大幅に)少ないメモリ要件と交換する。

    例えば、DMDのテストツールd_do_test (dmd -c [-lowmem] test/tools/d_do_test.d)をコンパイルする場合、約75%少ないメモリー(~1,630MB->410MB)が必要だが、その代償として実行時間は~30%増加する(~4.8秒->6.3秒)。

  8. トレイトのプライベート・メンバー・アクセスを有効にする。

    以下のトレイトが非公開メンバーにアクセスできるようになった:

    • getMember
    • オーバーロードを取得する

    これは、allMembersトレイトがパブリックでないメンバーを正しく返すが、そのパブリックでないメンバーは他のトレイトからはアクセスできないという、Dにおける長年の問題を修正したものである。

    BugZilla issue15371を参照のこと。

ランタイムの変更

  1. 新しいモジュール core.sync.event

    このモジュールは、他のスレッドへの軽量なシグナリングのためのクロスプラットフォーム・インターフェイスを提供する。 複数の待機スレッドの実行を同時に開始するために使用できる。

ライブラリの変更

  1. の比較バグを修正した。std.algorithm.comparison.levenshteinDistance

    これまでのアルゴリズムは、最大範囲のサイズに等しいメモリ量を割り当てていた。 すなわちΟ(max(s.length, t.length))であった。 これを修正し、Ο(min(s.length, t.length))とした。 詳細は std.algorithm.comparison.levenshteinDistance.

  2. std.experimental.all に移動した。std

    std.experimental.all に移され、"phobos"の全モジュールが1回のインポートで使えるようになった。 をインポートできるようになった ( )。今回のリリースで、この に移動した。今後は convenience モジュールには でアクセスできる: import std.experimental.all; std import std;

    import std;
    void main()
    {
        5f.iota.map!exp2.sum; // 31
    }
    

    スクリプトや実験的なコードでは、標準ライブラリからのインポートリストが長く、頻繁に変更されることが多い。 を使うことが多い。

    このリリースでは、import std; 、標準ライブラリ全体を一度にインポートすることができる。 を使うことができる。これは高速なプロトタイピングやREPLに使える:

    import std;
    void main()
    {
        6.iota
          .filter!(a => a % 2) // 1 3 5
          .map!(a => a * 2) // 2 6 10
          .tee!writeln // 処理されたストリームを覗く
          .substitute(6, -6) // 2 -6 10
          .mean // (2 - 6 + 10) / 3
          .reverseArgs!writefln("Sum: %.2f"); // 2
    }
    

    以前と同様、シンボルの衝突は、衝突のあるシンボルが使用された場合にのみ発生する。 この場合、静的インポートまたは リネームされたインポートを使うことができる。 を使えば、特定のシンボルを一意に選択できる。

    のベースライン・コストは0.5秒未満である(システムによって異なる)。import std; のベースラインコストは0.5秒未満(システムによって異なる)である。 このオーバーヘッドをさらに削減するための作業が進行中である。

インストーラの変更

  1. 同梱の LLD リンカが 8.0.0 にアップグレードされた。

    Windows バイナリーにバンドルされている LLD リンカが 8.0.0 にアップグレードされた。

dubの変更

  1. カスタムのdub initのタイプをサポートする

    コマンド dub init が、引数-t に対してカスタムのdubのパッケージをサポートするようになった。

    > dub init -n myPackage --format sdl -t custom-dub-init-dubpackage -- --foo=bar
    

    以前のようにDub initが起動される。パッケージcustom-dub-init-dubpackage パッケージにはサブパッケージinit-exec 。 パッケージのスケルトンを作成する。追加の引数を渡すこともできる(例:-- --foo=bar )。

  2. DUBはWindowsのデフォルトとしてOPTLINKを使わなくなった。

    DMDのOPTLINKには多くの制限がある。基礎となるDigitalMarsランタイムの長年の問題は別として、 シンボルの最大数も制限されている。 ライブラリのほとんどがOPTLINKでコンパイルできない。これは多くのユーザーを悲しませ 多くのユーザーを悲しませ、苦しめ、新参者の体験に深刻な影響を与えた。

    今回のリリースで、dub はWindowsのデフォルトとしてOPTLINK を使わなくなった。 32ビットのWindowsシステムでは-m32mscoff (MSCOFF)を、64ビットのWindowsシステムでは-m64 (MSCOFF)を使用する。 Windowsを使用する。

    ユーザーは、dub--arch=x86 スイッチを使って、手動でdub にOPTLINKの使用を指示することができる:

    > dub --arch=x86
    

  3. dub run パッケージがローカルに見つからない場合、自動的にフェッチするようになった。

    このリリースから、dub run <mypackage> 、パッケージがローカルで利用可能であることを確認するようになった。 これは、dub fetch <mypackage> が不要になったことを意味し、ライブラリのユーザーがあなたのdubのパッケージを実行するのに必要なのは、dub run だけである:

    > dub run gitcompatibledubpackage
    gitcompatibledubpackage wasn't found locally, but it's available online:
    ‐--
    Description: Example of a DUB package also usable as git submodule. For DUB test suite.
    Version: 1.0.4
    ‐--
    Do you want to fetch gitcompatibledubpackage? [Y/n]:
    

    オプションの--yes (-y) フラグは、非インタラクティブなフェッチを確認するために用意されている:

    > dub run --yes gitcompatibledubpackage
    gitcompatibledubpackage wasn't found locally, but it's available online:
    ‐--
    Description: Example of a DUB package also usable as git submodule. For DUB test suite.
    Version: 1.0.4
    ‐--
    Fetching gitcompatibledubpackage 1.0.4...
    Building package gitcompatibledubpackage in /home/seb/.dub/packages/gitcompatibledubpackage-1.0.4/gitcompatibledubpackage/
    Performing "debug" build using dmd for x86_64.
    gitcompatibledubpackage 1.0.4: building configuration "exe"...
    Linking...
    Running ../../.dub/packages/gitcompatibledubpackage-1.0.4/gitcompatibledubpackage/gitcompatibledubpackage
    Hello DUB
    

    オプションの--non-interactive (-n) フラグは、オンライン・パッケージの検索をスキップするために用意されている:

    > dub run --non-interactive gitcompatibledubpackage
    Failed to find a package named 'gitcompatibledubpackage'.
    

    特定のバージョンのパッケージを実行したい場合は、dub run :

    > dub run gitcompatibledubpackage@1.0.3
    Fetching gitcompatibledubpackage 1.0.3...
    Building package gitcompatibledubpackage in /home/seb/.dub/packages/gitcompatibledubpackage-1.0.3/gitcompatibledubpackage/
    Performing "debug" build using dmd for x86_64.
    gitcompatibledubpackage 1.0.3: building configuration "exe"...
    Linking...
    Running ../../.dub/packages/gitcompatibledubpackage-1.0.3/gitcompatibledubpackage/gitcompatibledubpackage
    Hello DUB
    

  4. dub list-installed コマンドを削除する

    dub list-installed コマンドは2013年に廃止され、 に改名された。 list

  5. DUBは、アップグレードや依存関係の解決に単一のAPIリクエストを使用する。

    dub は、アップグレード/依存関係の解決に単一のAPIリクエストを使用するようになった。 詳細はpull #1366 を参照のこと。


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

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

  1. Bugzilla 17684: [REG 2.062]static alias this バグか不完全な実装か?
  2. Bugzilla 18810: root/ctfloatはバックエンドに依存する。
  3. Bugzilla 19519: コンパイル時に静的配列の長さを決定できない
  4. Bugzilla 19691: コンストラクタの struct パラメータのデフォルト値が NULL の場合、ICE になる。
  5. Bugzilla 19722: semantic3Errorsの不完全な実装により、コンパイラのアサートが失敗する。
  6. Bugzilla 19774: opIndexが原因で間違ったコードになる
  7. Bugzilla 19778: コンパイル時に空の配列にアクセスする際のICE
  8. Bugzilla 19782: alias this が配列の内部/エイリアスされた要素の代わりにnull を追加する
  9. Bugzilla 19804: 引数T[1]...のサイズを修正するとコンパイルに失敗する
  10. Bugzilla 19822: 2.086における共用体イニシャライザーのリグレッション。
  11. Bugzilla 19833: getMemberでテンプレートとしてのメンバを取得できない。
  12. Bugzilla 19840: Ice in e2ir.d visit(CastExp) assert(false, "このケースはセマンティックフェーズで__ArrayCast に書き換えるべきだった");

DMDコンパイラのバグ

  1. Bugzilla 5050: デリゲートをref returnで宣言する方法がない。
  2. Bugzilla 10806: 一度に複数のインターフェースの共分散も壊れる
  3. Bugzilla 11934: もしfront がreturnするのであれば、foreachref を許可する。ref
  4. Bugzilla 15875: 関数のパラメータで循環参照が検出されない場合。
  5. Bugzilla 17285: 配列リテラルで型が使用されている場合のセグメンテーションフォールト。
  6. Bugzilla 17289: Xcode 8.3 のリンカーで、"pointer not aligned" の警告が出る。
  7. Bugzilla 17290: 関数の戻り値の循環参照によるDMDのクラッシュ
  8. Bugzilla 17651: Ddoc ESCAPESマクロのパース時にSegfaultが発生する。
  9. Bugzilla 18573: cast(void)で浮動小数点戻り値がFPUスタックからポップされない。
  10. Bugzilla 19051: mingw リブの Set/GetWindowLongPtr 関数が未定義である。
  11. Bugzilla 19099: ポストブリットまたはデストラクタを持つフィールドを持つ構造体は、構造体を代入可能にする。
  12. Bugzilla 19442: 複数引数文字列ミックスインが文字リテラルをサポートしない。
  13. Bugzilla 19463: DIP1008 - _d_newThrowable の代わりに _d_newclass が呼び出される
  14. Bugzilla 19540: typeof(new class {}) をテンプレートパラメータのデフォルト値として使用する場合の ICE
  15. Bugzilla 19563: extern(C++) 小さな構造体を渡すABIが正しくない。
  16. Bugzilla 19569: オーバーロードの解決が正しくない?
  17. Bugzilla 19658: C++の列挙型がWindowsで他の整数型に対して間違っている。
  18. Bugzilla 19679: アドレスを取られた関数から呼び出された関数内で参照された変数が気付かれずにエスケープされる。
  19. Bugzilla 19688: [ICE] デフォルト関数の引数連結がDMDをクラッシュさせる。
  20. Bugzilla 19717: 未検出の前方参照によるセグメンテーションフォールトのケース
  21. Bugzilla 19719: mixinを使った文字列ミックスインのデバッグがうまくいかない。
  22. Bugzilla 19731: アドレスが取られたauto構造体メソッドが不変量をテストしない。
  23. Bugzilla 19734: isDatasegは非静的宣言に対してtrueを返す
  24. Bugzilla 19735: エラー:変数の外部シンボルはイニシャライザを持つことができない
  25. Bugzilla 19744: 非メンバー関数にアノテーションを付けるとエラーメッセージが紛らわしい。return
  26. Bugzilla 19747: スコープ(exit)内のコードのデバッグ行情報がない。
  27. Bugzilla 19775: 複数引数文字列ミックスインがタプルを展開しない。
  28. Bugzilla 19797: File.seek()が-m32mscoffと-m64の不正なオリジンで不正に終了する

DMDコンパイラの機能強化

  1. Bugzilla 8065: refTを返す関数/デリゲート・リテラルを書く方法がない。
  2. Bugzilla 12330: を返す関数を書く方法がない。
  3. Bugzilla 15361: 不可解なエラーメッセージ:戻り値の型がない関数宣言。
  4. Bugzilla 15371: __traits(getMember)は保護をバイパスすべきである。
  5. Bugzilla 16271: ラムダが参照で返すことを表現できるようにすべきである。
  6. Bugzilla 16657: これは生成されるopCmpやopEqualsと相互作用する。
  7. Bugzilla 18825: 参照を返す関数リテラルの構文がない。
  8. Bugzilla 19441: これは部分代入を引き起こす
  9. Bugzilla 19809: override ブロックはラムダを引数として渡すことに影響する。

phobosのリグレッション

  1. Bugzilla 19777: [REG2.086a] SortedRange.opSliceが誤っている。@trusted

phobosのバグ

  1. Bugzilla 18728: std.math.fdimがnanを正しく扱わない
  2. Bugzilla 19042: padRight された範囲をチャンクすると範囲違反になる
  3. Bugzilla 19151: std.utf.toUTF16z()がLPWSTRに使用できない
  4. Bugzilla 19681: std.range.padRight.popFrontが正しく長さを調整しない
  5. Bugzilla 19689: 大きな型は移動できない。
  6. Bugzilla 19751: std.stdio.Fileがエラー後にfcloseを再試行しない
  7. Bugzilla 19799: テンプレート化された文字列のフォーマットがconst Nullable!stringで失敗する
  8. Bugzilla 19806: phobos/std/uri.d: ietf link が古い。

phobosの機能強化

  1. Bugzilla 15853: std.random 保存メソッドは const でなければならない。
  2. Bugzilla 18806: minIndexは入力範囲を取れるようにすべきだが、そうではない
  3. Bugzilla 19412: デフォルトの順序を持つstd.algorithm.cmpは(char型だけでなく)全てのサイズ1の符号なし型に対してmemcmpを使うことができる。
  4. Bugzilla 19686: sgnは貪欲すぎる

Druntimeのリグレッション

  1. Bugzilla 18530: [Reg 2.079] src/rt/tracegc.d(43):非推奨:deleteキーワードは非推奨となった。
  2. Bugzilla 19796: druntime PR#1982 で、double[]での配列操作が、要素型が整数であるという誤った仮定により壊れていた。

druntimeのバグ

  1. Bugzilla 19810: destructorを持たないC++クラスではdestroyが機能しない。
  2. Bugzilla 19830: core.memory.__deleteが構造体の配列を間違った順序でデストラクトする。

dlang.orgのバグ

  1. Bugzilla 11161: デフォルトの構造体の等式比較と演算子オーバーロードをドキュメント化した。
  2. Bugzilla 19621: 仕様が不変性に関して自己矛盾している

インストーラのリグレッション

  1. Bugzilla 18522: [REG 2.079-b2] MinGWインポートライブラリがプラットフォームSDKと干渉する

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

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

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