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: Sergey.Sprogis@… Owned by: Andrii Sydorchuk
Milestone: Boost 1.58.0 Component: polygon
Version: Boost 1.57.0 Severity: Problem
Keywords: Cc: Aparna.Kumta@…

Description

  1. 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".

  1. 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

  1. 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 Andrii Sydorchuk, 8 years ago

Milestone: To Be DeterminedBoost 1.58.0
Owner: changed from Lucanus Simonson to Andrii Sydorchuk

comment:2 by Andrii Sydorchuk, 8 years ago

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.

comment:3 by Andrii Sydorchuk, 8 years ago

Resolution: fixed
Status: newclosed

The fix was pushed to the master branch.

Note: See TracTickets for help on using tickets.