checking __INTEL_COMPILER == 9999
A few years ago, circa 2010, the Intel 12.x compiler was released without having a correct value for the macro __INTEL_COMPILER. It was released using the development-only version number 9999 instead of the correct value 12xx. Later on, an Intel 12.x compiler was updated to remove this problem and the version number made correct. Meanwhile, since boost needed to add some workarounds, there was code added in a couple of boost files to check for version 9999. The check for 9999 in boost causes trouble in our current development compiler in-house testing. Is it possible to have this version checking removed from the boost sources? There's no advantage to boost users, and possibly a disadvantage if someone is still using a not-updated 12.x compiler. But hopefully that is unlikely, we're currently shipping our 16.x compiler. Here's the diff, diff --git a/include/boost/config/compiler/intel.hpp b/include/boost/config/compiler/intel.hpp index 7789b94..bbbf876 100644 --- a/include/boost/config/compiler/intel.hpp +++ b/include/boost/config/compiler/intel.hpp @@ -47,11 +47,7 @@ #undef BOOST_COMPILER #if defined(__INTEL_COMPILER) -#if __INTEL_COMPILER == 9999 -# define BOOST_INTEL_CXX_VERSION 1200 // Intel bug in 12.1. -#else # define BOOST_INTEL_CXX_VERSION __INTEL_COMPILER -#endif #elif defined(__ICL) # define BOOST_INTEL_CXX_VERSION __ICL #elif defined(__ICC) @@ -93,11 +89,7 @@ #include "boost/config/compiler/common_edg.hpp" #if defined(__INTEL_COMPILER) -#if __INTEL_COMPILER == 9999 -# define BOOST_INTEL_CXX_VERSION 1200 // Intel bug in 12.1. -#else # define BOOST_INTEL_CXX_VERSION __INTEL_COMPILER -#endif #elif defined(__ICL) # define BOOST_INTEL_CXX_VERSION __ICL #elif defined(__ICC) @@ -289,7 +281,7 @@ template<> struct assert_intrinsic_wchar_t<unsigned short> {}; // (Niels Dekker, LKEB, May 2010) // Apparently Intel 12.1 (compiler version number 9999 !!) has the same issue (compiler regression). #if defined(__INTEL_COMPILER) -# if (__INTEL_COMPILER <= 1110) || (__INTEL_COMPILER == 9999) || (defined(_WIN32) && (__INTEL_COMPILER < 1600)) +# if (__INTEL_COMPILER <= 1110) || (__INTEL_COMPILER == 1210) || (defined(_WIN32) && (__INTEL_COMPILER < 1600)) # define BOOST_NO_COMPLETE_VALUE_INITIALIZATION # endif #endif Here's the other checking for 9999 that I found. Not known to cause a problem. diff --git a/include/boost/regex/v4/regex_format.hpp b/include/boost/regex/v4/regex_format.hpp index e9006a7..bf2e552 100644 --- a/include/boost/regex/v4/regex_format.hpp +++ b/include/boost/regex/v4/regex_format.hpp @@ -180,7 +180,7 @@ private: } inline int toi(ForwardIter& i, ForwardIter j, int base) { -#if defined(_MSC_VER) && defined(__INTEL_COMPILER) && ((__INTEL_COMPILER == 9999) || (__INTEL_COMPILER == 1210)) +#if defined(_MSC_VER) && defined(__INTEL_COMPILER) && (__INTEL_COMPILER == 1210) // Workaround for Intel support issue #656654. // See also https://svn.boost.org/trac/boost/ticket/6359 return toi(i, j, base, mpl::false_()); The intel.hpp check for 9999 causes this problem, among others, float128 tests from (boost_multiprecision suite) fail due to workaround in intel.hpp fo 12.1 compiler that was released with __INTEL_COMPILER == 9999 Fails like this: $ "icpc" -c -xc++ -O0 -w1 -inline-level=0 -fPIC -m64 -DBOOST_ALL_NO_LIB=1 -DSLOW_COMPILER -DTEST_FLOAT128 -I"../../.." -I"../include" -c -o "../../../bin.v2/libs/multiprecision/test/test_tanh_float128.test/intl-lnx/dbg/dbg-symbl-\ off/test_tanh.o" "test_tanh.cpp" In file included from test_tanh.cpp(53): ../../../boost/multiprecision/float128.hpp(48): error: identifier "_Quad" is undefined typedef _Quad float128_type; ^ Thanks and regards, Melanie Blower
On 11/13/2015 2:45 PM, Blower, Melanie wrote:
A few years ago, circa 2010, the Intel 12.x compiler was released without having a correct value for the macro __INTEL_COMPILER. It was released using the development-only version number 9999 instead of the correct value 12xx. Later on, an Intel 12.x compiler was updated to remove this problem and the version number made correct.
You did not explain why the check for '9999' causes problems or why it is incorrect in the cases in which it is used.
Meanwhile, since boost needed to add some workarounds, there was code added in a couple of boost files to check for version 9999. The check for 9999 in boost causes trouble in our current development compiler in-house testing. Is it possible to have this version checking removed from the boost sources? There's no advantage to boost users, and possibly a disadvantage if someone is still using a not-updated 12.x compiler. But hopefully that is unlikely, we're currently shipping our 16.x compiler.
Whether you think a Boost library should support older versions of a compiler or not it is up to the library implementor what versions of a given compiler are supported. It is usually considered rude to drop support for a compiler/version in a particular Boost library without making some prior announcement about it and waiting at least one release after the announcement.
Here's the diff,
diff --git a/include/boost/config/compiler/intel.hpp b/include/boost/config/compiler/intel.hpp index 7789b94..bbbf876 100644 --- a/include/boost/config/compiler/intel.hpp +++ b/include/boost/config/compiler/intel.hpp @@ -47,11 +47,7 @@ #undef BOOST_COMPILER
#if defined(__INTEL_COMPILER) -#if __INTEL_COMPILER == 9999 -# define BOOST_INTEL_CXX_VERSION 1200 // Intel bug in 12.1. -#else # define BOOST_INTEL_CXX_VERSION __INTEL_COMPILER -#endif #elif defined(__ICL) # define BOOST_INTEL_CXX_VERSION __ICL #elif defined(__ICC) @@ -93,11 +89,7 @@ #include "boost/config/compiler/common_edg.hpp"
#if defined(__INTEL_COMPILER) -#if __INTEL_COMPILER == 9999 -# define BOOST_INTEL_CXX_VERSION 1200 // Intel bug in 12.1. -#else # define BOOST_INTEL_CXX_VERSION __INTEL_COMPILER -#endif #elif defined(__ICL) # define BOOST_INTEL_CXX_VERSION __ICL #elif defined(__ICC) @@ -289,7 +281,7 @@ template<> struct assert_intrinsic_wchar_t<unsigned short> {}; // (Niels Dekker, LKEB, May 2010) // Apparently Intel 12.1 (compiler version number 9999 !!) has the same issue (compiler regression). #if defined(__INTEL_COMPILER) -# if (__INTEL_COMPILER <= 1110) || (__INTEL_COMPILER == 9999) || (defined(_WIN32) && (__INTEL_COMPILER < 1600)) +# if (__INTEL_COMPILER <= 1110) || (__INTEL_COMPILER == 1210) || (defined(_WIN32) && (__INTEL_COMPILER < 1600)) # define BOOST_NO_COMPLETE_VALUE_INITIALIZATION # endif #endif
Here's the other checking for 9999 that I found. Not known to cause a problem. diff --git a/include/boost/regex/v4/regex_format.hpp b/include/boost/regex/v4/regex_format.hpp index e9006a7..bf2e552 100644 --- a/include/boost/regex/v4/regex_format.hpp +++ b/include/boost/regex/v4/regex_format.hpp @@ -180,7 +180,7 @@ private: } inline int toi(ForwardIter& i, ForwardIter j, int base) { -#if defined(_MSC_VER) && defined(__INTEL_COMPILER) && ((__INTEL_COMPILER == 9999) || (__INTEL_COMPILER == 1210)) +#if defined(_MSC_VER) && defined(__INTEL_COMPILER) && (__INTEL_COMPILER == 1210) // Workaround for Intel support issue #656654. // See also https://svn.boost.org/trac/boost/ticket/6359 return toi(i, j, base, mpl::false_());
The intel.hpp check for 9999 causes this problem, among others, float128 tests from (boost_multiprecision suite) fail due to workaround in intel.hpp fo 12.1 compiler that was released with __INTEL_COMPILER == 9999 Fails like this: $ "icpc" -c -xc++ -O0 -w1 -inline-level=0 -fPIC -m64 -DBOOST_ALL_NO_LIB=1 -DSLOW_COMPILER -DTEST_FLOAT128 -I"../../.." -I"../include" -c -o "../../../bin.v2/libs/multiprecision/test/test_tanh_float128.test/intl-lnx/dbg/dbg-symbl-\ off/test_tanh.o" "test_tanh.cpp" In file included from test_tanh.cpp(53): ../../../boost/multiprecision/float128.hpp(48): error: identifier "_Quad" is undefined typedef _Quad float128_type;
On 13/11/2015 22:27, Edward Diener wrote:
On 11/13/2015 2:45 PM, Blower, Melanie wrote:
A few years ago, circa 2010, the Intel 12.x compiler was released without having a correct value for the macro __INTEL_COMPILER. It was released using the development-only version number 9999 instead of the correct value 12xx. Later on, an Intel 12.x compiler was updated to remove this problem and the version number made correct.
You did not explain why the check for '9999' causes problems or why it is incorrect in the cases in which it is used.
Intel use version 9999 for their internal testing of the next release, but a compiler with that version number accidentally slipped out into the wild as well. Boost.Config has no way of distinguishing between them, I'm not sure, but this may effect users beta-testing Intel's products as well as their development team.
Meanwhile, since boost needed to add some workarounds, there was code added in a couple of boost files to check for version 9999. The check for 9999 in boost causes trouble in our current development compiler in-house testing. Is it possible to have this version checking removed from the boost sources? There's no advantage to boost users, and possibly a disadvantage if someone is still using a not-updated 12.x compiler. But hopefully that is unlikely, we're currently shipping our 16.x compiler.
Whether you think a Boost library should support older versions of a compiler or not it is up to the library implementor what versions of a given compiler are supported. It is usually considered rude to drop support for a compiler/version in a particular Boost library without making some prior announcement about it and waiting at least one release after the announcement.
That's normally true. However, in this case the effected version appears to be no longer available from Intel's site - only 12.0 update 5 and later - so I guess I'm somewhat sympathetic to the change in this case. John.
On Sat, Nov 14, 2015 at 6:21 AM, John Maddock
On 13/11/2015 22:27, Edward Diener wrote:
On 11/13/2015 2:45 PM, Blower, Melanie wrote:
A few years ago, circa 2010, the Intel 12.x compiler was released without having a correct value for the macro __INTEL_COMPILER. It was released using the development-only version number 9999 instead of the correct value 12xx. Later on, an Intel 12.x compiler was updated to remove this problem and the version number made correct.
You did not explain why the check for '9999' causes problems or why it is incorrect in the cases in which it is used.
Intel use version 9999 for their internal testing of the next release, but a compiler with that version number accidentally slipped out into the wild as well. Boost.Config has no way of distinguishing between them, I'm not sure, but this may effect users beta-testing Intel's products as well as their development team.
Meanwhile, since boost needed to add some workarounds, there was code added in a couple of boost files to check for version 9999. The check for 9999 in boost causes trouble in our current development compiler in-house testing. Is it possible to have this version checking removed from the boost sources? There's no advantage to boost users, and possibly a disadvantage if someone is still using a not-updated 12.x compiler. But hopefully that is unlikely, we're currently shipping our 16.x compiler.
Whether you think a Boost library should support older versions of a compiler or not it is up to the library implementor what versions of a given compiler are supported. It is usually considered rude to drop support for a compiler/version in a particular Boost library without making some prior announcement about it and waiting at least one release after the announcement.
That's normally true. However, in this case the effected version appears to be no longer available from Intel's site - only 12.0 update 5 and later - so I guess I'm somewhat sympathetic to the change in this case.
Since Intel released a compiler with that version number to the public I'm less sympathetic. It's their mistake and problem, not ours. One they could easily deal with by switching to some other number for their internal development.. Like say '99999' (one extra 9).. Without involving anyone in the public. -- -- Rene Rivera -- Grafik - Don't Assume Anything -- Robot Dreams - http://robot-dreams.net -- rrivera/acm.org (msn) - grafikrobot/aim,yahoo,skype,efnet,gmail
Thanks for all your suggestions and replies, I will work it on the Intel side. To Edward, at the bottom of my first message there's info about one of the failure modes. --Melanie
On 2015-11-13 22:45, Blower, Melanie wrote:
A few years ago, circa 2010, the Intel 12.x compiler was released without having a correct value for the macro __INTEL_COMPILER. It was released using the development-only version number 9999 instead of the correct value 12xx. Later on, an Intel 12.x compiler was updated to remove this problem and the version number made correct.
Meanwhile, since boost needed to add some workarounds, there was code added in a couple of boost files to check for version 9999. The check for 9999 in boost causes trouble in our current development compiler in-house testing. Is it possible to have this version checking removed from the boost sources? There's no advantage to boost users, and possibly a disadvantage if someone is still using a not-updated 12.x compiler. But hopefully that is unlikely, we're currently shipping our 16.x compiler.
Since this basically means removing support for the broken 12.x release, that may be a difficult decision. Is it possible to distinguish your current development builds from the broken 12.x release? If there was a macro to do that it might be better to add that macro to the preprocessor conditions.
participants (5)
-
Andrey Semashev
-
Blower, Melanie
-
Edward Diener
-
John Maddock
-
Rene Rivera