This patch attempts to fix the binary incompatibility of __rw_dbl_infinity when compiled with MSVC on Windows, introduced while fixing STDCXX-509 (MSVC mangles the access specifier into the names of class members):
https://issues.apache.org/jira/browse/STDCXX-509 As with Martin's patch, I've opted to just enable the workaround when _MSC_VER is defined. Travis Index: include/limits =================================================================== --- include/limits (revision 585687) +++ include/limits (working copy) @@ -88,7 +88,9 @@ _RWSTD_NAMESPACE (__rw) { +#ifndef _MSC_VER extern "C" { +#endif // _MSC_VER _RWSTD_EXPORT extern const float __rw_flt_infinity; _RWSTD_EXPORT extern const double __rw_dbl_infinity; @@ -111,7 +113,9 @@ #endif // _RWSTD_NO_LONG_DOUBLE +#ifndef _MSC_VER } // extern "C" +#endif // _MSC_VER } // namespace __rw Index: src/limits_bits.cpp =================================================================== --- src/limits_bits.cpp (revision 585687) +++ src/limits_bits.cpp (working copy) @@ -69,43 +69,50 @@ # endif // _RWSTD_NO_LONG_DOUBLE +#ifndef _MSC_VER extern "C" { +#endif // _MSC_VER // The constants below are declared in <limits> but with a different // type. C linkage is used to defeat MSVC and other "clever" compilers // that mangle the type of objects into their names. +#ifdef _MSC_VER +# define _RWSTD_BITS_NAME(b) _RWSTD_PASTE(b,_bits) +#else +# define _RWSTD_BITS_NAME(b) b +#endif // _MSC_VER + // infinity computed at config time _RWSTD_EXPORT extern const _DblBits -__rw_dbl_infinity = { _RWSTD_DBL_INF_BITS }; +_RWSTD_BITS_NAME(__rw_dbl_infinity) = { _RWSTD_DBL_INF_BITS }; _RWSTD_EXPORT extern const _FltBits -__rw_flt_infinity = { _RWSTD_FLT_INF_BITS }; +_RWSTD_BITS_NAME(__rw_flt_infinity) = { _RWSTD_FLT_INF_BITS }; # ifndef _RWSTD_NO_LONG_DOUBLE _RWSTD_EXPORT extern const _LDblBits -__rw_ldbl_infinity = { _RWSTD_LDBL_INF_BITS }; +_RWSTD_BITS_NAME(__rw_ldbl_infinity) = { _RWSTD_LDBL_INF_BITS }; - # endif // _RWSTD_NO_LONG_DOUBLE // quiet NaN computed at config time _RWSTD_EXPORT extern const _DblBits -__rw_dbl_qNaN = { _RWSTD_DBL_QNAN_BITS }; +_RWSTD_BITS_NAME(__rw_dbl_qNaN) = { _RWSTD_DBL_QNAN_BITS }; _RWSTD_EXPORT extern const _FltBits -__rw_flt_qNaN = { _RWSTD_FLT_QNAN_BITS }; +_RWSTD_BITS_NAME(__rw_flt_qNaN) = { _RWSTD_FLT_QNAN_BITS }; # ifndef _RWSTD_NO_LONG_DOUBLE _RWSTD_EXPORT extern const _LDblBits -__rw_ldbl_qNaN = { _RWSTD_LDBL_QNAN_BITS }; +_RWSTD_BITS_NAME(__rw_ldbl_qNaN) = { _RWSTD_LDBL_QNAN_BITS }; # endif // _RWSTD_NO_LONG_DOUBLE @@ -113,17 +120,17 @@ // signaling NaN computed at config time _RWSTD_EXPORT extern const _DblBits -__rw_dbl_sNaN = { _RWSTD_DBL_SNAN_BITS }; +_RWSTD_BITS_NAME(__rw_dbl_sNaN) = { _RWSTD_DBL_SNAN_BITS }; _RWSTD_EXPORT extern const _FltBits -__rw_flt_sNaN = { _RWSTD_FLT_SNAN_BITS }; +_RWSTD_BITS_NAME(__rw_flt_sNaN) = { _RWSTD_FLT_SNAN_BITS }; # ifndef _RWSTD_NO_LONG_DOUBLE _RWSTD_EXPORT extern const _LDblBits -__rw_ldbl_sNaN = { _RWSTD_LDBL_SNAN_BITS }; +_RWSTD_BITS_NAME(__rw_ldbl_sNaN) = { _RWSTD_LDBL_SNAN_BITS }; # endif // _RWSTD_NO_LONG_DOUBLE @@ -131,22 +138,70 @@ // denormalized minima computed at config time _RWSTD_EXPORT extern const _DblBits -__rw_dbl_denorm_min = { _RWSTD_DBL_DENORM_MIN_BITS }; +_RWSTD_BITS_NAME(__rw_dbl_denorm_min) = { _RWSTD_DBL_DENORM_MIN_BITS }; _RWSTD_EXPORT extern const _FltBits -__rw_flt_denorm_min = { _RWSTD_FLT_DENORM_MIN_BITS }; +_RWSTD_BITS_NAME(__rw_flt_denorm_min) = { _RWSTD_FLT_DENORM_MIN_BITS }; # ifndef _RWSTD_NO_LONG_DOUBLE _RWSTD_EXPORT extern const _LDblBits -__rw_ldbl_denorm_min = { _RWSTD_LDBL_DENORM_MIN_BITS }; +_RWSTD_BITS_NAME(__rw_ldbl_denorm_min) = { _RWSTD_LDBL_DENORM_MIN_BITS }; # endif // _RWSTD_NO_LONG_DOUBLE + +#ifdef _MSC_VER + +_RWSTD_EXPORT extern const float +__rw_flt_infinity = _RWSTD_BITS_NAME(__rw_flt_infinity)._C_val; + +_RWSTD_EXPORT extern const double +__rw_dbl_infinity = _RWSTD_BITS_NAME(__rw_dbl_infinity)._C_val; + +_RWSTD_EXPORT extern const float +__rw_flt_qNaN = _RWSTD_BITS_NAME(__rw_flt_qNaN)._C_val; + +_RWSTD_EXPORT extern const double +__rw_dbl_qNaN = _RWSTD_BITS_NAME(__rw_dbl_qNaN)._C_val; + +_RWSTD_EXPORT extern const float +__rw_flt_sNaN = _RWSTD_BITS_NAME(__rw_flt_sNaN)._C_val; + +_RWSTD_EXPORT extern const double +__rw_dbl_sNaN = _RWSTD_BITS_NAME(__rw_dbl_sNaN)._C_val; + +_RWSTD_EXPORT extern const float +__rw_flt_denorm_min = _RWSTD_BITS_NAME(__rw_flt_denorm_min)._C_val; + +_RWSTD_EXPORT extern const double +__rw_dbl_denorm_min = _RWSTD_BITS_NAME(__rw_dbl_denorm_min)._C_val; + + +# ifndef _RWSTD_NO_LONG_DOUBLE + +_RWSTD_EXPORT extern const long double +__rw_ldbl_infinity = _RWSTD_BITS_NAME(__rw_ldbl_infinity)._C_val; + +_RWSTD_EXPORT extern const long double +__rw_ldbl_qNaN = _RWSTD_BITS_NAME(__rw_ldbl_qNaN)._C_val; + +_RWSTD_EXPORT extern const long double +__rw_ldbl_sNaN = _RWSTD_BITS_NAME(__rw_ldbl_sNaN)._C_val; + +_RWSTD_EXPORT extern const long double +__rw_ldbl_denorm_min = _RWSTD_BITS_NAME(__rw_ldbl_denorm_min)._C_val; + +# endif // _RWSTD_NO_LONG_DOUBLE + +#endif // _MSC_VER + +#ifndef _MSC_VER } // extern "C" +#endif // _MSC_VER #else // if defined (_RWSTD_NO_INFINITY) Index: src/num_get.cpp =================================================================== --- src/num_get.cpp (revision 585687) +++ src/num_get.cpp (working copy) @@ -83,8 +83,9 @@ typedef unsigned char UChar; - +#ifndef _MSC_VER extern "C" { +#endif // _MSC_VER extern const float __rw_flt_infinity; extern const double __rw_dbl_infinity; @@ -95,7 +96,9 @@ #endif // _RWSTD_NO_LONG_DOUBLE +#ifndef _MSC_VER } // extern "C" +#endif // _MSC_VER const char*
