Subject: Re: [boost] [config] Boost and the Intel (Linux) compiler
From: John Maddock (jz.maddock_at_[hidden])
Date: 2016-05-07 03:09:06
On 06/05/2016 20:17, Bob Summerwill wrote:
> I am a developer on the Ethereum C++ client (
> https://github.com/ethereum/webthree-umbrella) and have been working with
> an external developer on adding support to the codebase for building with
> the Intel Compiler on Ubuntu.
> Here is the full log of pain :-)
> We've already merged various changes, and we appear to be getting down to
> the real hard ones, which are now mainly clustered around build issues with
> boost::multiprecision and seeming limitations with the Intel compiler and
> Like so:
> /home/libweb3core/libdevcore/Base64.h(48): error: no suitable conversion
> function from
> 160U, boost::multiprecision::unsigned_magnitude,
> boost::multiprecision::unchecked, void>, boost::multiprecision::et_off>" to
> "unsigned int" exists unsigned r = (unsigned)(a - a / 36 * 36); // boost's
> % is broken ^ detected during instantiation of "std::string
> dev::toBase36(const dev::FixedHash<N> &) [with N=20UL]" at line 114 of
> This appears to be the key observation:
> "In summary, the intel platform supports this "convert_to" member function,
> but does not support implicit conversion of boost multiprecision types"
> Has anybody worked with Boost and the Intel compiler who might have some
> further insight into whether there is some way in which the Intel compiler
> "warts" can be handed within Boost?
> Or are we stuck with these nasty diffs/workarounds?
It depends which compilers you want to support, (plus probably which
Boost version you're using).
Your code depends on a C++11 feature - explicit conversion operators,
and support for that is disabled when
BOOST_MP_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS is set. For Boost-1.60
and later, plus Intel 15 and later, the config for the Intel compiler is
identical to the GCC version it's emulating which probably fixes the
* Depending how Intel C++ is installed it can end up emulating antique
GCC versions which don't support the features you're using, and
* There is one compiler (Oracle C++) whose support for explicit
conversion operators is too broken to use anyway (internal compiler
errors if the feature is enabled for Multiprecision).
* And of course, default compiler mode even for GCC is still C++03 not
So.... if you want to support any of the above, then yes you will need
to use the convert_to member via:
myvar = bignum.template convert_to<int>();
myvar = static_cast<int>(bignum);
Hopefully that explains the situation?
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk