g++-5 (Ubuntu 5-20150329-1ubuntu11~14.04) 5.0.0 20150329 (experimental) [trunk revision 221764] Ubuntu clang version 3.6.1-svn232753-1~exp1 (branches/release_36) (based on LLVM 3.6.1) jscott@citra:/tmp$ cat int128.cpp #include <type_traits> int main () { static_assert(std::is_integral<__int128>::value, "__int128 should be integral"); return 0; } jscott@citra:/tmp$ g++-5 -std=gnu++11 -c int128.cpp jscott@citra:/tmp$ clang++ -std=gnu++11 -c int128.cpp int128.cpp:5:3: error: static_assert failed "__int128 should be integral" static_assert(std::is_integral<__int128>::value, "__int128 should be integral"); ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1 error generated. With GCC 4.9, this program builds fine. This breakage appears to be due to the following GCC change: http://permalink.gmane.org/gmane.comp.gcc.cvs/165545 In GCC 4.9 there was a symbol _GLIBCXX_USE_INT128 defined somewhere (maybe in some config header? I'm not sure) which let this work. With GCC 5, __GLIBCXX_TYPE_INT_N_0 and __GLIBCXX_BITSIZE_INT_N_0 are built into the preprocessor, and must be defined to let type_traits acknowledge __int128 as an integer. I discovered this issue due to some code which uses GCC's SIMD Mersenne Twister extension. A minimal example is: #include <ext/random> typedef __gnu_cxx::simd_fast_mersenne_twister_engine< unsigned __int128, /* The following parameters all relate to Mersenne Twister internal * state. These are thoughtlessly copied from the definition of sfmt19937. */ 19937, 122, 18, 1, 11, 1, 0xdfffffefU, 0xddfecb7fU, 0xbffaffffU, 0xbffffff6U, 0x00000001U, 0x00000000U, 0x00000000U, 0x13c9e684U> sfmt19937_128; int main () { sfmt19937_128 engine; auto value = engine(); } Which fails to build with Clang 3.6 + libstdc++ 5.0 like: jscott@citra:/tmp$ clang++ -std=gnu++11 random.cpp In file included from random.cpp:1: /usr/bin/../lib/gcc/x86_64-linux-gnu/5.0.0/../../../../include/c++/5.0.0/ext/random:67:7: error: static_assert failed "template argument substituting _UIntType not an unsigned integral type" static_assert(std::is_unsigned<_UIntType>::value, "template argument " ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ random.cpp:18:17: note: in instantiation of template class '__gnu_cxx::simd_fast_mersenne_twister_engine<unsigned __int128, 19937, 122, 18, 1, 11, 1, 3758096367, 3724462975, 3220897791, 3221225462, 1, 0, 0, 331998852>' requested here sfmt19937_128 engine; ^ 1 error generated. With the following definitions added to the top of the file it builds. Haven't tried a real example to see if it works though. """ #define __GLIBCXX_BITSIZE_INT_N_0 128 #define __GLIBCXX_TYPE_INT_N_0 __int128 """
Still an issue with 3.7.0-svn246299-1~exp1.
This is still a problem with clang 3.8.0.
this is still a bug with trunk. g++ in C++ mode defines __GLIBCXX_TYPE_INT_N_0 to __int128: $ g++ -v gcc version 5.2.1 20151031 (Ubuntu 5.2.1-23ubuntu1~14.04.2) $ g++ -x c++ -dM -E - < /dev/null | grep __GLIBCXX_TYPE_INT_N_0 #define __GLIBCXX_TYPE_INT_N_0 __int128 $ g++ -dM -E - < /dev/null | grep __GLIBCXX_TYPE_INT_N_0 $ $ clang++ -v clang version 3.9.0 (trunk 274529) $ clang++ -x c++ -dM -E - < /dev/null | grep __GLIBCXX_TYPE_INT_N_0 $
also, $ g++ -x c++ -dM -E - < /dev/null | grep __GLIBCXX_BITSIZE_INT_N_0 #define __GLIBCXX_BITSIZE_INT_N_0 128
g++ defines these in C++ gnu langaugae extensions mode only. r276252