Opened 8 years ago
Closed 8 years ago
#11110 closed Bugs (fixed)
ES identifier causes compilation failure in polygon/transform.hpp becase of Solaris bug
Reported by: | Owned by: | Andrii Sydorchuk | |
---|---|---|---|
Milestone: | Boost 1.58.0 | Component: | polygon |
Version: | Boost 1.57.0 | Severity: | Problem |
Keywords: | Cc: | Aparna.Kumta@… |
Description
- Description of the failure.
Several tests inside libs/geometry/test directory fail with Oracle Studio 12.4 C++ compiler on Solaris producing error message similar to this:
CC -c -library=stlport4 -erroff=%none -KPIC -DBOOST_ALL_NO_LIB=1 -DNDEBUG -I. -I../../.. -I../../../boost/geometry/extensions/contrib/ttmath geometries/boost_polygon.cpp
"../../../boost/polygon/transform.hpp", line 49: Error: Identifier expected instead of "2".
- Cause of the failure.
transform.hpp header is perfectly fine from user 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 presense of #include <sys/regset.h> system header, direct or indirectly attached through other system headers from /usr/include directory.
- The presence of identifires which accidentally coincide with X86 register names, like CS, DS, ES, ...
Here is an example of such 2 lines code:
#include <sys/regset.h>
void foo() { enum E { ES=2 }; }
its compilation will produce error message similar to the one shown above. The failure occur because that sys/regset.h has the following macros:
#define CS 15
#define DS 3
#define ES 2
and when compiler preprocesses sys/regset.h after that it automatically replaces user identifiers which accidentally have the same names with those numbers shown above.
So, in the original libs/geometry/test/geometries/boost_polygon.cpp 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. So, when finally compiler preprocesses code from boost/polygon/transform.hpp shown below:
enum ATR {
ES = 2, EAST_SOUTH = 2, FLIP_Y = 2, Line 49
it wrongly replaces ES with '2' assuming that it comes from macro defined inside sys/regset.h
- Possible Solution.
To replace ES identifier inside boost/polygon/transform.hpp with any other similar name, like for example E_S. And if it's not acceptable for every compiler, then please do it just for Oracle studio compiler like this:
#if definde SUNPRO_CC
E_S = 2, EAST_SOUTH = 2, FLIP_Y = 2,
#else
ES = 2, EAST_SOUTH = 2, FLIP_Y = 2,
#endif
Change History (3)
comment:1 by , 8 years ago
Milestone: | To Be Determined → Boost 1.58.0 |
---|---|
Owner: | changed from | to
comment:2 by , 8 years ago
comment:3 by , 8 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
The fix was pushed to the master branch.
Hi Sergey,
Thank you for a detailed report! It was decided to fix the issue by hiding two-letters ATR enum names under BOOST_POLYGON_ENABLE_DEPRECATED directive. The fix is already in develop branch and will be merged into master branch of 1.58 release.