2014年9月16日火曜日

[LLVM 3.5] Clang for Windows

LLVM 3.5 がリリースされたので clang for windows を更新。
LLVM 3.4 では type_traits のエラーがあってビルドができませんでしたが、どうなったのか確認してみました。

対象プログラムは例のごとく iutest を使用しました。

※ LLVM 3.4 のときの対処は「ブログズミ: [LLVM 3.4] Clang for Windows を使ってみた」を参考にしてください。
※ clang for windows はこちらからダウンロードできます。

error : cannot compile this try statement yet
ostream(800,3): error : cannot compile this try statement yet
                  _TRY_IO_BEGIN
                  ^~~~~~~~~~~~~
ostream(19,24) :  note: expanded from macro '_TRY_IO_BEGIN'
   #define _TRY_IO_BEGIN  _TRY_BEGIN      /* begin try block */
                          ^
xstddef(30,21) :  note: expanded from macro '_TRY_BEGIN'
   #define _TRY_BEGIN     try {

try ステートメントでなぜかエラーが出ます。まだ対応していないようです。
[LLVMdev] Clang Integration with MSVS 2013
こちらを参考に /GR- /D_HAS_EXCEPTIONS=0 をコンパイルオプションに追加することで解決しました。
(/GR- :「ランタイム型情報を有効にする」を「いいえ」に設定)


error : expected class name
typeinfo(190,11): error : expected class name
          : public exception
                   ^
typeinfo(194,5): error : member initializer 'exception' does not name a non-static data member or base class
                  : exception(_Message)
exception クラスがないと怒られます。
エラー行を見るとわかりますが、_HAS_EXCEPTIONS=0 の場合でも bad_cast や bad_typeid などの例外クラスが定義されるようで、この例外クラスが exception クラスを基底クラスに持つのですが、なぜか exception ヘッダーがインクルードされていないため、エラーになっているようです。

よって、typeinfo をインクルードする前に exception ヘッダーをインクルードすることで解決しました。


error : array initializer must be an initializer list
assertion.cpp(191,17): error : array initializer must be an initializer list
          const char16_t c16[] = u"test";
                         ^
assertion.cpp(196,17): error : array initializer must be an initializer list
          const char32_t c32[] = U"test";
                         ^

char16_t/char32_t の配列初期化に初期化リストを要求されました。
重要な機能ではないので、char16_t/char32_t は非対応としてビルドするようにしました。


ビルド成功
上記対応をすることでビルドが通るようになりました!やりました。

実行もできます。


まだ対処しないといけない部分がありますが、動くものが作れるようになりました。
今回やったこと以外にも対処が必要だったり、問題があったりするかもしれませんが、Visual Studio で clang が扱えるようになるのはありがたいことです。今後にも期待したいと思います。

以上。


0 件のコメント:

コメントを投稿