Thank you for the very useful and detailed reply :) On 24 May 2012 20:43, Ángel González <keisial@xxxxxxxxx> wrote: > On 24/05/12 20:47, Dan Liew wrote: >> Perhaps it is an issue with my distribution then. Are you using Arch >> Linux on a 64-bit system? I have the output of running $ g++ -v -m32 >> limits.cpp here: http://pastebin.com/JRJcVDX2 It is showing some >> header mismatch issues but I do not know if it is related to my issue. >> Any ideas what might be wrong? > > You seem to be using a 64bit-only compiler: >> --disable-multilib Thanks for pointing that out. > > I'd have expected it to reject the -m32 switch in such case, but it's > probably the issue. > For Arch Linux I think you should install the gcc-multilib package. > Thanks for the tip. I've installed the gcc-multilib package and everything works fine now. > Probably as consequence of not being, a multilib compiler, it is reading > the bits files from > /usr/include/c++/4.7.0/x86_64-unknown-linux-gnu/bits (which would be 64 > bits) > instead of /usr/include/c++/4.7.0/x86_64-unknown-linux-gnu/32/bits > There's only a few differences in my system between both folders, some > #define in c++config.h, > but they seem to make the difference. > > The error limits:1405:35: error: template argument 1 is invalid comes > from this excerpt: >> #if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_INT128) >> /// numeric_limits<__int128> specialization. >> template<> >> struct numeric_limits<__int128> >> { > > One of the different defines is precisely _GLIBCXX_USE_INT128 not being > defined in 32bit folder. > > So, you don't have multilib compiler properly setup, in -m32 it doesn't > have __int128 type, but > as it's using the wrong config, it is trying nonetheless to use it, > which produces your error. > > You should be able to bypass it with -D__STRICT_ANSI__, but then it > might break later at another > point. You should install the appropiate multilib package. > > Regards >