Visual C++でビルド時にエラーC1001(内部エラー)発生
Visual C++を使用して簡単な多倍長整数の加算処理を行うDLLを作ろうとしているのですが、以下のようなコードをビルドしようとすると内部エラーとなってしまいます。(実際のコードはもっと複雑なのですが、問題が再現可能な短いコードを掲載しています)
後述するように正常にビルドできるようになる回避方法はあるのですが、果たして対処方法として正しいのか確信が持てません。
解決方法をご存知の方がおられましたら教えていただけませんでしょうか。
【ソースコード(抜粋)】
__declspec(dllexport) char __stdcall Statement_ADX(char carry, unsigned __int32 x, unsigned __int32 y, unsigned __int32* z_high, unsigned __int32* z_low)
{
carry = _addcarryx_u32(carry, x, y, z_low);
carry = _addcarryx_u32(carry, 0, 0, z_high);
return (carry);
}
【ビルドログ抜粋(パス名は一部省略)】
------ ビルド開始: プロジェクト: CppBug, 構成: Release Win32 ------
Add.c
ライブラリ ********\Release\CppBug.lib とオブジェクト********\Release\CppBug.exp を作成中
コード生成しています。
********\cppbug\add.c(13): fatal error C1001: コンパイラで内部エラーが発生しました。
(コンパイラ ファイル 'f:\dd\vctools\compiler\utc\src\p2\main.c'、行 255)
この問題を回避するには、上記の場所付近のプログラムを単純化するか変更してください。
詳細については、Visual C++ ヘルプ メニューのサポート情報コマンドを
選択してください。またはサポート情報 ヘルプ ファイルを参照してください。
プロジェクト "CppBug.vcxproj" のビルドが終了しました -- 失敗。
ログ中のadd.cは上記のソースコードのファイル名で、13行目は関数の終わりの }
がある行です。
【発生条件/試行してみたこと】
- 構成がReleaseかつプラットフォームがWin32の場合に発生します。(DEBUGまたはx64では発生しません)
- _addcarryx_u32を_addcarry_u32に置き換えると正常にビルドできました。
- 試しに、2つ目の_addcarryx_u32がある行をコメントアウトすると正常にビルドできました。
- carryを2つの_addcarryx_u32の間で引き継いでいることが関係しているのかもしれないと考えて、試しに2つの_addcarryx_u32の呼び出しを以下のように変更してみましたが、改善されず同様のエラーが発生しました。
carry = _addcarryx_u32(0, x, y, z_low);
carry = _addcarryx_u32(0, 0, 0, z_high);
【使用したC/C++プロジェクトについて】
使用したプロジェクトは Visual C++の「Win32プロジェクト」で、アプリケーションの種類に「DLL」、追加のオプションに「空のプロジェクト」を指定しています。共通ヘッダーは追加していません。
プロジェクトの設定は、既定の設定から以下の点を変更しています。
- すべての構成とすべてのプラットフォームに対し、C/C++の全般の設定「警告をエラーとして扱う」を「はい(/WX)」に変更。
【動作環境】
- CPU: Intel Core i7 7700K
- OS: Windows10 Pro 64bit
- IDE: Visual Studio Community 2017
【プロジェクトの格納場所】
https://github.com/rougemeilland/palmtreemath/tree/master/CppBug