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

変更ログ 2.078.0

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

Download D 2.078.0
2018年01月01日リリース


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

コンパイラの変更

  1. opDispatch with 文の解決

    opDispatch 言語仕様の既存のスコープ解決ルールに準拠するために、 文の解決が変更された。 言語仕様のwith WithStatementを参照のこと。

    このリリース以前は、Barf() またはopDispatch を実装していないため、f() への2回目の呼び出しをコンパイラが解決できず、以下のコードはコンパイルできなかった。

    import std.stdio;
    
    struct Foo
    {
        void opDispatch(string name)()
        {
            mixin("writeln(\"Foo.opDispatch!" ~ name ~ "\");");
        }
    }
    
    struct Bar
    {
        // `Bar`は`f()`または`opDispatch`実装していない
    }
    
    void main()
    {
        Foo foo;
        Bar bar;
    
        with(foo)
        {
            f();       // "Foo.opDispatch!f"を表示する
            with(bar)
            {
                f();   // このリリース以前は: Error: undefined identifer `f`
                       // このリリースから: "Foo.opDispatch!f"と表示する。
                       // `f`の解決はスコープ階層上に転送されます
            }
        }
    }
    

    今回のリリースから、f() への2回目の呼び出しは、Foo.opDispatch の実装に合わせて、スコープ階層上に転送されるようになった。

  2. DIP1003に従って、body の代わりにdo を使用してヘッダーファイルを生成する。

    サポート DIP1003 のサポートがリリース2.075.0で追加された。body エラーメッセージと の使用が修正された。

  3. pragma(crt_constructor)とpragma(crt_destructor)が追加された。

    これにより、プログラムは初期化コードを C のメイン・コードに追加された。

    特にこれらのプラグマは、-betterC のコードで、次のような代用として使うことができる。 および shared static this()そして shared static ~this().

    注釈:druntime実行時には初期化されていない。

    注釈:コンストラクターの実行順序は不定である。

    import core.stdc.stdio;
    
    pragma(crt_constructor)
    void init()
    {
        puts("init");
    }
    
    pragma(crt_destructor)
    void fini()
    {
        puts("fini");
    }
    
    extern(C) int main()
    {
        puts("main");
    }
    
  4. 異なる型を指すポインタの減算は非推奨となった。

    言語仕様にはこうある: "両方のオペランドがポインターで、演算子が-である場合、ポインターは減算され、結果はオペランドが指す型のサイズで除算される。ポインタが異なる型を指している場合はエラーである。"

    このリリース以前は、コンパイラーは以下のようなポインター演算を許可していた:

    void* p1;
    int* p2;
    auto p3 = p2 - p1;
    

    このリリースから、異なる型を指すポインタの減算は非推奨の警告を発するようになった。 この警告は少なくとも1年間は表示され、その後はエラーに変更される。

  5. 可変長のテンプレート引数はalias を必要としなくなった。

    このリリース以前は、以下のコードはコンパイルできなかった。

    class C(Types...)
    {
        void apply(U)(U delegate(Types[0]) f0) { }  // エラー: 引数の型から関数を推測できない
    }
    
    void test()
    {
        C!int c;
    
        int f(int) { return 0; }
    
        c.apply(&f);
    }
    

    この問題は、alias、個々のテンプレート引数で回避することができる。

    class C(Types...)
    {
        alias Types[0] T0;
        void apply(U)(U delegate(T0) f0) { }  // OK
    }
    

    このリリースから、この回避策は必要なくなった。

  6. fix 問題 16997 - 単項演算子 + - ~ の積分昇格ルールが守られていなかった。

    Cの積分昇格ルールに従うため、単項演算子 + - または ~ 演算子が適用される前に、型はint に昇格される。 に昇格される。既存のDではこれが行われない。

    これは、以下のコマンドラインスイッチのいずれかを使用すると修正される:

    -transition=intpromote -トランジション=16997

    これは、byteubyteshortushortcharwchar 型のオペランドに影響する。 オペランドは、演算子が適用される前にint に昇格される。その結果 型はint となる。

    計算される値は、オペランドの値によって異なる:

    • ubyte、ushort、char、dchar オペランドに適用される - と ~ の値はすべて変化する。

    • -byte(-128)-short(-32768) の値が変更される。

    transition='スイッチのいずれかが指定されていない場合、これらの操作に対して非推奨の警告が発せられる。 deprecationを修正し、'-transition='スイッチの有無にかかわらず希望どおりに動作させるには、次のようにする:

    オプション1:

    op b 、正しい、つまりCのような動作を使うようにop int(b)

    オプション2:

    op btypeof(b)(op int(b)) に書き換え、古い動作を維持する。

    非推奨になれば、これはエラーとなり、Cのような動作がデフォルトとなる。

  7. オプションModuleInfo

    ModuleInfoプログラム作成者が、ModuleInfo を含まないDランタイムの代替実装を提供することを選択するユースケースがある。 これは、他のソフトウェアとの相互運用性や、リソースに制約のあるプラットフォームでDプログラムのフットプリントを削減するためである。

    このリリース以前は、ModuleInfo がDランタイムで宣言されていないと、コンパイラーはエラーを発していた。

    プラットフォームのサポートはDランタイムによって提供される。ModuleInfo はobject.dで宣言されている。したがって、コンパイラーはコンパイル時に、プラットフォームがModuleInfo をサポートしているかどうかを確認し、それに応じてオブジェクト・コードを生成することができる。

    今回のリリースから、ModuleInfo がDランタイムで宣言されていない場合、コンパイラーは単純にModuleInfo インスタンスを生成しない。

    これにより、Dを新しいプラットフォームに漸進的に移植し、より従量制の方式でDを使いたい人の摩擦が減るはずだ。

  8. RAIIと-betterCモードのtry-finallyサポートを追加した。

    これは、scope(exit)文も動作することを意味する。 なぜなら、それらは内部的に try-finally 文に格下げされるからである。

    これは、例外がサポートされているという意味ではない。スローする、 キャッチやスタックフレームの巻き戻しはサポートされていない。 のサポートが必要だからである。

    つまり、RAIIでは、変数がレキシカル・スコープから外れると、そのデストラクタが実行される。 デストラクタが実行される。try-finally文のtryブロックが終了すると、finallyブロック内のコードが実行される。 が終了すると、finallyブロック内のコードが実行される。

  9. Windows: dmdがVisual Studioのインストールパスを検出できるようになった。

    dmdは、"Command Line prompt for Visual Studio "リンクを使用してコンソールウィンドウを開いた場合(またはvcvarsall.batを実行した場合)に通常設定される環境変数を判断するようになった。これには、Windows SDK ディレクトリと Visual C ライブラリ・ディレクトリが含まれる。m64または-m32mscoffでコンパイルする場合、インストーラーによってVisual Studioのバージョンが事前に選択されていなくても、dmdがリンカーを起動できるようになる。

    特に、変数 WindowsSdkDir, WindowsSdkVersion, UniversalCRTSdkDir、 UCRTVersion、VSINSTALLDIR、VisualStudioVersion、VCINSTALLDIR、およびVCTOOLSINSTALLDIRは、環境またはsc.iniで設定されていない場合、レジストリから決定される。 環境またはsc.iniで設定されていない場合は、レジストリから決定される。

    サポートされるWindows SDKの範囲は7.0Aから10.xまでで、サポートされるVisual Studioのバージョンは以下の通りである。 VS 2008からVS 2017まで。複数のバージョンがインストールされている場合は、最も高いバージョンが優先される。

ランタイムの変更

  1. core.runtime unittestをより細かく制御できるようになった。

    core.runtime.extendedModuleUnitTester プロパティで、実行されたテストとその結果の処理方法に関する情報を指定できる。 を指定できるようになった。詳細は のドキュメントを参照のこと。 core.runtime.UnitTestResult

    core.runtime.moduleUnitTester (boolを返すunittestハンドラを設定する)。 は、レガシープロジェクトでは引き続きサポートされる。

    import core.runtime;
    import core.stdc.stdio: printf;
    
    UnitTestResult customTester()
    {
        UnitTestResult ret;
    
        // 自分のパッケージのテストだけを実行する
        immutable prefix = "myPackage.";
        foreach (m; ModuleInfo)
        {
            if (m.unitTest !is null && m.name.length >= prefix.length &&
                  m.name[0 .. prefix.length] == prefix)
            {
                ++ret.executed; // 実行したユニットテストを数える
                try
                {
                    m.unitTest();
                    ++ret.passed; // 通過したユニットテストを数える
                }
                catch(Throwable t)
                {
                    auto msg = t.toString();
                    printf("%.*s\n", cast(uint)msg.length, msg.ptr);
                }
            }
        }
        // 常にまとめる
        ret.summarize = true;
        // ユニットテストのみ実行し、メインテストは実行しない
        ret.runMain = false;
    }
    
    version(unittest) static shared this()
    {
        Runtime.extendedModuleUnitTester = &customTester;
    }
    
  2. ランタイムは、カバレッジ・レポートの作成方法をカスタマイズするための新しいオプションをいくつか学んだ。

    フォーマットはGCと同じだが、covopt を接尾辞として使う。 のようにスペースで区切ってオプションを渡すことができる。 dstpath:/tmp"`.

    これらは現在使用可能なオプションである:

    マージ
    1の場合、現在の実行を既存のレポートとマージし、0の場合、既存のレポートを上書きする。
    srcpath
    ソース・ファイルが置かれているパスを設定する。
    dstpath
    リスト・ファイルが書き込まれる場所へのパスを設定する。

ライブラリの変更

  1. mean に追加されたstd.algorithm

    std.algorithm.iteration.meanを正確に求める を正確に求める。

    import std.algorithm.iteration : mean;
    import std.math : approxEqual;
    
    int[] arr1 = [1, 2, 3];
    real[] arr2 = [1.5, 2.5, 12.5];
    
    assert(arr1.mean.approxEqual(2));
    assert(arr2.mean.approxEqual(5.5));
    
    // ユーザー定義の数値型も使える
    import std.bigint : BigInt;
    
    auto bigint_arr = [
        BigInt("1_000_000_000_000_000_000"),
        BigInt("2_000_000_000_000_000_000"),
        BigInt("3_000_000_000_000_000_000"),
        BigInt("6_000_000_000_000_000_000")
    ];
    auto seed = BigInt(0);
    assert(bigint_arr.mean(seed) == BigInt("3_000_000_000_000_000_000"));
    
  2. findSkip 述語関数のみで要素をスキップできるようになった。

    以前は std.algorithm.searching.findSkipは だけだった。新しいオーバーロードでは がtrue を返す場合、その範囲の要素はスキップされる:

    import std.ascii : isWhite;
    string s = "   abc";
    assert(findSkip!isWhite(s) == 3 && s == "abc");
    assert(!findSkip!isWhite(s) && s == "abc");
    
  3. std.array.byPair を返すようになった。NamedTuple

    std.array.byPairは名前付きタプルを返すようになった。

    import std.array : byPair;
    import std.typecons : Tuple;
    
    int[string] dict = ["b": 2, "c": 3];
    auto pairs = dict.byPair;
    static assert(is(typeof(pairs.front) : Tuple!(string,int)));
    
    // インデックスによるアクセス(既存の方法)
    assert(pairs.front[0] == "b");
    assert(pairs.front[1] == 2);
    
    // 名前によるアクセス(このリリースで有効e)
    assert(pairs.front.key == "b");
    assert(pairs.front.value == 2);
    
  4. std.container.dlist サポートlinearRemoveElement

    linearRemoveElement dlistから最初に出現した要素を削除する。

    import std.container : Dlist;
    import std.algorithm.comparison : equal;
    
    auto a = DList!int(-1, 1, 2, 1, 3, 4);
    a.linearRemoveElement(1);
    assert(equal(a[], [-1, 2, 1, 3, 4]));
    
  5. std.container.slist サポートlinearRemoveElement

    linearRemoveElement 最初に出現した要素をリストから削除する。

    import std.container : Slist;
    import std.algorithm.comparison : equal;
    
    auto a = SList!int(-1, 1, 2, 1, 3, 4);
    a.linearRemoveElement(1);
    assert(equal(a[], [-1, 2, 1, 3, 4]));
    
  6. save を廃止する。std.range.package.Transposed

    Transposedは前方範囲として誤ってマークされている。そのpopFront プリミティブ は、save で作成された他のコピーに影響を与えることなく使用することはできない。save は2018年11月にTransposedから削除される。 2018年11月にTransposedから削除される。

    auto x = [[1,2,3],[4,5,6]].transposed;
    auto y = x.save;
    y.popFront;
    assert(x.equal([[1,4],[2,5],[3,6]])); // 失敗、xは本当は[[2,5],[3,6]]
    

    詳細については、それぞれのBugzilla issueを参照のこと。

  7. std.typecons.Ternary.opBinary bool ビット演算子をサポートした。

    これで std.typecons.Ternaryboolを使ったビット演算ができるようになった:

    import std.typecons : Ternary;
    
    Ternary a = Ternary(true);
    assert(a == Ternary.yes);
    assert((a & false) == Ternary.no);
    assert((a | false) == Ternary.yes);
    assert((a ^ true) == Ternary.no);
    assert((a ^ false) == Ternary.yes);
    

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

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

  1. Bugzilla 17246: [REG2.053] 余分なデストラクタ呼び出し。
  2. Bugzilla 17371: [REG 2.074.0] 無名クラスでdi生成が壊れる。
  3. Bugzilla 17559: [REG2.073.0] スタックトレースの行番号が正しくない。
  4. Bugzilla 17915: [REG 2.073] core.exception.AssertError@ddmd/optimize.d(614):アサーション失敗
  5. Bugzilla 17955: DsymbolSemanticVisitor::visit(UnittestDeclaration*) でコンパイラのセグメンテーションエラーが発生した。
  6. Bugzilla 18020: [Reg 2.078] anonクラスのプロパティopCmpがない。
  7. Bugzilla 18093: [Reg 2.071] MSCOFF: mixinテンプレートでC++メソッドをオーバーライドするとdmdがクラッシュする。
  8. Bugzilla 18141: [REG2.078a] dmd -v がpredefsを表示しなくなった。

DMDコンパイラのバグ

  1. Bugzilla 5332: 長さ0の配列への未定義の参照
  2. Bugzilla 6400: WithStatementを使ったopDispatch
  3. Bugzilla 8262: ICE(mtype.c)はこれを式タプルのエイリアスにする。
  4. Bugzilla 9290: 静的配列の代入で不変構造体を変更する機能
  5. Bugzilla 10310: ビット単位の&|^のVRPは必ずしも最も厳しい境界を生成しない。
  6. Bugzilla 11006: void 、非ボイド型に対するポインタの減算がコンパイルされる。
  7. Bugzilla 12385: 列挙型メンバが不変である場合、メンバは変更可能であってはならない。
  8. Bugzilla 12496: traits(parent,x)は不正な型を返す。
  9. Bugzilla 12625: [スコープ] [DIP1000] RValue静的配列の暗黙のスライスは不正であるべきである。
  10. Bugzilla 15094: ソースが構造体/クラスフィールドの場合、"__traits(getMember)" は失敗する。
  11. Bugzilla 15243: "可変長"は拒否される
  12. Bugzilla 15289: VRPが除算で期待通りに動作しない
  13. Bugzilla 15290: キーが重複する連想配列リテラルの長さが間違っている
  14. Bugzilla 16649: ヘッダ生成で括弧がスキップされる
  15. Bugzilla 16694: export 関数のアドレスを取る際の ICE(宣言専用)。
  16. Bugzilla 16997: 単項式 + - ~ 式の積分昇格ルールが守られていない。
  17. Bugzilla 17096: 多くのトレイトが無効なパラメータカウントをエラーなしで受け付ける。
  18. Bugzilla 17167: dmdがパスに248文字以上の文字を含むファイルへの書き込みやディレクトリの作成に失敗する
  19. Bugzilla 17382: void main(){}pragma(msg,main()); crashes DMD
  20. Bugzilla 17585: 非推奨オーバーライドのエラーメッセージが正しくない
  21. Bugzilla 17586: 非推奨の基底クラス関数をオーバーライドすると警告が表示されない。
  22. Bugzilla 17842: [スコープ] 配列の追加で参照をエスケープできるようになった
  23. Bugzilla 17843: double フィールドを持つ -betterC 構造体は TypeInfo への参照を生成する。
  24. Bugzilla 17853: 中括弧のないSwitch文は1つのケースでしか機能しない
  25. Bugzilla 17900: FreeBSD 10.3 runnable/cpp_abi_tests.d(94):アサーション失敗 (テストスイート)
  26. Bugzilla 17908: 無効化された関数でオーバーロードセットのエイリアスを作成できない。
  27. Bugzilla 17927: [スコープ]scope inout パラメータ値は return でエスケープできる。
  28. Bugzilla 17934: [スコープ] ユニーク/リフカウントのエントリーポイントが見つからない。
  29. Bugzilla 17935: [scope] 自動生成されるデストラクタはスコープを意識していない
  30. Bugzilla 17940: 構造体からロードされたbool関数のパラメータが-Oでコンパイルミスすることがある。
  31. Bugzilla 17944: MSCOFF: デバッグ情報がLLVMのLLDと互換性がない。
  32. Bugzilla 17947: C++ の std::pair::swap が不正にマングルされる
  33. Bugzilla 17976: core.exception.AssertError@ddmd/dsymbolsem.d(1624)
  34. Bugzilla 17997: autotesterのd_do_testがWin32で変な失敗をする
  35. Bugzilla 18013: test_cdvecfill.d で DMD テストスイートのアサーションに失敗する
  36. Bugzilla 18014: PIC/PIEが強制されているLinuxディストロでDMDテストスイートがリンクに失敗する
  37. Bugzilla 18045: 比較中に作成された一時的なファイルが破棄されない
  38. Bugzilla 18099: "BetterC"チェックで文エラーがスローされる!

DMDコンパイラの機能強化

  1. Bugzilla 4946: エラーメッセージの 'const' の位置が正しくない。
  2. Bugzilla 17256: jsonとddocの出力に一貫性がない。
  3. Bugzilla 17868: プラグマ(crt_con/destructor)を追加した。
  4. Bugzilla 17878: traits(isFuture,...)を追加した。
  5. Bugzilla 18076: dmd -runは- (stdin)でも動作するはずだ。

phobosのリグレッション

  1. Bugzilla 17962: dirEntries が Unicode ファイル名を切り詰めるようになった。
  2. Bugzilla 17986: std/experimental/allocator/common.d(445) での異常な失敗 : - unittest の失敗。
  3. Bugzilla 18084: [REG2.072] tempCString のバッファサイズが unittest-versioned になっている。

phobos のバグである

  1. Bugzilla 2447: std.signalsにdisconnectallがない
  2. Bugzilla 6820: etc.c.curl constが見つからない
  3. Bugzilla 6895: std.trait.isCovariantWithが関数、関数ポインタ、デリゲートに対して機能しない。
  4. Bugzilla 9661: LockingTextWriterはファイルハンドルの参照カウントをインクリメントすべきである。
  5. Bugzilla 10395: [std.stdio] 未読の出力がある Popened File を閉じると例外がスローされる
  6. Bugzilla 12064: std.typecons.wrapはNVIを扱わない
  7. Bugzilla 14477: デフォルトコンストラクタが無効な構造体では"@disable"が機能しない
  8. Bugzilla 15140: std.experimental.allocator.building_blocks.free_list.FreeListがメモリをリークする
  9. Bugzilla 15637: リージョンアロケータが最後のアロケーションを展開する際にアサートが失敗する
  10. Bugzilla 16253: BitmappedBlockアロケータがchooseAtRuntimeで動作しない。
  11. Bugzilla 16542: makeArrayがconstイニシャライザで使えない。
  12. Bugzilla 16564: KRRegion.emptyがTernary.noを返すことがある。
  13. Bugzilla 17459: format("%012,3d", ...) がフィールド幅とゼロパディングを正しく扱わない
  14. Bugzilla 17467: BitArray は <<= 64 で壊れてしまう
  15. Bugzilla 17730: [scope][dip1000] std.algorithm.moveが"@safe"コードでscope変数をエスケープしてしまう
  16. Bugzilla 17901: FreeBSD 10.3: AssertError@std/experimental/allocator/building_blocks/region.d(652)
  17. Bugzilla 17995: template NoDuplicates(TList...) のバグ。
  18. Bugzilla 18044: 暗黙的に変換可能な連想配列のための std.conv.to
  19. Bugzilla 18047: std.formatのvalue.lengthがセパレータのステップ幅をモジュロすると間違った長さになる
  20. Bugzilla 18092: takeとtakeExactlyの組み合わせができない。
  21. Bugzilla 18135: [REG2.078] RegexMatchに結合できなくなった

phobosの機能強化

  1. Bugzilla 1998: std.bitarray に setAll / opSliceAssign(bool) などを追加した。
  2. Bugzilla 4717: std.bitmanip.BitArrayの変更点
  3. Bugzilla 4763: std.stdio.File.open()をより効率的に実装した。
  4. Bugzilla 6244: std.mathにpowmod / modpow関数を追加した。
  5. Bugzilla 9362: std.container.SListに項目を1つ削除するメソッドを追加した。
  6. Bugzilla 13532: std.regexのパフォーマンス (列挙型; regex vs ctRegex)
  7. Bugzilla 14034: std.algorithm.mean
  8. Bugzilla 16398: 実験的なアロケータ、Posix用の整列再割り当てを追加した。
  9. Bugzilla 17742: std.range.transposedはopIndexを持たない。
  10. Bugzilla 17905: byCodeUnitは基礎となる範囲にアクセスできるようにすべきである。
  11. Bugzilla 17919: std.container.ArrayはpureMallocを使うことができる。
  12. Bugzilla 17952: std.range.transposedの保存は無効である。
  13. Bugzilla 18021: FileLogger メンバがサブクラスにアクセスできない

Druntimeのリグレッション

  1. Bugzilla 17914: [Reg 2.075] Fibersガードページがより多くのメモリマッピングを使用する
  2. Bugzilla 18071: [REG2.078] byKey、byValue、byKeyValueが安全でないコードの穴になる

Druntimeのバグ

  1. Bugzilla 17108: 連想配列 byKeyValue は安全ではない
  2. Bugzilla 17851: htonl は phobos64.lib で既に定義されている。
  3. Bugzilla 17956: core.memory の unittest の失敗 (glibc 2.26 固有の可能性)

Druntime の機能強化

  1. Bugzilla 17300: コマンドラインでコード・カバレッジ・オプションを設定できるようにした。

dlang.orgのバグ

  1. Bugzilla 18033: エディターで開くボタンが動作しない

dlang.orgの機能強化

  1. Bugzilla 16392: win32.makを落とす
  2. Bugzilla 17265: WithStatement:"with"が実際に何をするのか、より良い"例"を見つける。
  3. Bugzilla 17527: dlangspec.pdf: エスケープシーケンスの表がページ境界を越えてしまう。
  4. Bugzilla 17529: dlangspec.pdf: 文法定義が右マージンからはみ出る
  5. Bugzilla 17531: dlangspec.pdf: 単項演算子をオーバーロードするとLaTeXが露呈してしまう。
  6. Bugzilla 17534: dlangspec.pdf: 25.24: getFunctionVariadicStyleのテーブルがページマージンをオーバーしてHTMLを使用している。
  7. Bugzilla 17535: dlangspec.pdf: 全てのコード例で最大幅を強制する。
  8. Bugzilla 17536: dlangspec.pdf:UnittestsのドキュメントはHTMLを使用する。
  9. Bugzilla 17538: dlangspec.pdf: UnittestsのドキュメントはHTMLを使う: 33.14 D ImmutableとConstをC++と比較する Constはページマージンを超える
  10. Bugzilla 17723: トップページのFacebookをWeka.ioに置き換える
  11. Bugzilla 17925: ["契約プログラミング"である。]
  12. Bugzilla 17993: 404 Not Found: "phobos/ddmd_utf.html" : [コントラクト・プログラミング] : 404 Not Found: "phobos/ddmd_utf.html
  13. Bugzilla 18032: [ホーム] 表示16進ダンプ例: 実行されない
  14. Bugzilla 18067: ベンチマーク例がフロントページで壊れている。
  15. Bugzilla 18081: dlangspec.pdf: コード例でドルをエスケープしない。
  16. Bugzilla 18082: Ubuntu/Debian リポジトリのインストールはdubについて言及すべきである。

ツールのバグ

  1. Bugzilla 7997: Optlink、長さ0の静的配列で「Index Range」エラーを起こす

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

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

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