変更ログ: 2.107.0
Download D 2.107.0
2024年02月01日リリース
コンパイラの変更
ランタイムの変更
D 2.107.0におけるすべてのバグ修正と機能強化のリスト。
コンパイラの変更
- アサート条件としての文字列リテラルは非推奨となった。
文字列リテラルのブーリアン評価は、意図せずに行われる可能性がある。 例えば、assert(0, "message") を意味していたのに、0 が抜けていた場合など。
assert("unexpected runtime condition"); static assert("unhandled case for `", T, "`");
この2つのアサートは、無言のまま常に何の効果ももたらさなかった。 現在では、これらのケースは非推奨メッセージで検出される。 元の挙動が実際に意図されていたのであれば、代わりにexpr !is null :
assert("" !is null); static assert("" !is null);
- コンパイラー用メイクファイルのクリーンアップ
コンパイラをビルドするための Makefile (compiler/src/{posix,win32,win64}.mak) はしばらく非推奨とされていたが、ついに削除された。現在は、compiler/src/build.d ツールを直接使うか(docsを参照)、LDCホストコンパイラを使った最適化ビルドの場合など、リポジトリのルートにあるトップレベルのMakefileを使って、コンパイラとdruntimeをワンステップでビルドしてほしい:make -jN HOST_DMD=ldmd2 ENABLE_RELEASE=1 ENABLE_LTO=1
トップレベルの Makefile の名前がposix.mak からMakefile に変更された(非推奨のposix.mak フォワーダーを使用)。例えば、druntime はtest 、install 、clean ターゲットに含まれるようになった。
従来のsrc/posix.mak ファイルはまだ存在するが、トップレベルの Makefile に転送される。そのため、例えばデフォルトのall ターゲットには、コンパイラーだけでなくdruntimeも含まれるようになった。
トップレベルwin{32,64}.mak とレガシーsrc/win{32,64}.mak ファイル(DigitalMars make用)は完全に削除された。一般的なトップレベルMakefile は、GNU make(とbashとGNUツールを提供するgitのインストール)で、Windowsでも動作する。
長い間非推奨だったcompiler/test/Makefile も削除された。代わりにcompiler/test/run.d を直接使う(docsを参照)。
- 認識できないプラグマはエラーではなく、単に無視されるようになった。
以前は、-ignore dmdスイッチを使わない限り、認識されないプラグマはハードエラーを発していた。現在は常に無視され、-ignore dmdスイッチも無視される。
- モジュールコンストラクタに@standalone を追加した。
2つのモジュールが互いにインポートしていて、両方がモジュールコンストラクタを持っている場合、 druntimeはどちらを先に実行するか判断できないため、エラーを投げる。
これはpragma(crt_constructor) 、回避することができるが、C言語のランタイム・コンストラクタでは、druntimeは初期化されない。 そのため、このようなコンストラクターではガベージ・コレクターを使うことができない。
@standalone は新しい属性で、druntimeが初期化された後に実行されるモジュールコンストラクタをマークするために使用できる、 で、druntimeが初期化された後に実行されるが、その前に実行される他のモジュールコンストラクタに依存しないモジュールコンストラクタをマークするために使用できる新しい属性である。 からインポートする必要がある。 core.attribute
コンパイラーは、モジュールのコンストラクターが本当に初期化される他の変数に依存していないことを検証しないので、手動で強制しなければならない。 そのため、@system または@trusted とマークしなければならない。
import core.attribute : standalone; immutable int* x; @standalone @system shared static this() { x = new int(10); } void main() { assert(*x == 10); }
可能であれば、@standalone を使う代わりに、問題のあるモジュールのコンストラクタをそれ自身の小さなモジュールに入れることで、循環依存エラーを解決したい。
- _d_newarray{mTX,miTX,OpT} は1つのテンプレートに変換される:_d_newarraymTX
_d_newarraymTX テンプレートは、DBIを使用して、配列の要素の型によってどのタイプの初期化子が必要かをチェックするようになった。 したがって、これは_d_newarraymTX と_d_newarraymiTX の両方を置き換える。
_d_newarrayOpT は、上記の両方のフックの一般的な実装であった。 まず「外側」の配列をポインタ配列として確保し、次に または を呼び出して、「内側」の1次元配列を適宜初期化していた。 現在では、 と のマージにより、これは不要となった。 _d_newarrayT _d_newarrayiT _d_newarraymTX _d_newarraymiTX
現在、コンパイラーは以下のような下降を実行する:
S[][] s = new S[][](2, 3) // is now lowered to: S[] s = _d_newarraymTX!(S[][], S)([2, 3]);
この変更により、新しいテンプレートがcore.internal.array.construction に追加される。
ランタイムの変更
- core.atomic の操作に無効な MemoryOrder を使用すると、コンパイル時に拒否されるようになった。
以下のcore.atomic 関数がより制限的になった:
- atomicLoad と 、インスタンス化されることを拒否するようになった。atomicStore
ほとんどの場合、これまでMemoryOrder.acq_rel を使っていたコードは、代わりに を使うように切り替えるべきである。 MemoryOrder.seq に切り替えるべきである。
// エラー: atomicLoad!(MemoryOrder.acq_rel)(src); atomicStore!(MemoryOrder.acq_rel)(dest, value); // 修正アクション: atomicLoad!(MemoryOrder.seq)(src); atomicStore!(MemoryOrder.seq)(dest, value); // または: atomicLoad(src); atomicStore(dest, value);
- atomicExchange という引数でインスタンス化されることを拒否するようになった。
ほとんどの場合、MemoryOrder.acq を使っていたコードは、代わりに MemoryOrder.seq に切り替えるべきである。
// エラー: atomicExchange!(MemoryOrder.acq)(dest, value); // 修正アクション: atomicExchange!(MemoryOrder.seq)(dest, value); // または: atomicExchange(dest, value);
- atomicCompareExchangeWeak そして、 、現在は拒否している。atomicCompareExchangeStrong
ほとんどの場合、これらのどちらかを使用していたコードは、代わりに MemoryOrder.raw に切り替えるべきである。
// エラー: atomicExchangeWeak!(MemoryOrder.rel, MemoryOrder.rel)(dest, compare, value); atomicExchangeWeakNoResult!(MemoryOrder.acq_rel, MemoryOrder.acq_rel)(dest, compare, value); atomicExchangeStrong!(MemoryOrder.acq, MemoryOrder.rel)(dest, compare, value); atomicExchangeStrongNoResult!(MemoryOrder.seq, MemoryOrder.acq_rel)(dest, compare, value); // 修正アクション: atomicExchangeWeak!(MemoryOrder.rel, MemoryOrder.raw)(dest, compare, value); atomicExchangeWeakNoResult!(MemoryOrder.acq_rel, MemoryOrder.raw)(dest, compare, value); atomicExchangeStrong!(MemoryOrder.acq, MemoryOrder.raw)(dest, compare, value); atomicExchangeStrongNoResult!(MemoryOrder.seq, MemoryOrder.raw)(dest, compare, value);
- atomicCompareExchangeWeak と を追加した。atomicCompareExchangeStrong
ほとんどの場合、この契約に違反するコードは、 と の両方の引数に同じ MemoryOrder を使用すべきである。 succ fail を使うべきである。
// エラー: atomicExchangeWeak!(MemoryOrder.raw)(dest, compare, value); atomicExchangeStrong!(MemoryOrder.acq, MemoryOrder.seq)(dest, compare, value); // 修正アクション: atomicExchangeWeak!(MemoryOrder.raw, MemoryOrder.raw)(dest, compare, value); atomicExchangeStrong!(MemoryOrder.acq, MemoryOrder.acq)(dest, compare, value);
- druntime用メイクファイルのクリーンアップ
{posix,win32,win64}.mak Makefileは一般的なMakefile (druntime/test/ のものを含む)にマージされた。posix.mak は今のところ非推奨のフォワーダーとして残してある。
Windowsでは、GNU make (とbashとGNUツールを提供するgitインストール)を使って、一般的なMakefileを使うことができる/使う必要がある。Windowsの開発者は、-j を使ってようやく並列性を利用できるようになる!https://github.com/dlang/dmd/releases/download/nightly/gnumake-4.4-win64.zip からzip圧縮済みの.exeをダウンロードできる。
- Dで実装されたC stdatomicヘッダーが追加された。
このモジュールの目的は、CからDへのコード移植作業を支援し、システムCコンパイラー対応と可能な限り同じコード生成を行うことである。
関数名のエイリアスが存在しない場合、コード生成の品質を気にしないのであれば、_impl を追加して実装を見ることができる。
もしある関数が提供するコード生成がシステムCコンパイラーと同等でなく、それがあなたのユースケースにとって重要であれば、バグとして報告してほしい。
ライブラリーの変更
- isForwardRangeがオプションの要素型を取るようになった。
isForwardRangeにオプションの2番目のテンプレート・パラメータが追加された。 をvoidに設定するようになった。voidでない場合、範囲の要素型がこの追加引数constと同じ型である場合にのみtrueと評価される。 型がこの追加引数と同じである場合にのみ真と評価される。例えば 例えば、isForwardRange!(int[], const(int)) は真だが isForwardRange!(int[], string) は偽である。
- メイクファイルのクリーンアップ
{posix,win32,win64}.mak Makefileは一般的なMakefile にマージされた。posix.mak は今のところ非推奨のフォワーダーとして残してある。
Windowsでは、GNU make (とbashとGNUツールを提供するgitインストール)を使って、一般的なMakefileも使える/使う必要がある。Windowsの開発者は、-j を使ってようやく並列性を利用できるようになる!https://github.com/dlang/dmd/releases/download/nightly/gnumake-4.4-win64.zip からzip圧縮済みの.exeをダウンロードできる。
D 2.107.0のすべてのバグ修正と機能強化のリスト:
DMDコンパイラのリグレッション修正
- Bugzilla 24266: ImportC: 構造体のイニシャライザー・エントリーが無視される。
- Bugzilla 24274: [REGマスター] ImportC: 配列を持つ構造体のイニシャライザが認識されない。
- Bugzilla 24295: [BetterC]新しいint[]を持つICE
- Bugzilla 24301: [REG 2.100] "@safe"コードでコピー不可能な構造体を値で渡すと、誤解を招くエラーメッセージが表示される。
- Bugzilla 24338: enum型の動的配列を静的配列の基本型に連結することができない。
DMDコンパイラのバグ修正
- Bugzilla 16357: cast(T[])[x]が[x]をT[]にキャストする代わりにxをTにキャストする。
- Bugzilla 20339: 構造体宣言の内部でsizeofにアクセスした場合、isPODが真を返す。
- Bugzilla 20369: foreachループでシャドウされた変数は常に "foreach変数"とみなされる
- Bugzilla 22216: ミュータビリティのオーバーロードのエラーメッセージが不完全/不正確である。
- Bugzilla 22905: gdbのバックトレースに間違った場所が含まれている
- Bugzilla 23411: ImportC: 未定義の識別子 __builtin_nanf
- Bugzilla 23713: compilable/testcstuff1.c:206:1: error: static assertion failed: sizeof(u'a') == 4
- Bugzilla 23714: compilable/testcstuff1.c:213:1: error: static assertion failed: u'ab' == 0x610062.
- Bugzilla 23972: クラスの同一性チェックが壊れている
- Bugzilla 24031: ImportC: ネストされたC初期化子を拒否する
- Bugzilla 24094: importC __declspec が宣言文の前で機能しない。
- Bugzilla 24200: ImportC: .diファイルで収集されたマクロがSpecial Tokenと衝突する。
- Bugzilla 24224: __traits(initSymbol)は集約派生列挙型を基本型として扱う。
- Bugzilla 24248: 変更可能なターゲットを持つコンストラクタ呼び出しが間違ったエラーメッセージを出す
- Bugzilla 24252: ci: Error: ファイル 'compilabletestcstuff3_0.obj' の書き込みエラー。
- Bugzilla 24264: ImportC: _Bool returnのインライナートリップ。
- Bugzilla 24276: ImportC: .di ファイルで typedef エイリアスが正しく生成されない。
- Bugzilla 24280: ImportC: 複数のファイルをコンパイルする際の前方参照エラー
- Bugzilla 24281: 名前付き引数の後にフィールドが見つからない場合のセグメンテーションエラー
- Bugzilla 24283: [SIMD][CODEGEN]不正なCODEGEN + AVX2レジスタがある場合とない場合
- Bugzilla 24292: デストラクタを持つ構造体が誤ってレジスタに返される
- Bugzilla 24303: 別のCファイルで型定義された匿名構造体の問題
- Bugzilla 24304: uint16_t, __uint32_t, __uint64_t が認識されない。
- Bugzilla 24306: ImportC:別々のCファイルにある同じ名前の構造体を一緒にコンパイルすると干渉する。
- Bugzilla 24309: Azure パイプラインでメモリ割り当てに失敗した
- Bugzilla 24311: AAベース型を持つ名前付き列挙型がICEを引き起こす。
- Bugzilla 24319: OpenBSD:file_time に正しい型を使用する。
- Bugzilla 24326: ImportC: -H による名前なし列挙型の変換でセグメンテーションフォールトが発生した。
- Bugzilla 24340: 無効な export ディレクティブが生成された
DMDコンパイラの機能強化
- Bugzilla 14387: アサート条件として文字列リテラルを許可しない
- Bugzilla 23629: ImportC: コード・カバレッジ解析をサポートする必要がある。
- Bugzilla 24069: ImportCは名前のないパラメータとして関数ポインタを解析しない。
- Bugzilla 24125: ImportC: ベクトル型イニシャライザーが理解されない。
- Bugzilla 24155: ImportC: C23 のデフォルト初期化子を受け入れる。
- Bugzilla 24206: TypeSuffixを持つ型を返す関数型のエイリアスを作成できない。
- Bugzilla 24238: "l値でない"というエラーメッセージが紛らわしい。
- Bugzilla 24247: 修飾子オブジェクトのエラーでコンストラクタが呼び出せない。
- Bugzilla 24294: ImportC: gcc で -Wno-builtin-macro-redefined というコマンドラインオプションが認識されない。
- Bugzilla 24297: ImportC は glibc _FORTIFY_SOURCE と互換性がない。
phobosリグレッションの修正
- Bugzilla 24243: chain(filter,filter)をフォーマットできない。
Phobosのバグ修正
- Bugzilla 24151: std.container.array:Array!string("")がコンパイルされない。
- Bugzilla 24215: std.trait.isBasicType!列挙型 "はfalseであるべきである。
- Bugzilla 24278: std.math.absは符号なし引数を32ビットに促進する
- Bugzilla 24342: T[][].until(T[])はセンチネルが1より長いと壊れる。
phobosの機能強化
- Bugzilla 11111: std.algorithm.canFindはニードルをサポートすべきである。
- Bugzilla 24075: ushort またはubyte
Druntimeのバグ修正
- Bugzilla 4071: DLLと実行ファイル間でメモリとオブジェクトを共有するためのサポートがない。
- Bugzilla 24272: operations.arrayOpを強制的に"@nogc nothrow"にした。
- Bugzilla 24298: cpp_deleteはnullをチェックすべきである。
Druntimeの強化
- Bugzilla 20332: 連想配列のクリア関数を@safeにした。
dlang.orgのバグ修正
- Bugzilla 23712: ImportC: 整数リテラルからどのような型が推論されるかのドキュメントが不明確(9223372036854775808の型は未定義)。
- Bugzilla 24239: CircleCIのdlang.orgテストがメモリ不足になる。
- Bugzilla 24241: Specがデフォルト引数の欠落を許可しない
dlang.orgの機能強化
- Bugzilla 24176: opApplyデリゲートのパラメータは以下のようにする必要はない。ref
- Bugzilla 24177: 配列リテラルは暗黙的に期待される型に変換できる。
- Bugzilla 24210: 関数型は文書化されていない。
このリリースへの貢献者 (37)
このリリースを可能にしてくれたすべての素晴らしい人々に多大な感謝を捧げる。
- Adam D. Ruppe
- Atila Neves
- Basile Burg
- Brian Callahan
- Daniel Pflager
- Danil Sidoruk
- Denis Feklushkin
- Dennis
- Dennis Korpel
- Feldwor
- HuskyNator
- Iain Buclaw
- IchorDev
- Imperatorn
- imrying
- Jeremy
- jibal
- Martin Kinkelin
- Mathias Lang
- Mathis Beer
- mhh
- Mike Parker
- Nicholas Wilson
- Nick Treleaven
- Paul Backus
- Petar Kirov
- Rainer Schuetze
- Razvan Nitu
- richard (rikki) andrew cattermole
- ryuukk
- Sönke Ludwig
- Teodor Dutu
- Tim Schendekehl
- Timon Gehr
- Walter Bright
- Yang Yujie
- Семён Марьясин
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.108.0
ドキュメントのdmdのバージョン: 2.109.1
翻訳日付 :
HTML生成日時:
編集者: dokutoku