Opened 8 years ago

Closed 8 years ago

#11112 closed Bugs (fixed)

CS identifier causes compilation failure in geometry/test/strategies/distance_default_result.cpp

Reported by: Sergey.Sprogis@… Owned by: Barend Gehrels
Milestone: Boost 1.58.0 Component: geometry
Version: Boost 1.57.0 Severity: Problem
Keywords: Cc: Aparna.Kumta@…

Description

  1. Description of the failure.

geometry/test/strategies/distance_default_result.cpp fails with Oracle Studio 12.4 C++ compiler on Solaris producing error message similar to this:

"CC" -library=stlport4 -xO4 -mt -erroff=%none -KPIC -DBOOST_ALL_NO_LIB=1 -DNDEBUG -I"." -I"../../.." -I"../../../boost/geometry/extensions/contrib/ttmath" -c -o "../../../bin.v2/libs/geometry/test/strategies/distance_default_result.test/sun/release/stdlib-sun-stlport/threading-multi/distance_default_result.o" "strategies/distance_default_result.cpp"

"strategies/distance_default_result.cpp", line 183: Error: "," expected instead of "15".

  1. Cause of the failure.

The code of this test is perfectly fine from language standpoint, and the failure is related to long-existing bug in all later Solaris versions. Basically, compilation of any C or C++ code will fail on Solaris if it will satisfy two conditions:

  • The presence of #include <sys/regset.h> system header, direct or indirectly attached through other system headers from /usr/include directory.
  • The presence of identifiers which accidentally coincide with X86 register names, like CS, DS, ES, ...

Here is an example of such 2 lines code:

#include <sys/regset.h>

template <unsigned D, typename CS> inline void test_segment_all() {};

its compilation will produce error message similar to the one shown above. The failure occurs because that /usr/include/sys/regset.h has the following macros:

#define CS 15

#define DS 3

#define ES 2

and when compiler preprocesses this header, after that it automatically replaces user identifiers which accidentally have the same names with those numbers shown above.

So, in the original test <sys/regset.h> has been attached indirectly through long chain of system headers defined inside STL library with the usage of -library=stlport4 option, and when finally compiler preprocesses code from the test shown below:

template <std::size_t D, typename CS> Line 183 it wrongly replaces CS with '15' assuming that it comes from macro defined inside sys/regset.h

  1. Possible Solution.

To replace CS identifier inside geometry/test/strategies/distance_default_result.cpp with any other similar name, like for example C_S.

Change History (2)

comment:1 by Sergey.Sprogis@…, 8 years ago

Also, please perform exactly the same CS to C_S replacement in one more test: libs/geometry/test/geometries/segment.cpp

comment:2 by awulkiew, 8 years ago

Milestone: To Be DeterminedBoost 1.58.0
Resolution: fixed
Status: newclosed
Note: See TracTickets for help on using tickets.