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

変更ログ 2.097.0

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

Download D 2.097.0
リリース 2021年06月03日

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

dubの変更

  1. dub設定ファイルに低メモリコンパイルオプションのサポートを追加した。

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

コンパイラの変更

  1. あいまいな3項式の非推奨期間が終了した。

    Dでは、三項演算子(?:)は代入演算子( )よりも優先順位が高い。 =よりも優先される:

    true ? stt = "AA" : stt = "BB"
    

    という意味である:

    (true ? (stt = "AA") : stt) = "BB",
    

    これはC言語や他の多くの言語(C++を除く)と同じである、 これはC言語や他の多くの言語(C++を除く)と一致しているが、多くの人にとっては驚きである。 三項と代入の組み合わせは、v2.082.0(2018-09-01)で非推奨となった。

    この非推奨は、括弧を使って意図を明示するようユーザーに指示している。 を使うように指示している:

    true ? (stt = "AA") : (stt = "BB")
    

    この非推奨期間は終了し、コンパイラーは曖昧なコードに対してエラーを出すようになった。 エラーを出すようになった。

  2. body キーワードの使用は非推奨となった。

    body 、関数またはメソッドの本体を示すために使用する。 キーワードの使用は非推奨となった。 bodydo に置き換えることができる。 この置き換えはDIP1003で導入された、 はDMD v2.075.0(2017年7月)から利用できる。

  3. インポートをバイパスするために完全修飾名を使用するケースを非推奨とする。

    v2.084以降、完全修飾名を使用してプライベートインポートをバイパスすることはできなくなった、 これはv2.071で非推奨となったが、完全修飾名を "型"(式)として使用した場合 (対式)として使用された場合、コードは警告なしに受け入れられる。

    このリリースから、コンパイラーは以前の省略されたケースを適切に非推奨とするようになった。

    この問題は、次の例で説明するのが一番わかりやすいだろう:

    import std.algorithm;
    
    // v2.071で非推奨、v2.084でエラー
    auto a = std.range.Take!(int[]); // エラー: パッケージ`std`で未定義の識別子`range`...
    
    // 現在は非推奨。v2.106からはエラーとなる
    std.range.Take!(int[]) s;
    
    
  4. 明示的なパッケージの可視性属性が常に新しいスコープに適用されるようになった。

    制限の緩いパッケージ属性が別の のスコープ内に現れた場合、より制限の厳しい親パッケージが、明示的な 子の可視性を上書きする。

    例":

    module pkg.foo;
    
    package(pkg.foo):           // "private"またはプレーンな"package"に似ている
    
    package(pkg) int bar();     // package(pkg)が無視されていた
    

    このバージョンから、パッケージのvisibility属性は、有効である限り常に適用されるようになった。 が有効である限り適用されるようになった。 この例では、 パッケージのどのモジュールでも、シンボル をインポートして使用することができる。 pkg をインポートし、シンボルbar を使用することができる。

  5. pragma(mangle) を集合体に適用することができる。

    構文はpragma(mangle, str_or_decl [, str] ) declaration; で、str_or_decl は以下のいずれかである: declaration の名前を置換する文字列式; または、classstructunion の宣言またはテンプレート・インスタンスで、declarationの代わりに使用する。 オプションの第2引数が存在する場合、それを名前として代わりに使用する。 str_or_decl (の名前空間とテンプレート・パラメータは保持する(もしあれば)。

    これにより、クラスを値や参照で受け取る関数や、Dキーワードであるクラスとのバインディングが可能になる。

    C++のstd::function を値でバインドする:

    extern(C++, "std")
    {
        template std_function(F)
        {
            pragma(mangle, "function")
            class std_function
            {
                // メンバ変数と関数
            }
        }
    }
    
    template ScopeClass(C , string name)
    {
        enum ns = __traits(getCppNamespaces,C);
        extern(C++, class) extern(C++,(ns))
        {
            pragma(mangle, C, name)
            struct ScopeClass
            {
                char[__traits(classInstanceSize, C)] buffer;
                // メンバ変数と関数
            }
        }
    }
    
    alias FuncType = void function(int);
    alias RawFuncType = typeof(*FuncType.init);
    // `void funk(std::function<void(int)> a)`として扱われる
    extern(C++) void funk( ScopeClass!(std_function!(RawFuncType)),"function") a );
    
  6. 複素数型と虚数型は非推奨となった。

    Dは以前、すべての浮動小数点型の複素数と虚数をサポートしていた。 型をサポートしていた。

    float a = 2;
    ifloat b = 4i;
    cfloat c = a + b;
    assert(c == 2 + 4i);
    

    しかし、これらの型はコア言語の一部とするには特殊すぎる。 同じ機能をライブラリ型の一部として実装することができる。 そのため そのため、DMDの古いバージョンでは、これらの組み込み型が使われたときに警告を表示する-transition=complex 。 と警告するスイッチを提供していた。 この移行段階は終了し これらの非推奨は現在デフォルトでオンになっている。

    ユーザーは代わりに std.complex.Complexを使うべきである。

    import std.complex;
    float a = 2;
    float b = 4;
    auto c = complex(a, b);
    assert(c == complex(2, 4));
    

    これまで非推奨の警告をオンにしていた-transition=complex 。 スイッチも廃止された。

  7. while (auto n = expression) 現在は

    このリリースまで、while (auto n = expression) はサポートされていなかった。 if がサポートされていなかった:if (auto n = expression) は正常にコンパイルされた。現在のコンパイラー・バージョンから while (auto n = expression) と全く同じセマンティクスを持つ と全く同じセマンティクスを持つ:

    while (true)
    {
        if (auto n = expression)
        { /* ループ本体 */ }
        else
        { break; }
    }
    

ライブラリーの変更

  1. フォーマットされた出力を中央揃えにする。

    新しいフラグ'=' がフォーマット指定子に追加された。 これにより、出力を中央揃えにすることができる:

    assert(format!"|%=8d|"(1234) == "|  1234  |");
    

    出力が正確に中央に配置できない場合は、わずかに左に移動される。 '-' フラグがあれば左に、なければ右に移動する:

    assert(format!"|%=-8d|"(123) == "|  123   |");
    assert(format!"|%=8d|"(123) == "|   123  |");
    
  2. AllImplicitConversionTargets を置き換える。ImplicitConversionTargets

    モジュールstd.traits の"関数"ImplicitConversionTargets には設計上の欠陥がある。 設計上の欠陥がある。 が含まれている。これを克服するために、新しい関数 AllImplicitConversionTargets が追加され ImplicitConversionTargets は非推奨となった。

  3. %e,%f,%g,%a を使った整数のフォーマットが可能になった。

    整数の書式設定が、浮動小数点数でよく使われる 指定子まで拡張された:整数の書式設定が、浮動小数点数で一般的な指定子に拡張された。 %e%f%g%a を使って整数をフォーマットできるようになった。この結果は 結果は、対応する浮動小数点値に期待される結果と同様である。 値に期待される結果と同様である。

    assert(format!"%.3e"(ulong.max) == "1.845e+19");
    assert(format!"%.3,3f"(ulong.max) == "18,446,744,073,709,551,615.000");
    assert(format!"%.3g"(ulong.max) == "1.84e+19");
    assert(format!"%.3a"(ulong.max) == "0x1.000p+64");
    
  4. pow(f, -2)f ^^ -2 の実装が変更された。

    浮動小数点値であるpow(f, -2)f ^^ -2 の実装が、 の値によってはバグっていることに気づいた。 f が浮動小数点値である場合、f の値によってはバグがあることに気づいた。 残念なことに、この修正は他の値(指数 )についても小さな変更を意味する。f (指数-2)についても小さな変更を意味する:結果の最下位ビットが現在の実装と異なる可能性がある。 結果の最下位ビットが現在の実装と異なる可能性がある。(これは 結果の最下位ビットが現在の実装と異なる可能性がある。 (これは浮動小数点数の特殊性によるものであり、合理的な手段では回避できない)。

    問題を避けるには、アルゴリズムが浮動小数点演算の最下位ビットに依存しないようにすることだ。 例えば、浮動小数点計算の最下位ビットに依存しないようにする。 ==の代わりにisClose を使う。

  5. std.format : enforceValidFormatSpec を非推奨とする。

    enforceValidFormatSpec を 、誤って 2.107.0でパブリックビューから削除される。 std.format

  6. 非推奨 std.format : formatElement

    formatElement std.format が誤って公開されてしまった。 2.107.0で公開されなくなる。

    formatElement(sink, value, fmt) の代わりに使用してほしい:

    import std.range : only;
    
    sink.put(format!("%("~fmt~"%)")(only(value)));
    
  7. std.format : unformatElementを廃止する。

    unformatElement std.format が誤って公開されてしまった。 2.107.0で公開されなくなる。

    文字列と文字についてはparseElement を、それ以外のものについては を参照のこと。 std.conv を、それ以外のものにはunformatValue std.format.read を使ってほしい。

  8. FieldnameTuple インターフェイスに対しては空のタプルを返すようになった

    以前は、FieldNameTuple は、AliasSeq!"" を返していた。 int,char*, ... のような非集約型に対して行われるように、インターフェースに対しても を返していた。この動作は驚くべきものだった なぜなら、そのインターフェースのインスタンスには、コンパイル時にはわからないメンバがあるかもしれないからだ。 この動作は驚くべきものだった。

    FieldNameTuple はインターフェイスに対して空の を返すようになった。 AliasSeq!()

  9. Fields (以前は )はインターフェイスに対して空のタプルを返すようになった。FieldTypeTuple

    以前のFields は、AliasSeq!(Interface) を返していた。 int,char*, ... のような非集約型に対して行われるように、インターフェイスに対しても を返していた。この動作は驚くべきものだった なぜなら、インターフェイスのインスタンスには、コンパイル時にはわからないメンバがあるかもしれないからだ。 を持つことがあるからだ。

    Fields はインターフェイスに対して空の を返すようになった。 AliasSeq!()

  10. 浮動小数点数をコンパイル時にフォーマットできる。

    例:":

    import std.format : format;
    import std.math : sqrt;
    
    enum pi = format!"%s"(3.1415926f);
    static assert(pi == "3.14159");
    
    enum golden_ratio = format!"|%+-20.10E|"((1 + sqrt(5.0)) / 2);
    static assert(golden_ratio == "|+1.6180339887E+00   |");
    
  11. 浮動小数点数のフォーマットはGCで割り当てられなくなった。

    浮動小数点数のフォーマットの実装が見直された。 を作り直した。我々は、作業例がGCでアロケートされないようにした。 しかし、GCで管理される例外はまだ使用している。 したがって、フォーマットを正しく使用するコードは決してアロケートしない、 しかし例外の場合、GCは例外の割り当てに使われる。 例外が発生する。我々は、この問題を解決するためにDIP 1008に取り組んでいる。

  12. std.format と共に使用された場合、いくつかの実数がdoubleにダウンキャストされる。

    std.format の内部では、snprintf の呼び出しを、浮動小数点をフォーマットするためにDで書かれたルーチンに置き換えている。 libc の呼び出しを、浮動小数点値をフォーマットするためにDで書かれたルーチンで置き換えた。 の呼び出しに置き換えた。これらの関数は、浮動小数点数、倍精度、64ビット-リアル値、80ビット-リアル値(x87-リアル値)に対してのみ動作する。 および80ビット-リアル(x87-リアル)に対してのみ動作する。

    他のすべての実数は、フォーマットされる前にdoubleにダウンキャストされる。 にダウンキャストすることで処理される。その結果、出力の精度が落ちることがある。 出力の精度が損なわれる可能性がある。さらに、double.max より大きな数値は、以下のようにフォーマットされる。 double.max のようにフォーマットされる。 よりも小さい数値は、最小の正の2乗のようにフォーマットされる。 負の値についても同様である。

  13. std.typecons.Nullable:非推奨のalias get this を削除する。

    Nullable は暗黙的にそのメンバに変換されなくなった。 この機能には問題があった。 型変換によるアサーションを引き起こす可能性があったからである。 以前の動作を復元するには、 "値"の使用を次のように置き換える。 の使用を に置き換える。 Nullablen n.get

  14. std.format のドキュメントが完全に作り直された。

    ここ数年、std.format のドキュメントは少しずつ古くなっていた。 そのため、完全な手直しが必要だった。そのため パッケージ全体が見直され、例: を含むすべての文書が改善・拡張された、 改善・拡張された。

    ハイライトをいくつか紹介しよう:

    • フォーマット文字列の文法が更新された。
    • 書式指定子に関する詳細な説明が追加された。
    • 関数と書式文字列の使い方の例をいくつか追加した。 文字列の使い方の例をいくつか追加した。

  15. モジュールstd.format がより小さなモジュールに分割された

    モジュールstd.format はサブモジュールに分割された:

    • std.format.spec:フォーマット文字列に関するシンボル。 struct FormatSpectemplate singleSpec
    • std.format.read:入力の読み取りに関する記号。 template formattedRead およびtemplate unformatValue
    • std.format.write:主に出力の書き込みに関する記号 template formattedWrite およびtemplate formatValue

    すべての公開シンボルは、これまで通りstd.formatを使ってアクセスできる。

  16. モジュールstd.math はより小さなモジュールに分割された

    モジュールstd.math はサブモジュールに分割された:

    • std.math.constants:PI のような数学定数。
    • std.math.algebraic:abssqrt のような基本的な代数関数。
    • std.math.trigonometry:sincos のような三角関数。
    • std.math.rounding:ceilfloor のような丸めに関する関数。
    • std.math.exponential:pow,exp,log のような指数関数と対数関数。
    • std.math.remainder:fmod のような余りを計算する関数。
    • std.math.operations:isClose,nextUp,fmin のような浮動小数点演算。
    • std.math.traits:isNaNisSubnormal のような浮動小数点イントロスペクション。
    • std.math.hardware:ハードウェア制御:IeeeFlags およびFloatingPointControl

    すべての公開シンボルには、通常通りstd.math

  17. splitWhenがstd.algorithm.iterationに追加された。

    std.algorithm.iteration.splitWhenは既存の std.algorithm.iteration.chunkBy関数の変形である。 が等価関係であることを必要としない。 ではできない使い方ができる。例:

    // 最大隣接差によるグループ化:
    import std.math : abs;
    import std.algorithm;
    auto r3 = [1, 3, 2, 5, 4, 9, 10].splitWhen!((a, b) => abs(a-b) >= 3);
    assert(r3.equal!equal([
        [1, 3, 2],
        [5, 4],
        [9, 10]
    ]));
    

    これはchunkByでは未定義の結果となる。 pred(a,b)とpred(b,c)が真を返すなら、pred(a,c)も真を返さなければならない。

  18. std.datetime の古いベンチマーク機能は削除された。

    これは2.077.0で非推奨となり、 を使用する std.datetime.stopwatch core.time.MonoTime を使うようになった。 core.time.Duration.

  19. std.exception.enforceEx は削除された。

    これは2.079で非推奨となり、std.exception.enforce

  20. 新しいモジュールstd.sumtype

    sumtype パッケージが標準ライブラリに追加された。 パッケージがstd.sumtype として標準ライブラリに追加された。

    これはSumType を提供する。 デザイン・バイ・イントロスペクションを用いて これは、安全で効率的なコードを生成するために、デザイン・バイ・イントロスペクションを使用する。 レガシーstd.variant.Algebraic

    SumType :

    • パターン・マッチ。
    • 自己参照型をサポートする。
    • pure,@safe,@nogc,nothrow,scope との完全な互換性。
    • 実行時の型情報 (TypeInfo) に依存しない。
    • BetterCとの互換性。

    使用例::

    import std.sumtype;
    import std.math : isClose;
    
    struct Fahrenheit { double degrees; }
    struct Celsius { double degrees; }
    struct Kelvin { double degrees; }
    
    alias Temperature = SumType!(Fahrenheit, Celsius, Kelvin);
    
    // 任意のメンバ型から構築。
    Temperature t1 = Fahrenheit(98.6);
    Temperature t2 = Celsius(100);
    Temperature t3 = Kelvin(273);
    
    // パターンマッチを使って値にアクセスする。
    Fahrenheit toFahrenheit(Temperature t)
    {
        return Fahrenheit(
            t.match!(
                (Fahrenheit f) => f.degrees,
                (Celsius c) => c.degrees * 9.0/5 + 32,
                (Kelvin k) => k.degrees * 9.0/5 - 459.4
            )
        );
    }
    
    assert(toFahrenheit(t1).degrees.isClose(98.6));
    assert(toFahrenheit(t2).degrees.isClose(212));
    assert(toFahrenheit(t3).degrees.isClose(32));
    
    // refを使用してその場で値を変更する。
    void freeze(ref Temperature t)
    {
        t.match!(
            (ref Fahrenheit f) => f.degrees = 32,
            (ref Celsius c) => c.degrees = 0,
            (ref Kelvin k) => k.degrees = 273
        );
    }
    
    freeze(t1);
    assert(toFahrenheit(t1).degrees.isClose(32));
    
    // catch-allハンドラを使ってデフォルトの結果を与える。
    bool isFahrenheit(Temperature t)
    {
        return t.match!(
            (Fahrenheit f) => true,
            _ => false
        );
    }
    
    assert(isFahrenheit(t1));
    assert(!isFahrenheit(t2));
    assert(!isFahrenheit(t3));
    
  21. std.range.Transposed:非推奨メンバーを削除するsave

    Transposed は前方範囲として機能しなかった。

dubの変更

  1. dub設定ファイルに低メモリコンパイルオプションのサポートを追加した。

    有効にするには、defaultLowMemorytrue に設定する。dmdとldcでは、コンパイル時に-lowmem コマンドラインオプションが追加される。

    {
        "defaultLowMemory": true
    }
    

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

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

  1. Bugzilla 21752: テンプレート制約がネストされたエポニーメス・テンプレートを壊す。
  2. Bugzilla 21802: opAssign と opOpAssign が遅延 void パラメータを矛盾なく扱う。
  3. Bugzilla 21880: [REG 2.095] スコープ変数が非スコープパラメータ呼び出し関数に代入される。
  4. Bugzilla 21898: 括弧が存在しない場合、エイリアス定義で修飾子が無視される
  5. Bugzilla 21914: ネイキッドアセンブラ関数がパラメータへのオフセットを間違える。
  6. Bugzilla 21936: [REG 2.080.1] -dip1000でコンパイルするとSegfaultが発生する

DMDコンパイラのバグ修正

  1. Bugzilla 2450: 名前付きテンプレートミックスインからの演算子の使用エラー
  2. Bugzilla 13815: コンパイル時と実行時でゴトジャンプの動作に一貫性がない。
  3. Bugzilla 14114: volatileLoad/StoreによるNULL位置へのアクセスを許可する
  4. Bugzilla 14145: 関数本体がコンパイルされない場合、opDispatchが考慮されない。
  5. Bugzilla 14740: __traits(allMembers)は関数内で宣言された型に対して誤った "this"メンバを返す。
  6. Bugzilla 14954: extern opaque structインスタンスがコンパイルされない。
  7. Bugzilla 15478: 配列の次元を定義する際にCTFE評価を見逃すケースがある
  8. Bugzilla 16472: enumテンプレートをデフォルト・パラメータとしてエイリアスする際に、"is used as a type "というスプリアスが発生する。
  9. Bugzilla 17146: 内部エラー: tk.c 266 with -O -inline
  10. Bugzilla 18251: deprecate + transition=complex は if 制約がマッチしない関数を見るべきでない。
  11. Bugzilla 19387: [dip1000]__fieldPostblitはスコープにするか、スコープの修飾子を推論する必要がある。
  12. Bugzilla 19443: core.simdはMOVHLPSの代わりにMOVLPSを生成する
  13. Bugzilla 19783: BetterCで構造体の配置に失敗する。
  14. Bugzilla 20460: [OSX] DMDがDWARFのデバッグ情報のどこにでも同じアドレスを書き込む
  15. Bugzilla 20581: DIP1000 で hidden ref temporary のフラグが正しく立てられない。
  16. Bugzilla 20599: cpp_long の列挙型が動作しない。
  17. Bugzilla 20704: init をデフォルト・パラメータとする が動作しない-preview=rvaluerefparam
  18. Bugzilla 20855: 大きなファイルをコンパイルするとスタックオーバーフローが発生する
  19. Bugzilla 21403: dmd/backend/cgcs.d:375 assert が失敗した。
  20. Bugzilla 21651: インポートされていないパッケージが完全修飾型の一部として使用されてもエラーにならない。
  21. Bugzilla 21661: 式の内部で現在のモジュールの完全修飾名を使用できない。
  22. Bugzilla 21665: voidの初期化は、invariantを持つstructのインスタンスに対して許可されるべきではない。
  23. Bugzilla 21668: 不透明な型のrefパラメータを宣言できない。
  24. Bugzilla 21672: [REG][ICE][SIMD]SIMD型を "short"としてアクセスするとコンパイラが氷を生成する。
  25. Bugzilla 21680: で矛盾したエラーが発生する。typeof({ return field; }())
  26. Bugzilla 21684: サイズが64kより大きい構造体を持つWin32でアサートが失敗する
  27. Bugzilla 21699: コンパイル時にインデックスが範囲外の場合に重複エラーが発生する
  28. Bugzilla 21726: package(...)の可視性における間違った比較
  29. Bugzilla 21739: デバッグ・ケースは他のケースから変数にアクセスできる
  30. Bugzilla 21742: ドットテンプレート式は他のテンプレートのようにvoid型を持たない。
  31. Bugzilla 21743: getOverloadsがテンプレート・メンバーの'this'式の伝播に失敗する。
  32. Bugzilla 21753: 関数リテラルメンバを持つ "構造体"リテラルはテンプレート値の引数として使用できない。
  33. Bugzilla 21765: checkaction=contextでassignment-as-conditionエラーが発生する。
  34. Bugzilla 21779: -release -checkaction=contextでassertが省略されない。
  35. Bugzilla 21785: checkaction=contextでのassignment-as-conditionエラー : -checkaction=context でassertが省略されない。
  36. Bugzilla 21791: enumイニシャライザの前方参照でスタックオーバーフローが発生する。
  37. Bugzilla 21792: 自分自身を基本型とする列挙型のクラッシュ dmd
  38. Bugzilla 21793: preview=nosharedaccessで共有メンバを初期化できない
  39. Bugzilla 21797: 前方参照列挙型 min / max のスタックオーバーフロー
  40. Bugzilla 21812: 値のタプルを持つ型に対する__traits(allMembers)は幽霊メンバを返す。
  41. Bugzilla 21816: XMM for nanのテストがうまくいかない。
  42. Bugzilla 21822: オプティマイザ flowlv() が OPmemcmp と OPstrcmp を考慮しない。
  43. Bugzilla 21825: DIP1034: "副作用のないXXXを呼び出すと'noreturn'型の戻り値が破棄される "という警告を出さない。
  44. Bugzilla 21826: Win32用のMSCOFF出力では、フレームポインタ以外にEBPを使用すべきではない。
  45. Bugzilla 21827: backend/cgelem.dのelToPair()でNullポインタ例外が発生する。
  46. Bugzilla 21828: 列挙型の前方参照はintを基本型とする。
  47. Bugzilla 21830: staticの非推奨テンプレートが非推奨の場合、誤った非推奨メッセージが表示される
  48. Bugzilla 21831: 制約を評価する前のテンプレート・パラメータで誤った非推奨メッセージ
  49. Bugzilla 21832: 非推奨テンプレートを静的条件でインポートする際の誤った非推奨メッセージ :: 非推奨テンプレートを静的条件でインポートする際の誤った非推奨メッセージ
  50. Bugzilla 21833: オプティマイザが整数比較を符号なしshort比較に誤って書き換える
  51. Bugzilla 21849: UTF8: -verrors=contextがマルチバイト文字に対応していない。
  52. Bugzilla 21861: ネストされた列挙型または関数が UDA を持つ場合、ctfe に失敗する。
  53. Bugzilla 21870: 静的配列の長さで使用される場合、プロパティ/メソッドが呼び出されず、()が必要である。
  54. Bugzilla 21874: テスト・スイートが最新のGDBバージョンで失敗する
  55. Bugzilla 21876: 長さ0の静的配列は "コンパイル時に読み込めない"
  56. Bugzilla 21878: CTFEで配列のインデックスを作成する際に "ref"が失われる
  57. Bugzilla 21882: [ICE][dip1021] src/dmd/escape.d(1850):アサーション失敗
  58. Bugzilla 21883: 基本クラスとインターフェースの順序を入れ替えた際のエラーメッセージが貧弱
  59. Bugzilla 21918: 自動関数のgetParameterStorageClassesでエラーが発生する。
  60. Bugzilla 21927: ICE (不正な命令) が発生した。
  61. Bugzilla 21940: コンパイラ・フラグ -check=on/off が認識されない

DMDコンパイラの機能強化

  1. Bugzilla 16140: while(auto x = y)がif(auto x = y)のように動作しない。
  2. Bugzilla 20068: コンストラクタの"共用体"初期化は@safeでなければならない。
  3. Bugzilla 21203: 集約型にpragma(mangle)を使えるようにした。
  4. Bugzilla 21585: マングルされた文字列型を既存の型に変換するために"__traits(totype, string)"を追加した。
  5. Bugzilla 21630: assert(0)とassert(false)はカバレッジのためにマークされるべきではない。
  6. Bugzilla 21835: float の演算には x87 ではなく XMM レジスタを使うべきである。

phobosリグレッションの修正

  1. Bugzilla 21716: std.regex パフォーマンスのリグレッション (GCの追加割り当て)
  2. Bugzilla 21725: ビットフィールド変数名にnullを指定すると失敗するようになった。

phobosのバグ修正

  1. Bugzilla 8424: double/floats から文字列へのコンパイル時の変換
  2. Bugzilla 9297: std.formatの浮動小数点値のフォーマットが実数をdoubleに切り捨ててしまう。
  3. Bugzilla 15227: std.formatの文書化されていない文法
  4. Bugzilla 15348: std.stdio.writef 書式指定子のエラーメッセージ
  5. Bugzilla 15386: std.format.formatValueの使用方法がハングアップする
  6. Bugzilla 15888: std.formatは非推奨の16進数を生成すべきではない
  7. Bugzilla 16432: JSONが文字列に正しくパースされない
  8. Bugzilla 17381: 浮動小数点引数の後に書式文字列が許容されるかチェックした
  9. Bugzilla 18780: int型を保持するバリアントが符号なし型に変換される際の動作が一貫していない。
  10. Bugzilla 20320: format("%f") が間違った出力になる
  11. Bugzilla 20371: std.formatは浮動小数点数に対して500文字に制限される
  12. Bugzilla 20502: std.typecons.RefCounted!Tを文字列に変換すると、Tが明示的なtoStringを持たない構造体の場合、Tのフィールドの代わりにTの格納場所が返される。
  13. Bugzilla 20534: std.format:%rをbooleanに変換すると間違った結果になる
  14. Bugzilla 20536: std.format: 実数の%aはfloat/doubleの%aと矛盾する
  15. Bugzilla 21456: std.formatは文字列を基本型とする列挙型をテンプレート・パラメーターとして受け付けない。
  16. Bugzilla 21512: RedBlackTree!TidはTid.init以外の値を重複として扱う。
  17. Bugzilla 21575: std.process.spawnProcessによって生成された子プロセスが、誤って親プロセスのシグナルマスクを継承してしまう。
  18. Bugzilla 21592: std.process.spawn.Process によって生成された子プロセスが誤って親プロセスのシグナルマスクを継承してしまう。
  19. Bugzilla 21601: std.math : pow(float/double, -2) が時々間違った結果を生成する
  20. Bugzilla 21627: macOS : std.stdio.File.sync がディスクへの書き込みを保証しない
  21. Bugzilla 21641: std.format: %g がまれに一貫性のない結果を生成する
  22. Bugzilla 21679: Base64.encoderで範囲の入力が空の場合にアサーションに失敗する
  23. Bugzilla 21700: Stopwatchのstd.datetimeがまだ削除されていない。
  24. Bugzilla 21702: std.algorithm.searching.startsWith&endsWithの複数の検索語バージョンの制約における2次テンプレート展開を避ける
  25. Bugzilla 21704: Nullable が静的配列要素の破棄に失敗する
  26. Bugzilla 21705: Nullable!T.opEqualsは、非定数のopEqualsオーバーロードを持つTに対して失敗する。
  27. Bugzilla 21707: std.base64:入力に誤りがあると Base64Exception ではなく範囲エラーが発生する
  28. Bugzilla 21708: SumType.opEqualsが紛らわしいエラーメッセージを出す
  29. Bugzilla 21721: std.BigIntsから組み込み浮動小数点型へのキャストは、-preview=dip1000なしでは動作しない。
  30. Bugzilla 21722: toString(sink, string format)が"%s"以外の文字列で動作しない
  31. Bugzilla 21724: std.algorithm.mutation.copy がオーバーラップしている配列で、コピー元配列のポインタがコピー先配列のポインタより小さい場合に失敗する。
  32. Bugzilla 21728: rawReadがパイプのクローズされたreadEndで呼び出された場合、NULLでfreadを呼び出す(segfault)
  33. Bugzilla 21729: rawReadがクローズされたFileで実行された場合、NULLポインタの参照を解除する(segfault)
  34. Bugzilla 21730: ChunksImpl.opApply で NULL ptr が参照される (SIGSEGV)
  35. Bugzilla 21738: std.format.spec: singleSpec は "%%" でスローされるべきである。
  36. Bugzilla 21758: std.experimental.checkedintの左辺が整数のopBinaryRightは+と-以外の演算子ではコンパイルできない。
  37. Bugzilla 21777: std.format: 整数を高精度にフォーマットする際にいくつかの問題がある。
  38. Bugzilla 21814: std.format: 幅0でのグループ化は浮動小数点例外を引き起こす
  39. Bugzilla 21817: std.format: 整数の%uが符号なし値を表示しない。
  40. Bugzilla 21820: std.format:ゼロの書式は決して空文字列になるべきではない
  41. Bugzilla 21834: std.numeric.gcd が負の値を扱えない。
  42. Bugzilla 21836: std.format: グループ化するとRangeErrorが発生する。
  43. Bugzilla 21838: std.format:グループ化は%a出力を文字化けさせる
  44. Bugzilla 21840: std.format: グループ化で%eのスペースフラグが無視される
  45. Bugzilla 21841: std.format:グループ化は精度ゼロと%eで奇妙な結果を生成する
  46. Bugzilla 21842: std.format:"%-+05,g" は余分なカンマを追加する。
  47. Bugzilla 21846: std.format: toStringに指定された書式文字列がグループ化で機能しない
  48. Bugzilla 21853: std.format: CTFEでreal.maxのフォーマットに失敗する
  49. Bugzilla 21863: FieldNameTupleがインターフェイスのemptry文字列を返す
  50. Bugzilla 21875: std.format: 連想配列のネストされた書式文字列の書式指定子の数が正しく検出されない。
  51. Bugzilla 21900: std.format: 文字を含む16進整数の偶数への丸めが機能しない

phobosの機能強化

  1. Bugzilla 13595: std.algorithm.groupByを拡張して非等価関係をサポートした。
  2. Bugzilla 16200: 積分指数のpow実装を高速化
  3. Bugzilla 18024: checkedint.Abortとcheckedint.Warnは"@safe"であるべきだ。
  4. Bugzilla 18627: std.complexは組み込みの複素数型より数値計算がかなり遅い。
  5. Bugzilla 20756: ImplicitConversionTargetsはインターフェースの継承を無視する。
  6. Bugzilla 21759: std.experimental.checkedint.Checkedは"%d"や"%x"の整数フォーマット指定子と互換性がない。
  7. Bugzilla 21760: std.conv.toは文字列をstd.experimental.checkedint.Checked!Tに変換する方法を知らない。
  8. Bugzilla 21761: Checked!Tが共有されている場合、std.experimental.checkedint.Checked!T.toHashを呼び出し可能にする。
  9. Bugzilla 21808: std.format.CheckedT.toHashを呼び出し可能にする:AAのキーと値の順序を変更できるようにする。
  10. Bugzilla 21847: std.format: 整数でも%e、%g、%aをサポートすべきである。
  11. Bugzilla 21858: std.format:出力を中央揃えにする

Druntimeリグレッションの修正

  1. Bugzilla 21097: [REG2.083] 大きな構造体.destroy時にスタックを使い果たす。
  2. Bugzilla 21363: [REG2.094] core.bitop.ror(x,0)の実装がUBを使用している。

Druntimeのバグ修正

  1. Bugzilla 21764: checkaction=contextが空のタプルに対して機能しない。
  2. Bugzilla 21857: TypeInfo_Array.compareで、配列のどちらかが2GBを超えると間違った結果を返すことがある。

Druntimeの強化

  1. Bugzilla 21789: Codecovはファイルのパーミッションにデフォルトのumaskを使用するようになった。

dlang.orgの機能強化

  1. Bugzilla 21161: ["可変長のテンプレート"はD1 / Tangoの古い例を使っている。
  2. Bugzilla 21869: doxygenへのハイパーリンクが無効

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

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

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