2012-11-23 16 views
14

clangの現在の3.3ブランチを正常にコンパイルしました。しかし、ファイルのC++コンパイルはバグ/エラーで失敗します。それは修正できますか?clangと__float128バグ/エラー

In file included from /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/iostream:39: 
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/ostream:39: 
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/ios:40: 
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/char_traits.h:40: 
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/stl_algobase.h:65: 
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/stl_pair.h:61: 
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/move.h:57: 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/type_traits:256:39: error: use of 
     undeclared identifier '__float128' 
    struct __is_floating_point_helper<__float128> 
            ^
1 error generated. 
+1

あなたはこれを見ましたか:http://www.mail-archive.com/[email protected]/msg31724.html? –

+0

clang 3.3は__float128をサポートしていますか? – Goz

+0

@Adrianoはい、私はそれを見ましたが、進歩があったかどうかはわかりません。 – Cartesius00

答えて

18

あなたがして、それを修正することができます:

CXXFLAGS+="-D__STRICT_ANSI__" 
+0

プロジェクトの定義後にCmakeLists.txtにset(CMAKE_CXX_FLAGS "$ {CMAKE_CXX_FLAGS} -D__STRICT_ANSI__")を追加すると、これは私にとってはうまくいきません(llvm/clang 3.7.1 with mingw 4.9.3 posix dwarf) – Antonio

+0

私はllvm/clang 4.0.1とmingwを使用しています。7.1 x86_64 posix seh –

5

私はclang__float128をサポートしていないと思います。それclangで16バイトである)long doubleと同じタイプであってもよいので、挿入する簡単な場合であってもよい:どこか早いあなたの鎖を含んで

typedef long double __float128; 

#define __float128 long double 

又は。

私はそれがうまくいくことを保証しているわけではありませんが、clangがさらにgccの内線番号をサポートし始めるまで待つのではなく、試してみるのが最善でしょう。

いずれか、またはgccに切り替えてください(オプションの場合)。私はかなり確信していますgccのすべてgccの拡張:-)

+1

実際には悪い計画ではありませんが、クイック-D "__ float128 = long double"は問題を解決するかもしれません... – Goz

+0

これはおそらくclangのバグでしょう。 3.3が現在の開発ブランチであり、3.2がまだリリースされていないので、驚くことではありません。 OPは実験コードを使用しています。 ClangはGCCのC++ライブラリで動作するはずです。 –

+1

NO!テンプレート指定の再宣言のために動作しませんが、解決策を見つけました;-) – Cartesius00

3

解決策は、この宣言を持つことです。それは魔法のように動作:#define

#ifdef __clang__ 
typedef struct { long double x, y; } __float128; 
#endif 

ソリューションが原因でテンプレートの仕様の再宣言エラーの動作しません。

もちろん、これはハックですので、安全でなければなりません。私はちょうどいくつかの実験のためにclangをしたいので、何の問題も起こらないでしょう。

+0

興味深いだけに、なぜ 'struct'が必要ですか? 'typedef long double __float128;で何が問題なのですか? – paxdiablo

+3

@paxdiablo 'template <__float128>'と 'テンプレート'のようなテンプレート仕様が2つあります。 typedefを使用すると、競合が発生します。 – Cartesius00

+9

Clang 3.2と** - std = gnu ++ 11 **でコードをコンパイルしたので、同じ問題が発生しました。 ** - std = C++ 11 **に変更した後、問題が修正されました。 – bitek