OpenWatcom/Changes_in_1.7

OpenWatcom/Changes_in_1.7

まあ例によって(無断)翻訳。

このへん→http://www.openwatcom.org/index.php/C_Compilers_Release_Changes

  • 呼び出し規約 __cdecl の関数は、32 ビットコードの場合、実数の戻り値を FPU レジスタに返すようになった。 これが他のコンパイラと互換性のある正しい振る舞いである。
    (訳注:以前のバージョンではメモリ上に静的に確保された実体へのポインタを EAX に返していた。ちなみに User's Guide の __cdecl エイリアスに関する説明は修正されていない
  • C と C++ コンパイラが include_alias プラグマをサポートするようになった。これは特に、長い名前のインクルードファイル名を 8.3 文字の形式にマッピングするために使える。 加えて、_ialias.h(標準ヘッダ用の include_alias プラグマをここに入れる)の自動インクルードを禁止するための -na スイッチをサポート。
  • void** と int** といった異なる多段ポインタ型どうしの操作時に C コンパイラが警告を出すようになった。 以前は ANSI モードでのみ警告を出していた。 void** は int** との代入互換性がなく、その一方で void* には互換性があることに注意。 この厳格な挙動は他の大部分の C コンパイラと歩調を合わせるものであり、ユーザがよりクリーンで移植性の高いコードを書く手助けとなるものである。
  • 符号指定のない文字型の式を配列のインデクスに用いたとき、C コンパイラは警告 (W400) を出すようになった。 符号指定のない文字型の符号は使われるコンパイラとその設定に依存するため、符号指定のない文字型を配列インデクスに用いることにはそもそも移植性がなく、不具合の原因になるかもしれない。
  • C コンパイラは範囲オーバーフローなどのチェックをする前に定数式を畳み込む (fold) ようになった。 これによりコンパイラは定数が範囲外となるより多くの状況を診断できるようになる。
  • C コンパイラは、__near もしくは __far 修飾子が明示的に指定されていないが現在のデータモデルを考慮すれば同じとみなせる変数の再定義を認めるようになった(たとえばスモールモデルでの extern int __near x; と extern int x;)。 この振る舞いは C++ コンパイラ、それに他社製コンパイラとも互換性がある。
  • 32 ビット DOS エクステンダ実行バイナリのデフォルトスタックサイズが 4K から 64K に増やされた。 リンカでこれ以外のスタックサイズを設定できることに注意。
  • コードジェネレータが、64 ビット算術演算のより良い 16 ビットコードを生成するようになった。
  • コードジェネレータが条件文の不正な最適化をしないようになった。 この不具合はきわめて稀な状況下でのみ発生する。 おそらく double 同士の比較を行ったときのみである。
  • 三項演算子の結果として 64 ビット定数を使用した際に長らく存在した不具合が修正された。
  • C++ コンパイラで、bugzilla bug #63 向けの暫定対策。 コンパイラはクラッシュしなくなり、今のところ bugzilla のエントリを示すエラーメッセージを生成する。
  • netware ライブラリ LIBC, CLIB を試験的にディストリビューションに追加した。
  • 32 ビット DOS 実行ファイルが、spawn 系の関数で起動した子プロセスに環境を正しく渡すようになった。 正しくない挙動になっていたのはバージョン 1.6 からである。
  • NetWare ライブラリ内で __get_std_stream を使った __get_stdout が無限再帰を引き起こしていた。 これは修正された。
  • 8087 エミュレータと算術ライブラリで、ゼロと2のべき数との 80 ビット実数乗算が修正された。
  • graph.lib の _outgtext() 関数が 32 ビットターゲットでも失敗しなくなった。
  • Win32 の stat() 関数で、パス名中にファイル名と同じ名前のディレクトリ名があるファイルにアクセスした場合に正しい結果を返すようになった。
    (訳注:つまり、たとえばサブディレクトリ foo に同じ名前の foo というファイルがある場合、stat("foo/foo", &st) とかやると st.st_mode に正しいファイルモードが返されなかった、というようなことらしい)
  • デバッガがアセンブリコードウィンドウ内にソースコードとの対応をオン/オフするための "No Source" トグルをサポート(マウスの右クリックメニュー)。
  • デバッガは可変長配列を使った F77 プログラムをトレースしてもクラッシュしなくなった。 これは DWARF デバッグ情報(これがデフォルトで利用される)についてだけである。
  • デバッガは DWARF デバッグ情報を使ったとき(これがデフォルト)、FORTRAN の多次元配列を正しく表示できるようになった。
  • デバッガは、FORTRAN 中の文字列がデバッガの内部リミットを超過する長さのときも、文字列を(部分的に)表示できるようになった。 内部リミットも 512 文字から 1024 文字に増やされた。
  • リソースコンパイラは、LX 実行バイナリ処理時、非常駐ネームテーブル (non-resident name table) を正しくコピーするようになった。
  • Win32 用のコンソール版 vi は何かのキーの後に Ctrl+Left を押しても終了しなくなった。
  • WCL は、コンパイルするファイルが2つ以上あるときも環境変数からオプションを正しく取得するようになった。
  • リンカが MIXED1632 オプションをサポート。 OS/2 の LX/LE 実行バイナリのひとつの物理セグメント内に 16 ビットと 32 ビットの論理セグメントを混在させられるようになる。
  • リンカが Windows と OS/2 の実行ファイルフォーマットで NOSTUB オプションをサポート。 このオプションで、DOS のスタブが存在しない実行ファイルを出力イメージとして書き出すことができる。
  • インストーラは /np スイッチでプログラムグループの作成をしないようにでき、/ns スイッチでスタートアップ環境の修正をしないようになった。